c#通过引用传递属性支持值,是否可能?

时间:2016-11-07 18:26:50

标签: c# properties reference

继我之前的问题:c-sharp-convert-existing-class-to-use-properties-correctly

我有一个这样的课程:

public class TestCaseInfo
{
    public string text { get; set; } = "";
    public string requirement_ref { get; set; } = "";
    public string given { get; set; } = "";
    public string when { get; set; } = "";
    public string then { get; set; } = "";
    public UInt32 timeLimit { get; set; } = 0;
}

我以前填充过这样的结构:

if (!getNodeValue(testcase_node.SelectSingleNode("text"), ref testcaseInfo.text))
    errStr += nodeError(testcase_node, "Missing 'text' node");

注意:我试图通过引用传递它。我已经阅读了大量的排队,基本上都说你不能这样做。足够公平......

所以我想传递“真实”值(我认为它称为支持值?)。类似的东西:

if (!getNodeValue(testcase_node.SelectSingleNode("text"), ref testcaseInfo._text)) // where '_text' should be the 'backing' value.
    errStr += nodeError(testcase_node, "Missing 'text' node");

但我错过了两件事(可能更多!):

  1. 什么是支持值?
  2. 我认为它是私人的吗? - 我可以保护它并使其成为朋友级吗? (可能是C ++谈话......不确定C#中是否有相同的想法)?

2 个答案:

答案 0 :(得分:5)

该属性的支持字段没有有效的标识符。您无法使用自动属性,而是明确定义属性的getset方法以及您自己的支持字段,从而为您提供支持字段的有效标识符,尽管它会是非常糟糕的设计,以在外部暴露这种支持领域。

您应该做的是重新设计代码,这样您就不需要首先通过引用传递值。您应该只是按值传递字符串,如果此函数的结果是字符串的计算,则返回它。然后调用者可以将该字符串设置回属性,如果这是他们想要的。那将是更惯用的设计。 (因为你也有一个布尔值,你当然需要传递字符串和布尔值。)

答案 1 :(得分:1)

就您而言,您的财产也可能没有支持字段。如果您没有明确声明,那么支持字段不会被称为您可以参考的任何内容:

private string _name;
public String Name { get { return _name; } set { _name = value; } }

如果您使用显式支持字段编写属性,如上所述,您可以将ref传递给方法。

private int _id;
public String ID { get { return int _id; } set { int _id = value; } }

public void Test()
{
    Int32.TryParse("Sausage Factory", out _id);
}
相关问题