2009-09-02 12 views
67

假设我有:传递的属性在C#中的“出”参数

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

我想将价值成员通过像

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

out参数,但我得到一个编译错误,“out”参数未被分类为变量。“有什么办法来实现这一点,还是我将不得不提取变量,点菜:

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

的可能重复的[是否有可能属性作为传递“去”或“REF”参数?](http://stackoverflow.com/questions/564557/is-it-possible-to-pass-properties-as -out-or-ref-parameters) – nawfal 2013-02-11 10:41:17

回答

75

你必须明确地使用字段和“正常”的属性,而不是自动实现的属性:

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

我认为第一种方法的问题是,如果直接使用该字段(而不是属性),则可能会绕过可能存在于属性 – 2009-09-02 21:39:41

+0

@Dreas中的验证规则:if它是一个自动实现的属性,它不可能有任何验证规则... – 2009-09-02 21:42:56

+3

@Jon:我想你想在ParseOrDefault示例中将int.Parse更改为int.TryParse。 – shahkalpesh 2009-09-02 21:44:37

4

你可以做到这一点,但不能与财产。

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

    public int AnotherValue; // This is a field 
} 

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

这将工作

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

但是,共同准则告诉你不要做一个类领域的公众。所以你应该使用临时变量方法。

+0

哦,是啊*字段*,我用错了名词。 – 2009-09-02 21:39:45