通过值或引用将参数传递给函数

时间:2019-06-17 08:39:08

标签: c# function refactoring

我在C#中有两个看起来像这样的函数:

public static int Foo(int para1, int para2)
{
//do something
}
public static int Foo(ref int para1, ref int para2)
{
//do the same thing as overloaded function
}

这两个函数的作用完全相同,唯一不同的部分是一个传递值,它不能更改参数,另一个传递参考值,它可以更改参数。我想这样做:

public static int Foo(int para1, int para2)
{}
public static int Foo(ref int para1, ref int para2)//intend to change the value of the parameter
{
    Foo(para1,para2);//will not change the value of para1, para2
}

但是它不起作用,因为它将使这两个函数成为相同的精确函数。或这样:

public static int Foo(int para1, int para2)
{}
public static int Foo(ref int para1, ref int para2)//intend to change the value of the parameter
{
    Foo(ref para1,ref para2);//keep calling itself recursively, infinite loop
}

所以我别无选择,只能将完全相同的代码从一个函数复制到另一个函数。我知道复制粘贴代码不是编程中的好习惯,因为它违反了DRY principle

除了函数重载之外,我还有其他方法可以实现此目标吗?也许是这样的:

public static int Foo((optional pass by ref) para1, (val||ref) para2)
{
    //do something
}

参考:Difference between pass by value and pass by referenceout

1 个答案:

答案 0 :(得分:1)

我真的怀疑您的设计是否合理,我现在无法真正判断。

对于您当前的编码问题,我将切换呼叫:

public static int Foo(int para1, int para2)
{
    return Foo(ref para1, ref para2);
}
public static int Foo(ref int para1, ref int para2)
{
    //do something
}

这样,仅更改第一个方法中的本地副本,而不更改传递给该方法的值。 “ Foo with ref”仍然有效。