Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免ref参数?_C#_Pass By Reference_Anonymous - Fatal编程技术网

C# 如何避免ref参数?

C# 如何避免ref参数?,c#,pass-by-reference,anonymous,C#,Pass By Reference,Anonymous,我有一个方法有两个ref参数: public void ReplaceSomething(ref int code, ref string name) { ... } 我想避免这种情况,因为这不是一个好的设计(而且伸缩性很差)。我有什么选择 我考虑过使用匿名对象,但这似乎也不是一个好主意 Object something = new { code = 1, name = "test" }; ReplaceSomething(something); 如果需要返回这些值,可以使用元组

我有一个方法有两个ref参数:

public void ReplaceSomething(ref int code, ref string name)
{
    ...
}
我想避免这种情况,因为这不是一个好的设计(而且伸缩性很差)。我有什么选择

我考虑过使用匿名对象,但这似乎也不是一个好主意

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

ReplaceSomething(something);

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

public Tuple<int, string> ReplaceSomething(int code, string name)
{
    ...
}

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

public Tuple<int, string> ReplaceSomething(int code, string name)
{
    ...
}
根据你的问题,我可能会走得很远。替换ref是什么意思?你想超载吗

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

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

好的,那么您需要返回
code
name
需要进行哪些计算?Jon Skeet关于元组的回答可能是正确的,或者您可能需要一个包含
代码
名称和替换的
的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;}
}
根据你的问题,我可能会走得很远。替换ref是什么意思?你想超载吗

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

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

好的,那么您需要返回
code
name
需要进行哪些计算?Jon Skeet关于元组的回答可能是正确的,或者您可能需要一个包含
代码
名称
和替换的
的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;}
}

为什么不使用
ref
参数?这似乎是更改某些调用方值的一个非常好的方法


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

为什么不使用
ref
参数?这似乎是更改某些调用方值的一个非常好的方法


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

代码和名称是否紧密联系在一起?如果是这样,考虑创建一个类型来把它们放在一起。然后可以返回该类型的值

可选地,您可以考虑返回<代码>元组< /代码> .<


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

代码和名称是否紧密联系在一起?如果是这样,考虑创建一个类型来把它们放在一起。然后可以返回该类型的值

可选地,您可以考虑返回<代码>元组< /代码> .<


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

如果这些值紧密耦合并且“属于一起”您可以定义一个保存属性的自定义类,并返回该类的新实例(假定其不可变)或更新其属性:

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

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

如果这些值紧密耦合且“属于一起”,则可以定义一个保存属性的自定义类,并返回该类的新实例(假定其不可变)或更新其属性:

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

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

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


我说,保留它。

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



我说,保留它。

为什么要避免ref参数?Ref参数有它们的用途,应该在需要时使用。ReplaceSomething做什么,为什么现在使用Ref参数?基于这个主题,我只是在寻找另一种方法。@Hor-这个问题并不能解释您试图避免使用ref参数的原因。首先,这些参数真的是
ref
?它们是否应该被移出
?为什么要避免引用参数?Ref参数有它们的用途,应该在需要时使用。ReplaceSomething做什么,为什么现在使用Ref参数?基于这个主题,我只是在寻找另一种方法。@Hor-这个问题并不能解释您试图避免使用ref参数的原因。首先,这些参数真的是
ref
?它们应该是
输出的吗
?不过,我想作者的观点是,这些值确实需要以某种方式返回。但是当我更改它们时,我需要返回这些值,这就是我通过引用传递它们的原因。不创建全局变量或不通过引用传递的其他方法?我认为作者的观点是,值实际上需要以某种方式返回。但我需要在更改它们时返回值,这就是我通过引用传递的原因。不创建全局变量或通过引用传递的其他方法?但我需要在更改值时返回值,这就是我通过引用传递的原因。但我需要在更改值时返回值,这就是我通过引用传递的原因。作者没有说他使用的是.NET的哪个版本,这当然对元组解决方案很重要。您知道这一点,但其他人可能不知道。@Andrew,但在旧版本的框架上创建自己的
元组
是件小事。卓越提示此元组!谢谢!我现在就去读!作者并没有说他使用的是哪个版本的.NET,当然这对元组解决方案很重要。您知道这一点,但其他人可能不知道。@Andrew,但在旧版本的框架上创建自己的
元组
是件小事。卓越提示此元组!谢谢!我现在就去读!我刚才看到这不是一个好办法@霍:我明白了。他的主要观点是,他似乎不喜欢
ref