如何避免引用参数
本文关键字:参数 引用 何避免 | 更新日期: 2023-09-27 18:26:01
我有一个方法,它有两个ref参数:
public void ReplaceSomething(ref int code, ref string name)
{
...
}
我想避免这种情况,因为这不是一个好的设计(而且规模很小)。我有什么选择?
我考虑过使用匿名对象,但这似乎也不是一个好主意。
Object something = new { code = 1, name = "test" };
ReplaceSomething(something);
代码和名称紧密联系在一起吗?如果是这样的话,可以考虑创建一个类型来将它们放在一起。然后可以返回该类型的值。
或者,您可以考虑返回Tuple<int, string>
。
(当然,在这两种情况下,你都可以接受相同类型的输入参数。由于你还没有显示任何代码,所以不清楚你是否使用了参数的现有值,或者它们是否基本上是out
参数。)
为什么不想使用ref
参数?这似乎是更改某些调用者值的一个非常好的方法。
另一种方法是实现一个返回值。也许你需要更好地解释问题是什么?
如果这些值紧密耦合并且"属于一起",则可以定义一个包含属性的自定义类,并返回该类的新实例(假设其不可变)或更新其属性:
class Code
{
public int Value {get;set;}
public string Name {get;set;}
}
public Code UpdateCode(Code code)
{
...
}
如果需要返回这些值,可以使用元组
public Tuple<int, string> ReplaceSomething(int code, string name)
{
...
}
或者创建自己的类包装器,将值保存为属性
public Foo ReplaceSomething(int code, string name)
{
var foo = new Foo(){...};
return foo;
}
class Foo
{
public int IntValue{get;set;}
public string StringValue{get;set;}
}
为什么要更改它?ref参数有时是有意义的,如果这是其中一个时间,请使用它们。您可以引入一个包含这对值的新类,只有当这些值经常出现在一起时,这才有意义。
我说,保留它。
根据你的问题,我可能还差得很远。你说替换ref是什么意思?你想超载吗?
public void ReplaceSomething(int code, string name)
{
// ...
}
public void ReplaceSomething()
{
return ReplaceSomething(1, "test");
}
编辑:
好的,那么你需要返回code
和name
,需要进行哪些计算?Jon Skeet关于元组的答案可能是正确的,或者您可能需要一个包含code
、name
和replaced
的POCO
public void ReplaceSomething(int code, string name)
{
var replaced = new Replaced();
replaced.code = code;
replaced.name = name;
var r;
// do some replacement calculations
replaced.replaced = r;
return replaced;
}
public class Replaced {
public string name {get; set;}
public int code {get; set;}
public string replaced {get; set;}
}