继我之前的问题: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");
但我错过了两件事(可能更多!):
答案 0 :(得分:5)
该属性的支持字段没有有效的标识符。您无法使用自动属性,而是明确定义属性的get
和set
方法以及您自己的支持字段,从而为您提供支持字段的有效标识符,尽管它会是非常糟糕的设计,以在外部暴露这种支持领域。
您应该做的是重新设计代码,这样您就不需要首先通过引用传递值。您应该只是按值传递字符串,如果此函数的结果是字符串的计算,则返回它。然后调用者可以将该字符串设置回属性,如果这是他们想要的。那将是更惯用的设计。 (因为你也有一个布尔值,你当然需要传递字符串和布尔值。)
答案 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);
}