在C ++中,我有一个函数:
void MyFunction(int p)
{
p=5;
}
假设,我有:
int x = 10;
MyFunction(x); // x = 10
MyFunction(&x); // x = 5
如何使用条件在C#中实现此目的:我只创建一个MyFunction。
答案 0 :(得分:3)
你的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
答案 1 :(得分: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
答案 2 :(得分:1)
C#没有相同的功能。如果声明方法具有ref参数,那么在调用方法时还必须指定参数是ref类型。
答案 3 :(得分:0)
您需要将参数作为参考传递。如果您不指定它,它会自动创建副本以在参数内部工作,而不是使用相同的参考。
怎么做?只需在方法声明中指定'ref'一词:
void MyFunction(ref int p)
{
p=5;
}
int x = 10;
MyFunction(ref x); // x = 5
答案 4 :(得分:0)
关键是许多人认为引用类型是通过引用传递的,而值类型是通过值传递的。从用户的角度来看就是这种情况,内部的Reference和Value类型仅通过Value传递。 将Reference类型作为参数传递时,将传递其值,该值是对实际对象的引用。在值类型的情况下,它们的值是值本身(例如5)。
StringBuilder sb = new StringBuilder();
SetNull(sb);
SetNull(ref sb);
如果SetNull(...)将参数设置为null,则第二次调用会将传入的StringBuilder参数设置为null。