在C#中将属性作为'out'参数传递

tho*_*ncp 75 c# properties out-parameters

假设我有:

public class Bob
{
    public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想将Value成员作为out参数传递

Int32.TryParse("123", out bob.Value);
Run Code Online (Sandbox Code Playgroud)

但我得到一个编译错误,"'out'参数不归类为变量." 有没有办法实现这一点,或者我将不得不提取变量,àla:

int value;
Int32.TryParse("123", out value);
bob.Value = value;
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 79

您必须明确使用字段和"普通"属性而不是自动实现的属性:

public class Bob
{
    private int value;
    public int Value
    { 
        get { return value; } 
        set { this.value = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将该字段作为out参数传递:

Int32.TryParse("123", out bob.value);
Run Code Online (Sandbox Code Playgroud)

但是,当然,这只能在同一个类中工作,因为该字段是私有的(应该是!).

属性只是不让你这样做.即使在VB中,您可以通过引用传递属性或将其用作out参数,基本上还有一个额外的临时变量.

如果您不关心返回值TryParse,您可以随时编写自己的帮助方法:

static int ParseOrDefault(string text)
{
    int tmp;
    int.TryParse(text, out tmp);
    return tmp;
}
Run Code Online (Sandbox Code Playgroud)

然后使用:

bob.Value = Int32Helper.ParseOrDefault("123");
Run Code Online (Sandbox Code Playgroud)

这样,即使您需要在多个位置执行此操作,也可以使用单个临时变量.

  • 顺便说一句,你不能将属性作为输出参数的原因是设置一个属性实际上是一个函数调用,如果你看一下,就没有赋值. (8认同)
  • @Jon:我想你想在ParseOrDefault示例中将int.Parse更改为int.TryParse. (3认同)
  • 我很想看到合适的语法糖让我传递一个属性作为ref或out参数.让我们为编译器工作,它比我快. (3认同)

Pie*_*ant 5

您可以实现这一目标,但不能使用财产.

public class Bob {
    public int Value { get; set; } // This is a property

    public int AnotherValue; // This is a field
}
Run Code Online (Sandbox Code Playgroud)

不能使用outValue,但你可以上AnotherValue.

这会奏效

Int32.TryParse("123", out bob.AnotherValue);
Run Code Online (Sandbox Code Playgroud)

但是,通用指南告诉您不要将类字段公开.所以你应该使用临时变量方法.