在C++中,我有一個函數:改變在C#中的實際參數
void MyFunction(int p)
{
p=5;
}
假設,我有:
int x = 10;
MyFunction(x); // x = 10
MyFunction(&x); // x = 5
如何在C#與條件archieve這樣的:我只能創建一個MyFunction的。
在C++中,我有一個函數:改變在C#中的實際參數
void MyFunction(int p)
{
p=5;
}
假設,我有:
int x = 10;
MyFunction(x); // x = 10
MyFunction(&x); // x = 5
如何在C#與條件archieve這樣的:我只能創建一個MyFunction的。
您的C++函數無法按照您認爲的方式工作。事實上,你的代碼不會被編譯。
在C#中,你可以使用ref
或out
關鍵字:
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
C#不具備這種功能。如果您聲明方法具有ref參數,則在調用方法時還必須指定該參數爲ref類型。
在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
你需要傳遞參數作爲參考。如果不指定它,它會自動創建一個副本以在參數內部工作,而不是使用相同的參考。
如何做到這一點?只是在方法聲明中的「裁判」字註明:
void MyFunction(ref int p)
{
p=5;
}
int x = 10;
MyFunction(ref x); // x = 5
的一點是,很多人認爲,引用類型按引用傳遞和值類型傳遞按值。從用戶的角度來看,情況就是這樣,內部的引用和值類型都是按值傳遞的。 當引用類型作爲參數傳遞時,它的值(它是對實際對象的引用)將被傳遞。在值類型的情況下,它們的值是其本身的值(例如5)。
StringBuilder sb = new StringBuilder();
SetNull(sb);
SetNull(ref sb);
如果SETNULL(...)設置爲空的參數,那麼第二個調用設置傳遞StringBuilder的參數設置爲null。
這不像你用C++描述的那樣工作... – 2010-03-31 05:11:02