c#3.0-C#自动属性

我对C#中的自动属性有点困惑

public string Forename{ get; set; }

我知道您不必声明私有变量来保存代码,但是当您不使用任何get或set逻辑时属性的意义是什么? 为什么不只是使用

public string Forename; 

我不确定这2条语句之间的区别是什么,我一直以为如果需要其他的获取/设置逻辑,就可以使用属性?

Gavin asked 2020-01-14T11:45:39Z
11个解决方案
118 votes

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

MatthewMartin answered 2020-01-14T11:45:54Z
15 votes

你可以写

public string Forename{ get; private set; }

以获得只读属性...仍然不如真实属性那么通用,但这是对某些作品的折衷。

Sklivvz answered 2020-01-14T11:46:19Z
13 votes

我不确定这2条语句之间的区别是什么,我一直以为如果需要其他的获取/设置逻辑,就可以使用属性?

在第一种情况下,编译器将自动为您添加一个字段,并包装属性。 这基本上等同于执行以下操作:

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

在字段上使用属性有很多优点。 即使您不需要某些特定原因,例如数据绑定,这也有助于使API面向未来。

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

Reed Copsey answered 2020-01-14T11:46:53Z
6 votes

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

如果这样做,并且从一开始就将其作为属性,则不必重新构建从属代码。 如果将其从变量更改为属性,则必须这样做。

answered 2020-01-14T11:47:18Z
4 votes

考虑查看有关自动属性和公共字段之间的区别,字段与属性,自动属性-有用与否?,为什么不使用公共字段的一些相关主题。

Nathan Taylor answered 2020-01-14T11:47:38Z
2 votes

公共数据成员是邪恶的(因为对象无法控制对其自身状态的修改-它成为全局变量)。 破坏封装-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;
   }
}

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

Gishu answered 2020-01-14T11:48:12Z
1 votes

首先,您可以将属性设置为virtual并在继承类中实现逻辑。之后,您也可以在同一类中实现逻辑,并且依赖于该类的任何代码都不会产生副作用。

answered 2020-01-14T11:48:32Z
1 votes

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

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

MattH answered 2020-01-14T11:48:57Z
1 votes

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

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

user29117 answered 2020-01-14T11:49:22Z
1 votes

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

需要C#中的属性

C#中的属性,只读,只写,读/写,自动实现

Ravi Ravilla answered 2020-01-14T11:49:52Z
0 votes

查看以下代码和说明。
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#简而言之

Pratik Singhal answered 2020-01-14T11:50:30Z
translate from https://stackoverflow.com:/questions/1294660/c-sharp-automatic-properties