1. 程式人生 > 其它 >C#中的ref,out區別,理論總結和程式碼例項(夯實基礎)

C#中的ref,out區別,理論總結和程式碼例項(夯實基礎)

技術標籤:c#

本質是將按地址傳遞,都將改變原來的值,ref把引數值傳進來,可以做它用,修改再傳出來,強調的是修改一個值,而out則不能傳入引數的值,因為它會清空引數的值,因此也不需要初始化,強調返回輸出一個值,

涉及ref宣告的引數方法,方法呼叫前傳入引數的變數初始化,ref更多用於被呼叫者修改呼叫方,out則是返回多個值,因為可以寫多個out引數,無論是out或是ref在宣告方法中,還是呼叫方法中都是需要對應關鍵字,且不能同時過載

ref(C#參考)

ref關鍵字使引數按引用傳遞。其效果是,當控制權傳遞迴呼叫方法時,在方法中對引數的任何更改都將反映在該變數中。若要使用ref引數,則方法定義和呼叫方法都必須顯式使用ref關鍵字。

例如:

class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }

    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

傳遞到ref引數的引數必須最先初始化。這與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(ref int i) { }
    public void SampleMethod(out int i) { }
}

但是,如果一個方法採用ref或out引數,而另一個方法不採用這兩個引數,則可以進行過載,如下例所示:

class RefOutOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(ref int i) { }
} 

out(C#參考)

out關鍵字會導致引數通過引用來傳遞。這與ref關鍵字類似,不同之處在於ref要求變數必須在傳遞之前進行初始化。若要使用out引數,方法定義和呼叫方法都必須顯式使用out關鍵字。

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引數,則無法過載這兩個方法。例如,從編譯的角度來看,以下程式碼中的兩個方法是完全相同的,因此將不會編譯以下程式碼:

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 RefOutOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(out int i) { }
}為了偷懶主要參考如下:

https://www.cnblogs.com/sunliyuan/p/5999045.html