C#高效编程话题集1(每期10话题)
生活随笔
收集整理的這篇文章主要介紹了
C#高效编程话题集1(每期10话题)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
C#高效編程話題集1(每期10話題)
2011-03-02 09:02 by 陸敏技, 3364 visits,?網(wǎng)摘,?收藏,?編輯 近來(lái)在小組C#快速成長(zhǎng)團(tuán)隊(duì)?討論了若干話題,有些感覺(jué)不錯(cuò),特總結(jié)與大家分享。 當(dāng)然,所謂話題,重點(diǎn)在于進(jìn)行討論,是否是最佳實(shí)踐也屬于大家的個(gè)人之見(jiàn)。以下觀點(diǎn)若有差錯(cuò),盡情蹂躪。 1:String str1 = “str1”+ 9; 和String str2 = “str2”+ 9.ToString(); 哪個(gè)效率高 可以知道“str1”+ 9,在運(yùn)行時(shí)會(huì)完成一次裝箱行為。9.ToString(),沒(méi)有發(fā)生裝箱行為,Int類型的ToString()方法的實(shí)際原型為:public override String ToString() {
return Number.FormatInt32(m_value, null, NumberFormatInfo.CurrentInfo);
} 可能有人會(huì)問(wèn),那是不是原型中的Number.FormatInt32方法會(huì)發(fā)生裝箱行為呢?實(shí)際Number.FormatInt32方法是一個(gè)非托管的方法,原型如下:
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
public static extern string FormatInt32(int value, string format, NumberFormatInfo info); 它通過(guò)直接操作內(nèi)存來(lái)進(jìn)行int到string的轉(zhuǎn)換,效率要比裝箱高很多。
所以,答案是:后者 裝箱為什么會(huì)帶來(lái)性能損耗,因?yàn)樗鼉?nèi)部發(fā)生了太多事情: 1:首先,為值類型在托管堆中分配內(nèi)存。內(nèi)存總量除了值類型本身所分配的內(nèi)存外,還要加上類型對(duì)象指針和同步塊索引; 2:值類型的值復(fù)制到新分配的堆內(nèi)存; 3:返回已經(jīng)成為引用類型的對(duì)象的地址;
2:as,is轉(zhuǎn)型比強(qiáng)制轉(zhuǎn)型的優(yōu)勢(shì)
優(yōu)勢(shì)在于as,is 不拋出異常,如果轉(zhuǎn)型失敗,則返回null
強(qiáng)制轉(zhuǎn)型則會(huì)拋出異常,導(dǎo)致代碼必須處理異常,效率低。
值得注意的是,as只能轉(zhuǎn)型基本類型,對(duì)于基本類別如int等的轉(zhuǎn)型,只能使用強(qiáng)制轉(zhuǎn)型或is。
3:readonly和const的區(qū)別或者說(shuō)哪個(gè)更好
2:const只能修飾基元類型;readonly無(wú)此限制;
3:const是編譯期常量;readonly為運(yùn)行期常量,其初始值除了在初始化器還可以在類型的構(gòu)造函數(shù)中設(shè)定;
4:const經(jīng)編譯后,以實(shí)際值代替了變量(可查看IL驗(yàn)證),效率顯然要高一些,可用到關(guān)鍵算法中,除此之外,與readonly比沒(méi)有任何優(yōu)勢(shì)。
4:初始化器和構(gòu)造器的異同 初始化器實(shí)際是語(yǔ)法糖,經(jīng)編譯后,它在構(gòu)造函數(shù)的最開始執(zhí)行。也就是說(shuō),初始化器可以理解為構(gòu)造函數(shù)的一部分。
5:枚舉在使用中的注意事項(xiàng)
1:如果不指定枚舉的零值,會(huì)帶來(lái)什么問(wèn)題;
static Week week;static void Main(string[] args)
{
Console.WriteLine(week);
}
即使未給week賦值,也會(huì)打印出零值。
2:如果為枚舉中的元素指定了相同的值,又會(huì)帶來(lái)什么問(wèn)題。
會(huì)導(dǎo)致相等型比較的時(shí)候出現(xiàn)與預(yù)期不符的結(jié)果 3:建議不給枚舉顯式指定值,但是如果枚舉用于位運(yùn)算則要為其元素指定2的指數(shù)冪值。6:為什么LINQ語(yǔ)句都要開始于from而不是select 顯而易見(jiàn)的原因是為了智能感知,要讓他在輸入LINQ查詢的時(shí)候起作用,from子句就必須在最前面;如:
var AllCustomers = from Customer in db.Customers?
select new { Customer.ContactName, Customer.Country };?
7:dynamic可以用它來(lái)簡(jiǎn)化反射。 使用反射,調(diào)用方代碼:
DynamicSample dynamicSample = new DynamicSample();
var addMethod = typeof(DynamicSample).GetMethod("Add");
int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });
在使用dynamic后,我們的代碼看上去更簡(jiǎn)潔了,并且在可控的范圍內(nèi)減少了一次拆箱的機(jī)會(huì):
dynamic dynamicSample2 = new DynamicSample();
int re2 = dynamicSample2.Add(1, 2);
8:foreach不能替代for的原因 1: 首先,對(duì)集合的每次增刪操作(是不是全部集合?不得而知,但是起碼是絕大部分集合),都會(huì)讓集合的version字段+1,foreach采用的是迭代器模式,每次迭代的時(shí)候都要判斷version是不是保持一致,如果不一致,則拋出異常。而for沒(méi)有這方面的限制。所以,采用
List<int> list = new List<int>() { 0, 1, 2, 3 };
foreach (int item in list)
{
list.Remove(item);
Console.WriteLine(item.ToString());
}
會(huì)拋出異常,而改為for則不會(huì)。這是for不能被foreach取代叼的最重要原因。
2:foreach默認(rèn)調(diào)用集合的迭代器的Dispose方法,如果該迭代器繼承了IDispose方法的話。
9:區(qū)別IComparable<T>和IComparer<T> 前者IComparable<T>為類提供默認(rèn)的比較器,而IComparer<T>可以為集合類提供更多的比較器。具體查看http://www.cnblogs.com/luminji/archive/2010/09/30/1839038.html 10:LINQ和比較器及迭代器優(yōu)缺點(diǎn)比較 要進(jìn)行排序和比較,傳統(tǒng)的方式,存在兩個(gè)問(wèn)題:
1:可擴(kuò)展性太低,如果存在新的排序要求,就得實(shí)現(xiàn)新的比較器;
2:對(duì)代碼的侵入性太高,為類型繼承了接口,增加了新的方法;
可參見(jiàn)博文的討論:http://www.cnblogs.com/luminji/archive/2011/02/17/1956723.html。
在我們自己的代碼中強(qiáng)烈建議你利用LINQ帶來(lái)便捷性,但我們?nèi)孕枵莆毡容^器、迭代器、索引器的原理,以便我們更好地理解LINQ的思想,寫出更加高質(zhì)量的代碼。
總結(jié)
以上是生活随笔為你收集整理的C#高效编程话题集1(每期10话题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 爱情说说大全幸福精选174个
- 下一篇: 好听的狗名,最火的狗名字506个