2013-10-03 36 views
0

我已經定義了一個函數,其中一個參數是out。在這裏,當函數調用完成時,我傳遞一個初始化或未初始化的參數。 現在,在初始化參數的情況下,如何讓被調用者不改變out參數的值?函數調用的外部參數應該保持初始化值

我不能在這裏使用ref,因爲有時候我會發送未初始化的參數。 例如:

void fun1() 
{ 

    int x = 3; 
    fun2 (out x); 
    int y; 
    fun2(out y); 

} 

void fun2(out int x) 
{ 

    ... 

} 

在這裏,我不想一次控制轉到FUN2的X失去了價值3。

+0

如果你放一些代碼來顯示你正在做什麼,它會幫助我們想象如何幫助你。 – Guga

+0

這很難理解你想達到的目標。 「out」意味着初始化(和值)是被調用方法的責任。你要求完全相反。 – Tormod

+0

在上面的例子中,我只想確保如果out參數在fun2調用之前已經在fun1中初始化,那麼它應該保持該值不變,否則它可以在fun2中初始化參數。 但是,因爲它已經出來了,fun2必須爲參數分配一個值,因爲在第一次調用時,值3會丟失。\ –

回答

3

out C# - MSDN

雖然爲out參數傳遞的變量沒有被傳遞之前被初始化,需要調用的方法,以該方法返回之前分配一個值。

由於必須將值分配給參數out,因此無法將該值保存在函數中。如果您在調用函數之前創建變量的副本會更好。像:

int x = 1; 
int backupX = x; 
fun2(out x); 
+0

這聽起來沒錯。謝謝。這使我想到我的下一個問題。 ref有什麼區別?並出去。 –

+0

@TylerDurden,看到這個問題。它有非常詳細的答案看到這個問題:http://stackoverflow.com/questions/1516876/when-to-use-ref-vs-out – Habib

+0

我以前見過這個問題,但它不能解釋可空引用和出 –

0

也許我得到的所有錯誤的,但是這聽起來像你只是想這樣定義

void caller(){ 
int x=5; 
int y = doSomething(x); 
} 

int doSomething(int x){ 
return x+1; 
} 

或者如果你想有一個空狀態使用方法:

void caller(){ 
int? x=5; 
int y = doSomething(x); 
} 

int doSomething(int? x){ 
if (x == null) 
    return x; 
return x+1; 
} 
+0

只有存在一個參數時纔可以。如果還有更多?這就是爲什麼我使用ref/out和使函數返回類型爲void –

+0

定義類和在這種情況下使用對象 –