看上去屬性和字段差不多,可是屬性本質(zhì)上是個(gè)方法,并不是真正指向一個(gè)內(nèi)存位置,所以不能像字段那樣能以ref或out方式傳遞。
比較"Age = " + 3.ToString()和"Age = " + 3,前者要比後者高效,因爲(wèi)後者默認(rèn)會(huì)裝箱。所以值類型涉及字符串操作時(shí),應(yīng)該總是使用ToString方法
const double number = 1.618033988749895; string text = string.Format("{0}", number); double result = double.Parse(text); bool same = result == number; text = string.Format("{0:R}", number); result = double.Parse(text); same = result == number;前一個(gè)same爲(wèi)false,后一個(gè)爲(wèi)true
衹有接口和委托才能聲明這兩個(gè)特性,汎型類是不支持的(出於類型安全的考慮)。
協(xié)變用out來修飾,針對的是返回值,潛臺(tái)詞是:如果能返回父類,自然也能返回子類。
// Covariance.
IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;
逆變用in來修飾,針對的是參數(shù),潛臺(tái)詞是:如果能傳入父類,自然也能傳入子類。
// Contravariant.
IComparer<object> objects = objectComparer;
IComparer<string> strings = objects;
這樣是爲(wèi)了防止匿名對象的HashCode發(fā)生改變
如:dynamic d = 1; int i = d;
編譯器認(rèn)爲(wèi)dynamic上的任何操作都是合法的
這也是爲(wèi)什麼值類型不允許字段內(nèi)聯(lián)初始化的原因,因爲(wèi)值類型不允許無參構(gòu)造函數(shù)
struct MyStruct { static MyStruct() {//不會(huì)被調(diào)用 Console.WriteLine("MyStruct"); } public int X; } MyStruct[] array = new MyStruct[2]; array[0].X = 2;
捕獲變量是從變量聲明就開始了,而捕獲的值是看調(diào)用委托時(shí)該變量是什麼值 var list = new List<Action>(); for (int i = 0; i < 5; i++) { int cnt = i * 10; list.Add(delegate { Console.WriteLine(cnt); cnt++; }); }
list[0](); list[0](); list[1](); 有5次循環(huán),cnt被聲明了5次,實(shí)際上就是有5個(gè)不同的捕獲變量,所以各個(gè)委托有各自獨(dú)立的捕獲值,輸出結(jié)果是0,1,10
但如果把變量聲明放在循環(huán)外,隻聲明一次: int cnt; for (int i = 0; i < 5; i++) { cnt = i * 10; 那麼這些委托就共享同一個(gè)捕獲變量,而當(dāng)委托方法調(diào)用時(shí),由於cnt已經(jīng)被循環(huán)了5次,成爲(wèi)40,所以輸出結(jié)果是40,41,42
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注