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

时间:2012-02-01 17:56:04

标签: c# getter-setter

  

可能重复:
  Can I create an automatic property (no private member) with get and set code?
  Access automatic property - 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部分,我应该引用的INTERNAL引用是什么......在第一个示例中,我知道我明确指的是“myField”的私有,但是第二个版本,我在引用什么?编译器是否只抛出一个隐含的“_”,如_MyField作为元素的私有端?

3 个答案:

答案 0 :(得分:2)

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,只需将其保留为返回base.MyField即可更改功能。

修改 提出的问题是,在执行此操作时,遗留的一半(我的示例中的get)将不存在于子类中,使得属性仅读/写。事实并非如此,遗漏的一半只是从其父级继承其功能。请参阅我的示例中的以下内容以进行演示。

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

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

答案 1 :(得分:1)

无论编译器在这种情况下做了什么,都是一个实现细节,将来可能会发生变化而不另行通知!

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

答案 2 :(得分:0)

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

public bool MyField { get; private set; }