国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2019-10-29 21:33:14
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了理解C#中參數的值和引用以及傳遞結構和類引用的區別,文中舉了兩段代碼例子來簡單說明,需要的朋友可以參考下
 

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

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 調用完成時。

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();  }}

輸出:

  Class field = Changed  Struct field = Not Changed
 


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南澳县| 如东县| 西青区| 新丰县| 平利县| 鄂托克前旗| 宝兴县| 措勤县| 宁德市| 措美县| 南靖县| 东源县| 冀州市| 奉贤区| 淳安县| 长兴县| 页游| 乐业县| 凭祥市| 南昌市| 平安县| 黄山市| 金华市| 金堂县| 象山县| 青岛市| 易门县| 松阳县| 宝应县| 安溪县| 汝南县| 星座| 怀远县| 扎赉特旗| 柘城县| 辉县市| 香港| 梅河口市| 乌审旗| 清丰县| 金阳县|