我在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 reference,out
。
答案 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”仍然有效。