(掃盲)C#中out和ref之間的區別

首先:二者都是按地址傳遞的,使用後都將改變原來參數的數值。函數

其次:ref能夠把參數的數值傳遞進函數,可是out是要把參數清空,就是說你沒法把一個數值從out傳遞進去的,out進去後,參數的數值爲空,因此你必須初始化一次。這個就是兩個的區別,或者說就像有的網友說的,ref是有進有出,out是隻出不進。spa

ref(C# 參考)指針

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

例如:blog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 不一樣,後者的參數在傳遞以前不須要顯式初始化。ci

儘管 ref 和 out 在運行時的處理方式不一樣,但在編譯時的處理方式相同。所以,若是一個方法採用 ref 參數,而另外一個方法採用 out 參數,則沒法重載這兩個方法。例如,從編譯的角度來看,如下代碼中的兩個方法是徹底相同的,所以將不會編譯如下代碼:編譯

1
2
3
4
5
6
7
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 參數,而另外一個方法不採用這兩個參數,則能夠進行重載,以下例所示:table

1
2
3
4
5
class  RefOutOverloadExample
{
     public  void  SampleMethod( int  i) { }
     public  void  SampleMethod( ref  int  i) { }
}

 

out(C# 參考)class

out 關鍵字會致使參數經過引用來傳遞。這與 ref 關鍵字相似,不一樣之處在於 ref 要求變量必須在傳遞以前進行初始化。若要使用 out 參數,方法定義和調用方法都必須顯式使用out 關鍵字。變量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 參數,則沒法重載這兩個方法。例如,從編譯的角度來看,如下代碼中的兩個方法是徹底相同的,所以將不會編譯如下代碼:

1
2
3
4
5
6
7
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 參數,而另外一個方法不採用這兩類參數,則能夠進行重載,以下所示:

1
2
3
4
5
class  RefOutOverloadExample
{
     public  void  SampleMethod( int  i) { }
     public  void  SampleMethod( out  int  i) { }
}

 

下面是本人的一些心得:

區別:

ref和out的區別在C# 中,既能夠經過值也能夠經過引用傳遞參數。經過引用傳遞參數容許函數成員更改參數的值,並保持該更改。若要經過引用傳遞參數, 可以使用ref或out關鍵字。ref和out這兩個關鍵字都可以提供類似的功效,其做用也很像C中的指針變量。它們的區別是:

一、使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。

二、使用ref和out時,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以知足匹配。

三、out適合用在須要retrun多個返回值的地方,而ref則用在須要被調用的方法修改調用者的引用的時候。

out

方法參數上的 out 方法參數關鍵字使方法引用傳遞到方法的同一個變量。當控制傳遞迴調用方法時,在方法中對參數所作的任何更改都將反映在該變量中。

當但願方法返回多個值時,聲明 out 方法很是有用。使用 out 參數的方法仍然能夠返回一個值。一個方法能夠有一個以上的 out 參數。

若要使用 out 參數,必須將參數做爲 out 參數顯式傳遞到方法。out 參數的值不會傳遞到 out 參數。

沒必要初始化做爲 out 參數傳遞的變量。然而,必須在方法返回以前爲 out 參數賦值。

屬性不是變量,不能做爲 out 參數傳遞。

相關文章
相關標籤/搜索