如何避免引用参数

本文关键字:参数 引用 何避免 | 更新日期: 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");
}

编辑:

好的,那么你需要返回codename,需要进行哪些计算?Jon Skeet关于元组的答案可能是正确的,或者您可能需要一个包含codenamereplaced 的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;}
}