C#自动属性

时间:2009-08-18 15:32:10

标签: c# c#-3.0 automatic-properties

我对C#中的自动属性这一点感到有点困惑,例如

public string Forename{ get; set; }

我认为你是通过不必声明私有变量来保存代码,但是当你没有使用任何get或set逻辑时,属性的重点是什么?为什么不使用

public string Forename; 

我不确定这两个语句之间的区别是什么,如果你想要额外的获取/设置逻辑,我一直认为你使用了属性?

11 个答案:

答案 0 :(得分:117)

属性可以在不破坏合同的情况下放入代码,字段不能将代码放入其中而不将其更改为属性(并破坏界面)。属性可以是只读或只写,字段不能。属性可以是数据绑定,字段不能。

答案 1 :(得分:15)

你可以写

public string Forename{ get; private set; }

获得只读属性......仍然没有真正的属性那么多功能,但它对某些作品来说是妥协。

答案 2 :(得分:13)

  

我不确定这两个语句之间的区别是什么,如果你想要额外的获取/设置逻辑,我一直认为你使用了属性?

在第一种情况下,编译器会自动为您添加一个字段,并包装该属性。它基本上等同于:

private string forename;
public string Forename
{
    get
    { 
        return this.forename;
    }
    set
    {
        this.forename = value;
    }
}

在字段上使用属性有许多优点。即使您不需要某些特定原因(例如数据绑定),这也有助于为您的API提供面向未来的保障。

主要问题是,如果你创建一个字段,但是在应用程序的v2中,需要一个属性,你就会破坏API。通过预先使用自动属性,您可以随时更改API,而无需担心源代码或二进制兼容性问题。

答案 3 :(得分:6)

这意味着您希望稍后添加逻辑。

如果您这样做并从头开始将其作为属性,则不必重建相关代码。如果将其从变量更改为属性,则必须使用。

答案 4 :(得分:4)

答案 5 :(得分:2)

公共数据成员是邪恶的(因为对象不控制对其自身状态的修改 - 它成为全局变量)。打破封装 - OOP的宗旨。

自动属性可以提供封装,避免编写简单属性的锅炉板代码的苦差事。

public string ID { get; set;}

您可以在以后将自动属性更改为非自动属性(例如,您在setter中进行了一些验证)......并且不会破坏现有客户端。

string m_ID;
public string ID
{
   get { return m_ID; }
   set 
   { 
     //validate value conforms to a certain pattern via a regex match
     m_ID = value;
   }
}

您不能对公共数据属性执行相同操作。将数据属性更改为属性将强制现有客户端重新编译,然后才能再次进行交互。

答案 6 :(得分:1)

例如,您可以将属性设置为虚拟并在继承类中实现逻辑。 您之后也可以在同一个类中实现逻辑,并且不会对依赖该类的任何代码产生副作用。

答案 7 :(得分:1)

添加自动属性时,编译器会将get set逻辑添加到应用程序中,这意味着如果稍后添加到此逻辑,则从外部库对属性的引用仍然有效。

如果您从公共变量迁移到属性,那么对于引用您的公共变量的其他库来说这将是一个重大变化 - 因此,为什么不从一个自动属性开始? :)

答案 8 :(得分:1)

并非所有属性都需要获取/设置逻辑。如果他们这样做,您使用私有变量。 例如,在MV-something模式中,您的模型没有太多逻辑。但你可以根据需要混合搭配。

如果要使用类似于建议的字段代替属性,则不能定义正确描述类的接口,因为接口不能包含数据字段。

答案 9 :(得分:1)

属性就像合同一样,您可以更改属性的实现,而不会影响使用类和属性的客户端。您今天可能没有任何逻辑,但随着业务需求的变化,如果您想引入任何代码,属性是您最安全的选择。以下2个链接是优秀的c#视频教程。第一个解释了仅使用字段的属性需求,第二个视频解释了不同类型的属性。我发现它们非常有用。

Need for the Properties in C#

Poperties in C#, Read Only, Write Only, Read/Write, Auto Implemented

答案 10 :(得分:0)

请查看以下代码和说明 The most common implementation for a property is getter or a setter that simply reads and writes to a private field of the same type as a property. An automatic property declaration instructs the compiler to provide this implementation. The compiler automatically generates a private backing field.
请查看以下代码: -

    public class Stock 
    {
      decimal currentPrice ;  // private backing field.
      public decimal CurrentPrice 
      {
        get { return currentPrice ; }
        set { currentPrice = value ; }
      }
   }

相同的代码可以改写为: -

   public class Stock
   {
     public decimal CurrentPrice { get ; set ; } // The compiler will auto generate a backing field.
   }

消息来源: - 坚果壳中的C#