在C#中更改实际参数

时间:2010-03-31 05:01:15

标签: c# .net

在C ++中,我有一个函数:

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

假设,我有:

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

如何使用条件在C#中实现此目的:我只创建一个MyFunction。

5 个答案:

答案 0 :(得分: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 :(得分: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。