2010-03-31 59 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。