CLR VIA string/String類型做爲參數是傳值仍是傳址_AX

 標題  狀態  內容

什麼是CLR?html

什麼是託管模塊?數據庫

託管模塊由什麼組成?安全

。net代碼的執行過程函數

 

 http://www.cnblogs.com/aaa6818162/p/4726581.html工具

 

http://www.cnblogs.com/kingmoon/archive/2012/07/16/2594459.htmlpost

 

image

 

 

爲了執行程序,首先必須把它的IL轉換成本地CPU指令this

 

第二次調用WriteLine的狀況url

PE文件   http://lwglucky.blog.51cto.com/1228348/283812/
 元數據的    http://www.cnblogs.com/bluewater/archive/2006/10/17/531639.html

元數據的邏輯結構相似於數據庫中的表,因此被稱爲元數據表。元數據表有列和行,每一行都是不重複的,都有惟一的RID(表索引),RID就像是數據庫表的主建。數據庫有Schema,如每一列的類型,大小等,元數據也有相似的東西,他們被稱爲「元-元數據」,包含表中記錄的大小,列的大小,偏移等。spa

 

.Net 託管模塊與程序集的關係

   http://blog.csdn.net/kmguo/article/details/17055065
     
 

.NET概念:.NET程序編譯和運行

 

 http://blog.csdn.net/yysyangyangyangshan/article/details/7306346.net

應用程序域(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);

  

b1trueb2falseb2false的緣由是兩個整型值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);

 

雖然num1num2是兩個變量,可是隻要它們的值同樣,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
    {
        static void Swap(string a, string b)
{
            string c = a;
            a = b;
            b = c;
        }
       
        static void Main(string[] args)
        {
            string str1 = "Jenny";
            string str2 = "Benny";


            Swap(str1, str2);

            Console.WriteLine(str1);
            Console.WriteLine(str2);
            Console.Read();

        }
    }

 

 

string在.net中是個特殊的對象,當把一個string傳給一個方法時實際上是作了一個「s=s」的操做,若是是其它對象,固然是前者獲得後者的一個地址引用,而string對象每作一次賦值操做,被賦值的string都會重開一個內存空間將後者的值複製過來,因此纔有了你的結果。
 

 

string類是引用類型,在賦值時是傳址的。但若是用做函數參數的話系統會自動複製一個string類進行運算,由於函數默認是按值傳遞的。若是函數要傳址,請在函數定義時,在參數前加上ref,在使用時也加上ref就能夠了。

 C#友元程序集
相關文章
相關標籤/搜索