CLR VIA
| ?標題 | ?狀態 | ?內容 |
| 什么是CLR? 什么是托管模塊? 托管模塊由什么組成? 。net代碼的執行過程 | ? | ?http://www.cnblogs.com/aaa6818162/p/4726581.html ? http://www.cnblogs.com/kingmoon/archive/2012/07/16/2594459.html ? ? ? 為了執行程序,首先必須把它的IL轉換成本地CPU指令 ? 第二次調用WriteLine的情況 |
| PE文件 | ? | http://lwglucky.blog.51cto.com/1228348/283812/ |
| ?元數據的 | ? | ?http://www.cnblogs.com/bluewater/archive/2006/10/17/531639.html 元數據的邏輯結構類似于數據庫中的表,所以被稱為元數據表。元數據表有列和行,每一行都是不重復的,都有唯一的RID(表索引),RID就像是數據庫表的主建。數據庫有Schema,如每一列的類型,大小等,元數據也有類似的東西,他們被稱為“元-元數據”,包含表中記錄的大小,列的大小,偏移等。 |
? .Net 托管模塊與程序集的關系 | ? | ?http://blog.csdn.net/kmguo/article/details/17055065 |
| ? | ? | ? |
? .NET概念:.NET程序編譯和運行 | ? | ?http://blog.csdn.net/yysyangyangyangshan/article/details/7306346 應用程序域(AppDomain)??梢岳斫獬珊芏鄳贸绦蛴蚨伎梢赃\行在同一個.NET的進程中,可以降低系統消耗,同時不同的域之間互相隔離,在安全性方面有保障。另外對于同一個進程內不同域之間的通信也相對簡單一點 |
| ? | ? | ?
public static void Main() { Int32 v = 5; // 創建值變量 Object o = v; // 裝箱 v = 123; // Changes the unboxed value to 123 Console.WriteLine(v + ", " + (Int32) o); // Displays "123, 5" ,裝箱兩次 } |
| ?驗證四種判等方式 | ? | ? ①Object的靜態方法ReferenceEquals: ? 只適用于判斷兩個引用是否指向同一個實例,不適用于值類型(或者說用于值類型是沒意義的,因為永遠返回false)。如下: ? ? TestEqual?te?=?new?TestEqual(); bool?b1=?object.ReferenceEquals(te,te); bool?b2?=?object.ReferenceEquals(1,?1); ?? b1為true,b2為false。b2為false的原因是兩個整型值1裝箱之后是兩個不同的Object實例。 ? ? ②Object中定義的實例級虛方法Equals: ? ? 其默認行為是判斷引用是否相等,引用類型從Object中繼承了這一行為,如下: ? ???TestEqual?te1=?new?TestEqual(); ???TestEqual?te2?=?new?TestEqual(); ???bool?b4=?te1.Equals(te2); ???bool?b5?=?te1.Equals(te1); ???Console.WriteLine(b4); ???Console.WriteLine(b5); ? ? 輸出結果很明顯第一個假,第二個真。 ? 但是對于值類型來說,由于ValueType重寫了這個方法,所以其行為不同,可以判斷值是否相同,而不是引用。 ? ? 如下: ? ? ?????int?num1?=?15; ?????int?num2?=?15; ?????bool?b3?=?num1.Equals(num2); ??Console.WriteLine(b3); ? 雖然num1和num2是兩個變量,但是只要它們的值一樣,b3結果就為true。 ? ? ③?=?=運算符: ? ? 應用于值類型的時候其行為是判斷值是否相等。應用于引用類型(String除外)的時候判斷引用是否相同。 ? ? ④Object中的靜態方法Equals: ? ? 它接受兩個Object類型的參數,它會調用第一個參數的實例級Equals方法,以第二個參數作為該方法的參數來進行判等。所以其行為表現出來和實例級的Equals方法一樣。只是其內部添加了對于兩個參加判等的參數是否本身已經是同一個引用的判斷,還有兩個參數是否為null的判斷。 |
| ?常量const | ? | http://www.cnblogs.com/janes/archive/2011/07/11/2103215.html? 常量是恒定不變的,在編譯時就確定了它的值,編譯后直接將值存到元數據中。變量類型只能是編譯器能直接識別的基元類型,不能是引用類型,因為引用類型需要在運行時調用構造函數進行初始化。 通過ILDasm工具查看一下,const變量編譯后為static literal類型,所以不難理解,常量是針對類的一部分,而不是實例的一部分 |
| ?只讀字段readonly | ? | ?類的數據成員通常用來保存一個值類型的實例或者指向引用類型的引用,CLR支持讀寫和只讀兩種數據成員,其中只讀數據成員使用readonly修飾的 |
| ? | ? | ?其實很簡單,C#中方法中的參數也是一個變量,這個變量也需要有一個地址。 對于引用類型的方法參數,傳入的對象如果不加Ref,方法參數也就是這個變量也將被創建,不過因為是引用類型,所以地址直接指向所傳入對象的地址。所以實際上是有兩個變量,但都指向了同一處地址。 如果加了Ref,那么方法參數這個變量,將不被創建,也就是只有一個變量,指向了一處地址。 引用類型加不加Ref沒有本質區別,只是多個了變量而已。 |
? string/String類型作為參數是傳值還是傳址_AX | ? | ?class Program ? ? string在.net中是個特殊的對象,當把一個string傳給一個方法時其實是做了一個“s=s”的操作,如果是其它對象,當然是前者得到后者的一個地址引用,而string對象每做一次賦值操作,被賦值的string都會重開一個內存空間將后者的值復制過來,所以才有了你的結果。? string類是引用類型,在賦值時是傳址的。但如果用作函數參數的話系統會自動復制一個string類進行運算,因為函數默認是按值傳遞的。如果函數要傳址,請在函數定義時,在參數前加上ref,在使用時也加上ref就可以了。{ |
| ?C#友元程序集 | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
總結
- 上一篇: 每天一道算法题(39)——含有重复字符的
- 下一篇: Java中发邮件的6种方法