【问题标题】:Property with and without { get; set; }有和没有 { get; 的属性放; }
【发布时间】:2011-07-09 08:50:32
【问题描述】:

我是 C# 新手

有什么区别

public string MyValue;

public string MyValue { get; set; }

我一直认为两者都是一样的。我的代码中有些东西不起作用。使用后一种形式使其工作。但是不知道有什么区别。你能帮忙吗?

谢谢

【问题讨论】:

标签: c#


【解决方案1】:

第一个是字段,而不是属性。看看这个问题:

What is the difference between a Field and a Property in C#?

【讨论】:

    【解决方案2】:

    第一个是公共字段,第二个是自动实现的公共属性。

    它们不一样。使用自动实现的属性,编译器将生成一个私有的支持字段。

    虽然两者都可以作为从类中公开数据的一种方式,但您应该按照信息隐藏原则使用属性 - 字段应该是私有的并且只能通过属性访问。这允许您在不中断调用者的情况下对实现进行更改。

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      如果“后者使它起作用”,您可能正在使用数据绑定;数据绑定通常只对属性(而不是字段)起作用。这些可以是显式属性,也可以是像您的示例中那样自动实现的属性。

      请注意,如果您使用 BinaryFormatter(无论如何 IMO 存在严重缺陷),从字段更改为属性可能会破坏序列化,但属性非常优于字段。绝对做出这个改变;p

      【讨论】:

      • 感谢您提供的详细信息。这确实是必需的。
      【解决方案5】:

      这些实际上是非常不同的结构。

      这种形式是为数据实际分配内存的唯一方法:

      string MyData;
      

      这称为“字段”。

      这种形式被称为“自动实现的属性”:

      string MyData { get; set; }
      

      编译器将其翻译成这样的:

      string myDataField;
      
      string MyData
      {
          get { return myDataField; }
          set { myDataField = value; }
      }
      

      因此,您可以看到它们非常不同,但它们最终都创建了一个存储字段。但是,使用该属性可以为未来提供更大的灵活性。

      【讨论】:

        猜你喜欢
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        • 2012-07-24
        • 2022-01-14
        • 1970-01-01
        • 2019-04-08
        • 2013-04-05
        • 2021-08-21
        相关资源
        最近更新 更多