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

时间:2009-09-02 21:31:09

标签: c# properties out-parameters

假设我有:

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

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

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

但是我收到了编译错误,“'out'参数未被归类为变量。”有没有办法实现这一点,或者我将不得不提取变量,à LA:

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

2 个答案:

答案 0 :(得分:78)

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

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 :(得分:5)

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

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

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