C#3.0的自动属性-有用或没有?




.net automatic-properties (12)

注意:这是在我开始使用C#时发布的。 凭借2014年的知识,我可以真正地说,自动属性是C#语言发生过的最好的事情之一。

我习惯使用私有和公共字段在C#中创建我的属性:

private string title;
public string Title
{
    get { return title;  }
    set { title = value;  }
}

现在,在.NET 3.0中,我们获得了自动属性:

public string Title { get; set; }

我知道这更多是一个哲学/主观的问题,但是有没有任何理由使用这些自动属性,除了为每个字段保存五行代码? 我个人的抱怨是,这些属性隐藏了我的东西,我不是黑魔法的忠实粉丝。

事实上,隐藏的专用字段甚至不会显示在调试器中,这是可以的,因为get / set函数什么都不做。 但是当我想实际实现一些getter / setter逻辑时,我必须使用私有/公共对。

我看到了保存大量代码(一对六行)而不失去稍后改变getter / setter逻辑的能力的好处,但是我可以通过简单地声明一个公共字段“公共字符串标题”来解决这个问题{get; 组; }块,从而甚至节省更多的代码。

那么,我在这里错过了什么? 为什么会有人真的想要使用自动属性?


@Domenic:我不明白..你不能用自动属性来做这件事吗?:

public string Title { get; }

要么

public string Title { get; private set; }

这是你指的是什么?


使用字段而不是属性的三大缺点是:

  1. 你不能绑定到一个字段,而你可以绑定到一个属性
  2. 如果你开始使用一个字段,你不能以后(很容易)将它们改为一个属性
  3. 有些属性可以添加到您无法添加到字段的属性中

我一直使用自动属性。 在C#3之前,我无法对所有的打字方式感到困扰,而只是使用公共变量。

我唯一想念的是能够做到这一点:

public string Name = "DefaultName";

您必须将默认值转换为具有属性的构造函数。 单调乏味:-(


我与他们唯一的问题是,他们不够远。 在编译器的同一版本中添加了自动属性,添加了部分方法。 为什么他们没有把这两个放在一起超出了我。 一个简单的“部分On <PropertyName>改变”将使这些事情真的非常有用。


我们一直在堆栈溢出中使用它们。

您也可能对“ 属性与公共变量”的讨论感兴趣。 恕我直言,这真的是这是一个反应,为此,这是伟大的。


我使用CodeRush,它比自动属性更快。

去做这个:

 private string title;
public string Title
{
    get { return title;  }
    set { title = value;  }
}

总共需要八次击键。


我总是创建属性而不是公共字段,因为您可以在接口定义中使用属性,所以不能在接口定义中使用公共字段。


我认为任何直观和减少代码行的结构都是一大优势。

这些功能使Ruby等语言非常强大(即动态功能,这也有助于减少多余的代码)。

Ruby始终如此:

attr_accessor :my_property
attr_reader :my_getter
attr_writer :my_setter

有一件事似乎没有人提到过,自动属性对于不可变对象(通常是不可变的结构)来说不幸是无用的。 因为你真的应该这样做:

private readonly string title;
public string Title
{
    get { return this.title; }
}

(该字段通过传递的参数在构造函数中初始化,然后是只读的。)

所以这比简单的get / private set有优势。


来自C ++的创建者Bjarne Stroustrup:

我特别不喜欢有很多获取和设置函数的类。 这往往表明,首先它不应该是一个阶级。 这只是一个数据结构。 如果它真的是一个数据结构,那么把它变成一个数据结构。

你知道吗? 他是对的。 你多长时间只是将私有字段封装在get和set中,而没有在get / set中做任何事情,仅仅是因为它是“面向对象”的事情。 这是微软解决这个问题的方法; 他们基本上是公共领域,你可以绑定。


这很简单,它很短,如果你想在属性的主体内创建一个真正的实现,它不会破坏你的类型的外部接口。

就如此容易。


这里需要注意的一点是,就我的理解而言,这仅仅是C#3.0端的语法糖,意味着编译器生成的IL是相同的。 我同意避免黑魔法,但对于同样的事情,同样少的线条通常是件好事。





automatic-properties