簡體   English   中英

為什么必須使用“out”而不是ref?

[英]Why must use “out” instead of ref?

我寫了一些關於ref -out聲明的代碼塊。 我認為ref最有用。 好。 為什么我需要用完。 我每次都可以使用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;
        }
    }

}

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

當你有一個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

保證在函數期間初始化out參數。 這為您的呼叫者提供了更嚴格的合同。 它還允許您編寫如下代碼:

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

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

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

不同之處在於初始化語義,誰負責確保變量具有有效的起始值,並由編譯器強制執行。

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

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

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

輸出參數

除了通過引用傳遞值之外,您還可以使用out關鍵字指定給定參數是out參數,該關鍵字與ref關鍵字一樣使用(作為函數定義中參數的修飾符,並且函數調用)。 實際上,這給出了與引用參數幾乎完全相同的行為,因為函數執行結束時參數的值返回給函數調用中使用的變量。 但是,有一些重要的區別:

  1. 使用未分配的變量作為ref參數是非法的,您可以使用未分配的變量作為out參數
  2. out參數必須被使用它的函數視為未分配的值。

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

例如,考慮前面顯示的MaxValue()函數的擴展,它返回數組的最大值。 稍微修改函數,以便獲得具有數組內最大值的元素的索引。 為了簡單起見,當有多個具有最大值的元素時,只獲取該值第一次出現的索引。 為此,您可以通過修改函數來添加out參數,如下所示:

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

{int maxVal = intArray [0]; maxIndex = 0; for(int i = 1; i <intArray.Length; i ++){if(intArray [i]> maxVal){maxVal = intArray [i]; maxIndex = i; 返回maxVal; }

您可以使用此函數,如下所示:

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

int maxIndex; Console.WriteLine(“myArray中的最大值為{0}”,MaxValue(myArray,out maxIndex)); Console.WriteLine(“此值的第一個出現位於元素{0}”,maxIndex + 1);

這導致以下結果:

myArray中的最大值為9

該值的第一次出現在元素7處

當屏幕上顯示maxIndex時,會添加一個值。 這是為了將索引轉換為更易讀的形式,因此數組中的第一個元素稱為元素1,而不是元素0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM