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

c# pass property backing value by reference, is it possible?

从我之前的问题开始:C-sharp-convert-existing-class-to-use-properties-correct

我有一个这样的班级:

1
2
3
4
5
6
7
8
9
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;
}

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

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

注意:我正试图通过引用传递它。我读过很多的问答,基本上都说你不能这样做。够公平的…

所以我想传递"真实"值(我认为它被称为支持值?)相反。类似:

2

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

  • 支持值的名称是什么?
  • 我想是私人的吧?-我能让它受保护并成为一个朋友班吗?(这可能是C++语言…不确定C中是否有相同的想法?

  • 该属性的支持字段没有有效的标识符。您不能使用auto属性,而是显式定义属性的getset方法,以及您自己的支持字段,从而为支持字段提供有效的标识符,尽管从外部公开此支持字段的设计非常糟糕。

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


    就您而言,您的属性也可能没有支持字段。如果没有显式声明,那么backing字段就不会被调用任何可以引用的内容:

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

    如果使用显式的支持字段编写属性,如上所述,可以通过ref将它们传递到方法中。

    1
    2
    3
    4
    5
    6
    7
    private int _id;
    public String ID { get { return int _id; } set { int _id = value; } }

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