2010-05-29 57 views
4

我寫了一些關於ref -out聲明的代碼塊。我認爲裁判是最有用的。好。爲什麼我需要用掉。我可以每次總是使用參考:爲什麼必須使用「out」而不是ref?

namespace out_ref 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      sinifA sinif = new sinifA(); 
      int test = 100; 
      sinif.MethodA(out test); 
      Console.WriteLine(test.ToString()); 

      sinif.MethodB(ref test); 
      Console.WriteLine(test.ToString()); 
      Console.ReadKey(); 
     } 
    } 

    class sinifA 
    { 

     public void MethodA(out int a) 
     { 
      a = 200; 
     } 

     int _b; 
     public void MethodB(ref int b) 
     { 
      _b = b; 
      b = 2*b; 
     } 
    } 

} 

回答

13

是的,你可以每次使用ref,但他們有不同的目的。 ref用於參數既是輸入又是輸出。當參數僅爲輸出時使用out。它可以用來傳遞輸入,但是它使得函數的用戶在使用函數之前不需要聲明實例,因爲實際上你會保證創建實例。當您從集合中獲取值時,它在TryXXX模式中特別有用

+3

此外,一個出參數必須由需要它的函數初始化,否則你會得到編譯錯誤,這是一件好事。 – 2010-05-29 19:53:03

+0

調用者需要聲明變量,但不需要初始化它。 – TrueWill 2010-05-29 21:49:46

6

當您有一個連接了out的參數時,在將它傳遞給方法之前不需要對它進行初始化接受它。

The out keyword causes arguments to be passed by reference. 
This is like the ref keyword, except that ref requires that the variable be initialized 
before it is passed. 

來自:http://msdn.microsoft.com/en-us/library/ee332485.aspx

3

out參數是保證功能期間被初始化。這爲您的呼叫者提供了更嚴格的合同。它也允許你寫這樣的代碼:

int i; 
MyFunc(out i); 
.. < use i > .. 

沒有得到未初始化變量的編譯器錯誤。

0

Out參數

除了通過引用傳遞值,還可以指定一個給定的參數是一個出 參數通過使用out關鍵字,其被以相同的方式用作ref關鍵字(作爲函數定義和函數調用中的參數的修飾符 )。實際上,這幾乎給出了與參考參數幾乎相同的行爲 ,因爲 函數執行結束時的參數值返回給函數調用中使用的變量。但是,也有重要的 差異:

  1. 雖然是違法使用未分配的變量作爲ref參數,你可以使用一個 未賦值的變量作爲out參數
  2. out參數必須被視爲由使用它的函數取消賦值。

這意味着雖然允許在調用代碼時使用指定的變量作爲輸出參數,但當函數執行時,存儲在此變量中的值將丟失。

作爲示例,考慮對前面顯示的MaxValue()函數的擴展,該函數返回數組的最大值 。稍微修改該函數,以便獲取數組中最大值的元素 的索引。爲了簡單起見,當存在多個具有最大值的元素時,只需獲取該值的第一個 的索引。要做到這一點,則通過修改函數如下添加 out參數:

static int MaxValue(int[] intArray, out int maxIndex) 

{ INT MAXVAL = intArray [0]; maxIndex = 0;對於(int i = 1; i < intArray.Length; i ++) { if(intArray [i]> maxVal) { maxVal = intArray [i]; maxIndex = i; } } return maxVal; }

您可以使用此功能如下所示:

int[] myArray = {1, 8, 3, 6, 2, 5, 9, 3, 0, 2}; 

INT maxIndex; (「myArray中的最大值是{0}」, MaxValue(myArray,out maxIndex)); Console.WriteLine(「此值的第一次出現在元素{0}」處, maxIndex + 1);

這導致以下:

在myArray的最大值爲9

該值的第一次出現是在元件7

一個已被添加到該在屏幕上顯示時,此處返回的maxIndex值。這是 索引轉換爲一個更可讀的形式,以使陣列中的第一個元素被稱爲元件 1,而不是元素0

1

refout的處理相同的方式在內部,它們'都是通過引用傳遞一個變量。

區別在於初始化語義,誰負責確保變量具有有效的起始值,並且由編譯器執行。

使用out參數,這是您調用的方法。在調用方法之前,通過引用傳遞的變量中的值是無關緊要的。如果您調用的方法的執行路徑無法爲其參數設置新值,編譯器會發出抱怨。這意味着,在調用方法之前,變量中的任何值都將被覆蓋,即使它具有相同的值。

ref參數,這是調用的方法。變量的值將傳遞給被調用的方法,然後可以檢查其參數並可以選擇更改它。編譯器會在調用之前抱怨調用沒有使用值初始化變量的方法。

所以基本上,這完全取決於編譯器會抱怨什麼。它是調用代碼,必須確保變量中有值或者是調用代碼。

相關問題