C#getter/setter幕后的内部名称

本文关键字:内部 setter C#getter | 更新日期: 2023-09-27 18:22:04

可能重复:
我可以用get和set代码创建一个自动属性(没有私有成员)吗
访问自动属性-c#

我曾使用过显式getter/setter,如

private bool myField;
public bool MyField
{  get { return myField; }
   set { myField = value; }
}

现在,使用C#.net 4.0,您可以缩写

public bool MyField
{ get; set; }

现在,如果我只想覆盖SET部分,我应该引用的内部引用是什么。。。在第一个示例中,我知道我明确引用的是"myField"的私有项,但在第二个版本中,我引用的是什么?编译器是否只是抛出一个隐含的"_"(如_MyField)作为元素的私有端?

C#getter/setter幕后的内部名称

class Parent
    {
        public virtual bool MyField { get; set; }
    }
    class Child : Parent
    {
        public override bool MyField
        {
            //ommitting get portion
            set
            {
                //other custom code goes here
                base.MyField = value;
            }
        }
    }

在这里,一个类继承自一个具有属性的类,该属性只覆盖setter。或者,您可以覆盖getter并将其作为返回基。MyField不更改功能。

编辑:有人提出了这样一个问题,即在执行此操作时,被遗漏的一半(在我的示例中为get)将不存在于子类中,从而使属性仅可读/写。事实并非如此,被遗漏的那一半只是从其父代继承了它的功能。请参阅下面添加到我的示例中的内容进行演示。

                Child c = new Child();
                c.MyField = true;
                if (c.MyField)
                {
                    Console.WriteLine("hi");
                }

(这确实会打印"hi",编译或运行时没有错误。)

无论编译器在这种情况下做什么,都是一个实现细节,将来可能会更改,而无需另行通知!

因此,我强烈建议不要让您的代码依赖于这样的实现细节,在这种情况下只使用第一个选项(覆盖两个访问器并具有明确支持属性的字段)。。。

您可以使用MyField以相同的方式访问属性。但是,如果您不希望类外的代码能够设置属性,则可以使用:

public bool MyField { get; private set; }