C#属性是隐藏实例变量还是更深层次的事情?

Kav*_*rek 3 .net c#

考虑班级:

public class foo
{
    public object newObject
    {
        get
        {
            return new object();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据MSDN:

属性是提供灵活机制来读取,写入或计算私有字段值的成员.可以使用属性,就像它们是公共数据成员一样,但它们实际上是称为访问器的特殊方法.这样可以轻松访问数据

和:

属性使类能够公开获取和设置值的公共方式,同时隐藏实现或验证代码.

get属性访问器用于返回属性值,set访问器用于分配新值.这些访问者可以具有不同的访问级别.有关更多信息,请参阅Accessor辅助功能.

value关键字用于定义set indexer分配的值.

不实现set方法的属性是只读的.同时仍然提供方法的安全性和灵活性.

这是否意味着在某个时间点newObject属性的值具有对返回的新对象的引用?

编辑从属性中删除readonly

edit2也想澄清一点,这不是一个财产的最佳用途,但它试图更有效地说明问题.

Mar*_*age 10

您在每次访问属性时返回一个新对象,这不是属性的预期行为.相反,您应该每次返回相同的值(例如,存储在字段中的值).属性getter只是一个返回值的方法的美化语法.你的代码编译成这样的东西(编译器通过为属性名称添加前缀来创建一个getter,get_然后将其作为IL发出):

public class foo
{
    public object get_newObject()
    {
        return new object();
    }
}
Run Code Online (Sandbox Code Playgroud)

每次调用getter都会创建一个foo不知道或无法访问的新对象.

这是否意味着在某个时间点newObject属性的值具有对返回的新对象的引用?

没有.


使用支持字段的属性:

class Foo {

  readonly Object bar = new Object();

  public Object Bar { get { return this.bar; } }

}
Run Code Online (Sandbox Code Playgroud)

使用自动属性:

class Foo {

  public Foo() {
    Bar = new Object();
  }

  public Object Bar { get; private set; }

}
Run Code Online (Sandbox Code Playgroud)

使用与公共字段相同的简单语法访问属性.但是,通过使用属性,您可以向getter和setter添加代码,允许您执行getter中的延迟加载或setter中的验证(以及更多)等内容.