在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