c# ref out 區別 比較 彙總
阿新 • • 發佈:2019-02-14
class RefExample2 { static void ChangeByReference(ref Product itemRef) { // The following line changes the address that is stored in // parameter itemRef. Because itemRef is a ref parameter, the // address that is stored in variable item in Main also is changed. itemRef = newProduct("Stapler", 99999); // You can change the value of one of the properties of // itemRef. The change happens to item in Main as well. itemRef.ItemID = 12345; } static void Main() { // Declare an instance of Product and display its initial values. Product item = newProduct("Fasteners", 54321); System.Console.WriteLine("Original values in Main. Name: {0}, ID: {1}\n", item.ItemName, item.ItemID); // Send item to ChangeByReference as a ref argument. ChangeByReference(ref item); System.Console.WriteLine("Back in Main. Name: {0}, ID: {1}\n", item.ItemName, item.ItemID); } } class Product { public Product(string name, int newID) { ItemName = name; ItemID = newID; } public string ItemName { get; set; } public int ItemID { get; set; } } // Output: //Original values in Main. Name: Fasteners, ID: 54321 //Back in Main. Name: Stapler, ID: 12345
out(C# 參考)
你可以在兩個上下文(每個都是指向詳細資訊的連結)中使用 out 上下文關鍵字作為引數修飾符,或在介面和委託中使用泛型型別引數宣告。本主題討論引數修飾符,但你可以參閱其他主題瞭解關於泛型型別引數宣告的資訊。
out 關鍵字通過引用傳遞引數。這與 ref 關鍵字相似,只不過 ref 要求在傳遞之前初始化變數。若要使用 out 引數,方法定義和呼叫方法均必須顯式使用 out 關鍵字。例如:
C#class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } }
儘管作為 out 引數傳遞的變數無需在傳遞之前初始化,呼叫方法仍要求在方法返回之前賦值。
儘管 ref 和 out 關鍵字會導致不同的執行時行為,它們並不被視為編譯時方法簽名的一部分。因此,如果唯一的不同是一個方法採用 ref 引數,而另一個方法採用 out 引數,則無法過載這兩個方法。例如,以下程式碼將不會編譯:
C#class CS0663_Example { // Compiler error CS0663: "Cannot define overloaded // methods that differ only on ref and out". public void SampleMethod(out int i) { } public void SampleMethod(ref int i) { } }
但是,如果一個方法採用 ref 或 out 引數,而另一個方法採用其他引數,則可以完成過載,如:
C#class OutOverloadExample { public void SampleMethod(int i) { } public void SampleMethod(out int i) { i = 5; } }
屬性不是變數,因此不能作為 out 引數傳遞。
你不能將 ref 和 out 關鍵字用於以下幾種方法:
非同步方法,通過使用 async 修飾符定義。
迭代器方法,包括 yield return 或 yield break 語句。
如果希望方法返回多個值,可以宣告 out 方法。下面的示例使用 out 返回具有單個方法呼叫的三個變數。注意,第三個引數賦 null 值。這使得方法可以有選擇地返回值。
C#class OutReturnExample { static void Method(out int i, out string s1, out string s2) { i = 44; s1 = "I've been returned"; s2 = null; } static void Main() { int value; string str1, str2; Method(out value, out str1, out str2); // value is now 44 // str1 is now "I've been returned" // str2 is (still) null; } } 參閱: https://msdn.microsoft.com/zh-cn/library/t3c3bfhx.aspx https://msdn.microsoft.com/zh-cn/library/14akc2c7.aspx