2010-03-31 55 views
0

在C++中,我有一個函數:改變在C#中的實際參數

void MyFunction(int p) 
{ 
    p=5; 
} 

假設,我有:

int x = 10; 
MyFunction(x); // x = 10 
MyFunction(&x); // x = 5 

如何在C#與條件archieve這樣的:我只能創建一個MyFunction的。

+1

這不像你用C++描述的那樣工作... – 2010-03-31 05:11:02

回答

3

您的C++函數無法按照您認爲的方式工作。事實上,你的代碼不會被編譯。

在C#中,你可以使用refout關鍵字:

void MyFunction1(out int p) 
{ 
    p = 5; 
} 

void MyFunction2(ref int p) 
{ 
    p = p + 1; 
} 

int x; 
MyFunction1(out x); // x == 5 
MyFunction2(ref x); // x == 6 
1

C#不具備這種功能。如果您聲明方法具有ref參數,則在調用方法時還必須指定該參數爲ref類型。

2

在C#中,你需要用ref參數申報方法,像這樣:

void MyFunction(ref int p) 
{ 
    p=5; 
} 

如果再稱其爲MyFunction(ref x) X在調用方的值將被修改。如果你不希望它被修改,只需將其複製到一個虛擬變量。你可以創建一個具有這種內部的MyFunction的過載:

void MyFunction(int p) 
{ 
    MyFunction(ref p); 
} 

這在技術上不是「一個功能」,只要你想,但代碼不會被複制和任何人閱讀你的代碼它會顯示爲一個 - 但編譯器是兩個。你會打電話給他們這樣的:

int x = 10; 
MyFunction(x); // x = 10 
MyFunction(ref x); // x = 5 
0

你需要傳遞參數作爲參考。如果不指定它,它會自動創建一個副本以在參數內部工作,而不是使用相同的參考。

如何做到這一點?只是在方法聲明中的「裁判」字註明:

void MyFunction(ref int p) 
{ 
    p=5; 
} 

int x = 10; 
MyFunction(ref x); // x = 5 
0

的一點是,很多人認爲,引用類型按引用傳遞和值類型傳遞按值。從用戶的角度來看,情況就是這樣,內部的引用和值類型都是按值傳遞的。 當引用類型作爲參數傳遞時,它的值(它是對實際對象的引用)將被傳遞。在值類型的情況下,它們的值是其本身的值(例如5)。

StringBuilder sb = new StringBuilder(); 
SetNull(sb); 
SetNull(ref sb); 

如果SETNULL(...)設置爲空的參數,那麼第二個調用設置傳遞StringBuilder的參數設置爲null。