基本介紹
- 中文名:ref
- 外文名:ref
- 用途:C#中關鍵字通過引用傳遞參數
- 引用方法:顯式使用
使用說明,示例,備註,
使用說明
若要使用ref參數,方法定義和調用方法均必須顯式使用ref關鍵字,如下面的示例所示。
class Program{ static void Method(ref int i) { i = i + 44; } static void Main() { int val = 1; Method(ref val); Console.WriteLine(val); // Output: 45 }}
傳遞到ref形參的實參必須先經過初始化,然後才能傳遞。 這與out形參不同,在傳遞之前,不需要顯式初始化該形參的實參。 有關詳細信息,請參閱 out。
類的成員不能具有僅在ref和out方面不同的簽名。 如果類型的兩個成員之間的唯一區別在於其中一個具有ref參數,而另一個具有out參數,則會發生編譯錯誤。 例如,以下代碼將不會編譯。
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參數,另一個方法具有值參數時,則可以完成重載,如下面的示例所示。
class RefOverloadExample{ public void SampleMethod(int i) { } public void SampleMethod(ref int i) { }}
在其他要求籤名匹配的情況下(如隱藏或重寫),ref和out是簽名的一部分,相互之間不匹配。
屬性不是變數。 它們是方法,不能傳遞到ref參數。
有關如何傳遞數組的信息,請參閱使用 ref 和 out傳遞數組。
你不能將ref和out關鍵字用於以下幾種方法:
- 異步方法,通過使用async修飾符定義。
- 疊代器方法,包括yield return或yield break語句。
示例
前面的示例演示當通過引用傳遞值類型時會發生什麼情況。 你還可以使用ref關鍵字傳遞引用類型。 通過引用傳遞引用類型可以使所調用方法將調用方法中的對象替換為引用參數所引用的對象。 對象的存儲位置按引用參數的值傳遞到方法。 如果更改參數存儲位置中的值(以指向新對象),你還可以將存儲位置更改為調用方所引用的位置。 下面的示例將引用類型的實例作為ref參數傳遞。
class RefExample2{ static void Main() { // Declare an instance of Product and display its initial values. Product item = new Product("Fasteners", 54321); System.Console.WriteLine("Original values in Main. Name: {0}, ID: {1}\n", item.ItemName, item.ItemID); // Pass the product instance to ChangeByReference. ChangeByReference(ref item); System.Console.WriteLine("Back in Main. Name: {0}, ID: {1}\n", item.ItemName, item.ItemID); } static void ChangeByReference(ref Product itemRef) { // Change the address that is stored in the itemRef parameter. itemRef = new Product("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; }}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
備註
不要混淆通過引用傳遞的概念與引用類型的概念。 這兩種概念是不同的。 無論方法參數是值類型還是引用類型,均可由ref修改。 當通過引用傳遞時,不會對值類型裝箱。