在C#中将属性作为“输出”参数传递


80

假设我有:

public class Bob
{
    public int Value { get; set; }
}

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

Int32.TryParse("123", out bob.Value);

但出现编译错误,“'out'参数未归类为变量”。 有什么方法可以实现这一目标,或者我将不得不提取一个变量,例如:

int value;
Int32.TryParse("123", out value);
bob.Value = value;

Answers:


82

您必须显式使用字段和“常规”属性,而不是自动实现的属性:

public class Bob
{
    private int value;
    public int Value
    { 
        get { return value; } 
        set { this.value = value; }
    }
}

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

Int32.TryParse("123", out bob.value);

但是,当然,这只能在同一类中使用,因为该字段是私有的(应该是!)。

属性只是不允许您执行此操作。即使在VB中,您可以通过引用传递属性或将其用作out参数,基本上也有一个额外的临时变量。

如果您不关心的返回值TryParse,则可以始终编写自己的帮助器方法:

static int ParseOrDefault(string text)
{
    int tmp;
    int.TryParse(text, out tmp);
    return tmp;
}

然后使用:

bob.Value = Int32Helper.ParseOrDefault("123");

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


1
我认为第一种方法的问题在于,如果直接使用字段(而不是属性),则您可能会绕过属性中可能存在的验证规则
Andreas Grech

3
@Jon:我想您想在ParseOrDefault示例中将int.Parse更改为int.TryParse。
shahkalpesh

8
顺便说一句,为什么不能将属性作为输出参数,是因为设置属性实际上是一个函数调用,并且如果您在幕后看时也没有赋值。
Dirk Vollmar 09年

3
我希望看到适当的语法糖,以便让我将属性作为ref或out参数传递。让我们来完成编译器的工作,它比我快。
Ignacio Soler Garcia

1
@SoMoS:无论是值类型,对我的评论都没有影响。方法中对参数的更改立即生效,或者没有生效。这也会影响如果引发异常也会发生的情况。
乔恩·斯基特

7

您可以实现该目标,但不能使用属性。

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

    public int AnotherValue; // This is a field
}

您不能out在上使用Value,但可以在上使用AnotherValue

这会工作

Int32.TryParse("123", out bob.AnotherValue);

但是,通用准则告诉您不要公开一个课堂领域。因此,您应该使用临时变量方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.