相同點:方法的定義和調用都必須顯示使用ref、out關鍵字。都會致使參數按引用傳遞。web
不一樣點:傳遞給ref關鍵字的參數必須賦初始值,而out不用。out關鍵字會清空變量,即便變量已經賦值也不行,退出函數時全部out引用個變量都要賦值。app
說明:ref的應用場景是內部對外部的值進行改變,而out則是內部對外部變量賦值。out通常用在函數有多個返回值。ide
儘管 ref 和 out 在運行時的處理方式不一樣,但在編譯時的處理方式相同。所以,若是一個方法採用 ref 參數,而另外一個方法採用 out 參數,則沒法重載這兩個方法。例如,從編譯的角度來看,如下代碼中的兩個方法是徹底相同的,所以將不會編譯如下代碼:函數
class CS0663_Exampleoop
{this
// Compiler error CS0663: "cannot define overloadedurl
// methods that differ only on ref and out".spa
public void SampleMethod(ref int i) { }.net
public void SampleMethod(out int i) { }orm
}
可是,若是一個方法採用 ref 或 out 參數,而另外一個方法不採用這兩個參數,則能夠進行重載,以下例所示:
class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
須要指出的是:
一、當咱們頻繁傳遞大型參數的時候,好比說DataTable、DataSet...的時候,會節省好多內存資源。
二、當咱們想獲得方法多樣化的處理結果的時候,而咱們又不肯意複雜化方法所返回的結果,那麼咱們能夠在方法裏定義多個ref 或者 out,以期獲得豐富的結果。好比說,咱們調用一個方法,要同時獲得string、int、double、bool、Array...等幾種不一樣類型的結果,而return返回object又很複雜的時候,ref 和out的處理效果,看上去將會是多麼的賞心悅目...
此文章出處: