程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 理解C#中參數的值和引用以及傳遞結構和類引用的區別

理解C#中參數的值和引用以及傳遞結構和類引用的區別

編輯:關於C語言

值與引用參數之間的區別:
在 C# 中,既可以通過值也可以通過引用傳遞參數。在調用環境中通過引用傳遞參數允許函數成員(方法、屬性、索引器、運算符和構造函數)更改參數的值,並保持該更改。若要通過引用傳遞參數,請使用 ref 或 out 關鍵字。
下面的示例闡釋值與引用參數之間的區別:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 class Program { static void Main(string[] args) { int arg; // Passing by value. // The value of arg in Main is not changed. arg = 4; squareVal(arg); Console.WriteLine(arg); // Output: 4 // Passing by reference. // The value of arg in Main is changed. arg = 4; squareRef(ref arg); Console.WriteLine(arg); // Output: 16 } static void squareVal(int valParameter) { valParameter *= valParameter; } // Passing by reference static void squareRef(ref int refParameter) { refParameter *= refParameter; } }

向方法傳遞結構和向方法傳遞類引用之間的區別

下面的示例演示如何使用 結構 到方法與通過 類 實例不同傳遞給方法。在此示例中,兩個參數 (結構和類實例) 將值和兩個方法通過更改參數的一個字段的值。但是,這兩個方法的結果是不同的,因為的傳遞,當您通過時結構什麼不同通過,則可以通過類的實例。
由於結構是 值類型,那麼,當您對方法的 使用結構值 ,方法受到並對結構參數的副本。方法無法訪問原始結構中調用方法並不能將其更改任何方式。該方法可以僅更改副本。
類的實例是 引用類型,而不是值類型。當對方法的 引用類型通過值 ,方法進行引用的復制到類實例。即方法受到實例,而不是復制實例的地址的副本。在調用方法的類實例都有一個地址,在調用方法的參數的地址的副本,因此,兩個地址是否引用同一對象。由於該參數包含該地址的副本,調用方法不能更改類實例的地址在調用方法的。但是,調用方法可以使用該地址訪問原始地址和該副本引用的類成員。如果調用方法將類成員,在調用方法的原始類的實例也會發生更改。
下面的示例的輸出顯示差異。,因為該方法在參數中使用該地址查找類的實例,的指定字段調用將類實例的 willIChange 字段的值傳遞給方法 ClassTaker 。調用不更改結構的 willIChange 字段在調用方法為方法 StructTaker ,因為參數的值是結構的副本,而不是復制其地址。 StructTaker 更改該副本,因此,該副本丟失,在向 StructTaker 調用完成時。

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 class TheClass { public string willIChange; } struct TheStruct { public string willIChange; } class TestClassAndStruct { static void ClassTaker(TheClass c) { c.willIChange = "Changed"; } static void StructTaker(TheStruct s) { s.willIChange = "Changed"; } static void Main() { TheClass testClass = new TheClass(); TheStruct testStruct = new TheStruct(); testClass.willIChange = "Not Changed"; testStruct.willIChange = "Not Changed"; ClassTaker(testClass); StructTaker(testStruct); Console.WriteLine("Class fIEld = {0}", testClass.willIChange); Console.WriteLine("Struct fIEld = {0}", testStruct.willIChange); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } }

輸出:

? 1 2 Class fIEld = Changed Struct fIEld = Not Changed
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved