C#3.0汽车性能—;有用与否?
注意:这是我刚开始C#时发布的。有了2014年的知识,我真的可以说汽车性能是C#语言有史以来最好的东西之一 我习惯于使用私有和公共字段在C#中创建我的属性:C#3.0汽车性能—;有用与否?,c#,.net,automatic-properties,C#,.net,Automatic Properties,注意:这是我刚开始C#时发布的。有了2014年的知识,我真的可以说汽车性能是C#语言有史以来最好的东西之一 我习惯于使用私有和公共字段在C#中创建我的属性: private string title; public string Title { get { return title; } set { title = value; } } 现在,在3.0中,我们获得了自动属性: public string Title { get; set; } 我知道这更像是一个哲学/主观
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
现在,在3.0中,我们获得了自动属性:
public string Title { get; set; }
我知道这更像是一个哲学/主观的问题,但是除了为每个字段保存五行代码之外,还有什么理由使用这些自动属性吗?我个人的抱怨是,这些财产对我隐瞒了一些东西,而我不是一个黑魔法迷 事实上,隐藏的私有字段甚至没有显示在调试器中,考虑到get/set函数什么都不做,这是可以的。但是,当我想要实际实现一些getter/setter逻辑时,无论如何我都必须使用private/public对 我看到了这样的好处:我保存了大量代码(一行对六行),而不会丢失以后更改getter/setter逻辑的能力,但是我已经可以通过简单地声明一个公共字段“publicstringtitle”,而不需要{get;set;}块,从而保存更多的代码来做到这一点
那么,我错过了什么?为什么有人真的想使用汽车属性?我个人喜欢汽车属性。保存代码行有什么问题?如果您想在getter或setter中执行某些操作,那么以后将它们转换为普通属性是没有问题的 正如您所说的,您可以使用字段,如果您想在以后向字段添加逻辑,您可以将其转换为属性。但这可能会给反射的任何使用带来问题(可能在其他地方?) 属性还允许您为getter和setter设置不同的访问级别,这是字段无法做到的
我想这和var关键字是一样的。个人喜好的问题。使用字段而不是属性的三大缺点是:
我们总是在堆栈溢出中使用它们
您可能还对以下内容的讨论感兴趣。我想这才是真正的反应,出于这个目的,这很好。我一直在使用自动属性。在C#3之前,我不必为所有的类型而烦恼,只使用公共变量 我唯一怀念的是能够做到这一点:
public string Name = "DefaultName";
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
我唯一的问题是它们做得不够。同一版本的编译器添加了自动属性,添加了分部方法。我不明白为什么他们不把这两者放在一起。一个简单的“分部OnChanged”会使这些东西变得非常有用。是的,它只保存代码。当你有大量代码时,阅读起来更容易。它们编写起来更快,维护起来也更容易。保存代码始终是一个好目标 您可以设置不同的作用域:
public string PropertyName { get; private set; }
因此,属性只能在类内部更改。这并不是真正不变的,因为您仍然可以通过反射访问私有setter
从C#6开始,您还可以创建truereadonly
属性,即不能在构造函数之外更改的不可变属性:
public string PropertyName { get; }
public MyClass() { this.PropertyName = "whatever"; }
在编译时,将成为:
readonly string pName;
public string PropertyName { get { return this.pName; } }
public MyClass() { this.pName = "whatever"; }
在具有大量成员的不可变类中,这可以节省大量多余的代码。这里需要注意的一点是,据我所知,这只是C#3.0端的语法糖分,这意味着编译器生成的IL是相同的。我同意避免黑魔法,但同样的,相同内容的行数更少通常是一个好方法事情。在我看来,您应该始终使用自动属性而不是公共字段。也就是说,这里有一个折衷方案: 从使用属性命名约定的字段开始
- 需要从部件外部访问字段,或
- 需要将逻辑附加到getter/setter
不过,总有一天,你的系统会成长,你会把它分解成单独的程序集和多个解决方案。当这种情况发生时,任何暴露的字段都会回来困扰你,因为正如Jeff所提到的那样,。自动属性和C#中的任何其他东西一样都是一个黑魔法。一旦你从编译到IL而不是t的角度考虑它如果首先将其扩展为普通的C属性,那么它比许多其他语言构造的黑魔法要小得多。我使用CodeRush,它比自动属性快得多 为此:
public string Name = "DefaultName";
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
总共需要八次击键。对于代码段,相同名称的自动属性将总共有七次击键;)似乎没有人提到的一件事是,自动属性对于不可变的对象(通常是不可变的结构)是多么的不幸。因为你真的应该这样做:
private readonly string title;
public string Title
{
get { return this.title; }
}
(其中字段通过传递的参数在构造函数中初始化,然后为只读。)
因此,这比简单的
获取
/私有集
自动属性有优势。@Domenic:我不明白。。不能用自动属性执行此操作吗?:
public string Title { get; }
或
这就是您所指的吗?它很简单,很短,如果您想在属性体中创建一个真正的实现,那么