如何避免ref参数?

时间:2012-02-27 18:45:30

标签: c# pass-by-reference anonymous

我有一个方法有2个参数:

public void ReplaceSomething(ref int code, ref string name)
{
    ...
}

我想避免这种情况,因为它不是一个好的设计(并且很难缩放)。我有什么选择?

我虽然使用匿名对象,但这似乎也不是一个好主意。

Object something = new { code = 1, name = "test" };

ReplaceSomething(something);

6 个答案:

答案 0 :(得分:5)

代码和名称是否紧密相连?如果是这样,请考虑创建一个类型以将它们中的两个放在一起。然后您可以返回该类型的值。

或者,您可以考虑返回Tuple<int, string>

(在这两种情况下,您都可以接受相同类型的输入参数。当您没有显示任何代码时,您是否使用参数的现有值或者是否可以使用它们并不是很清楚基本上是out个参数。)

答案 1 :(得分:0)

如果您需要返回这些值,可以使用元组

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;}
}

答案 2 :(得分:0)

根据你的问题,我可能会离开。你更换ref是什么意思?你想超载吗?

public void ReplaceSomething(int code, string name)
{
    // ...
}

public void ReplaceSomething()
{
    return ReplaceSomething(1, "test");
}

<击>

修改:

好的,所以你需要返回codename需要进行哪些计算? Jon Skeet关于元组的答案可能是对的,或者您可能需要一个包含code namereplaced

的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;}
}

答案 3 :(得分:0)

为什么不想使用ref参数?这似乎是改变一些来电者价值观的一种非常好的方式。

另一种方法是实现返回值。也许你需要更好地解释问题是什么?

答案 4 :(得分:0)

如果这些值紧密耦合并且&#34;属于一起&#34;你可以定义一个包含你的属性的自定义类,并返回一个新实例(假设它是不可变的)或更新它的属性:

class Code
{
  public int Value {get;set;}
  public string Name {get;set;}
}

public Code UpdateCode(Code code)
{
    ...
}

答案 5 :(得分:0)

你为什么要改变它? ref参数有时是有意义的,如果这是其中之一 - 使用它们。您可以引入一个包含该对值的新类,只有在这些值经常组合在一起时才有意义。

我说,保留它。