当前位置:  开发笔记 > 编程语言 > 正文

C#3.0自动属性 ​​- 有用与否?

如何解决《C#3.0自动属性​​-有用与否?》经验,为你挑选了10个好方法。

注意:这是在我开始使用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逻辑的能力的好处,但是我再次通过简单地声明一个公共字段"Public string Title"就可以做到这一点需要{get; 组; 阻止,因此甚至可以节省更多代码.

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



1> Jeff Atwood..:

我们一直在Stack Overflow中使用它们.

您可能还对" 属性与公共变量"的讨论感兴趣.恕我直言,这真的是对此的反应,为此目的,它是伟大的.



2> Keith..:

是的,它只是保存代码.当你有大量的东西时,阅读起来更容易.它们编写起来更快,更易于维护.保存代码始终是一个很好的目标.

您可以设置不同的范围:

public string PropertyName { get; private set; }

因此,只能在类内更改属性.这不是真正不可变的,因为您仍然可以通过反射访问私有的setter.

从C#6开始,您还可以创建真正的readonly属性 - 即不能在构造函数外部更改的不可变属性:

public string PropertyName { get; }

public MyClass() { this.PropertyName = "whatever"; }

在编译时将成为:

readonly string pName;
public string PropertyName { get { return this.pName; } }

public MyClass() { this.pName = "whatever"; }

在具有大量成员的不可变类中,这可以节省大量多余的代码.


@wal - 你可以在它们上面加一个断点,就像你可以访问一个成员变量一样,你就是不能进入它们.但你为什么要这样做?自动属性实际上做的是琐碎的和自动生成的,如果你有一个错误,那就是他们极不可能的错误.
我们可能需要在基思外面接受这个.:)
@wal - 有什么可以调试的?从这个角度来看,你基本上处理成员变量.

3> lomaxx..:

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

    你不能数据绑定到一个字段,而你可以到一个属性

    如果您开始使用字段,则以后(轻松)将它们更改为属性

    您可以将某些属性添加到无法添加到字段的属性中


@Homam此外,将字段更改为属性会破坏二进制兼容性,从而要求该字段的所有使用者重新编译.
"如果你开始使用一个字段,你不能在以后(轻松)将它们更改为一个属性",对不起,为什么?
@Homam主要是,任何在字段上使用反射的消费者代码都会破坏,因为他们必须从使用FieldInfo切换到PropertyInfo.

4> Ray..:

我个人喜欢自动财产.保存代码行有什么问题?如果你想在getter或setter中做一些事情,以后将它们转换为普通属性是没有问题的.

正如你所说,你可以使用字段,如果你想在以后添加逻辑,你可以将它们转换为属性.但这可能会出现任何使用反射的问题(可能还有其他地方?).

此外,属性还允许您为getter和setter设置不同的访问级别,而不能使用字段.

我猜它和var关键字一样.个人喜好的问题.



5> Giovanni Gal..:

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

我特别不喜欢有很多get和set函数的类.这通常表明它本来不应该是一个阶级.它只是一个数据结构.如果它确实是一个数据结构,那就把它变成一个数据结构.

你知道吗?他是对的.你经常在get和set中简单地包装私有字段,而不是实际在get/set中做任何事情,只是因为它是"面向对象"的事情.这是微软解决问题的方法; 它们基本上是你可以绑定的公共字段.


我真的认为这应该有更多的积分.很多人认为汽车房产是写作可怕的封装(或根本没有封装)的绿灯,只不过是一个美化的公共领域.当然,对于人们如何使用工具而不是工具本身来说,这更是一个问题,但我认为在讨论一般属性时提到这一点很重要.

6> Domenic..:

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

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

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

因此,这比简单get/自动配置更具优势private set.


不会`public string Title {get; 私人集; 那种结果完全一样吗?当然,你可以从班级内部改变它,但如果你这样做,你还有其他问题......:p
@Svish - 通过该参数,C#中的readonly关键字永远不应该被使用,因为它的使用意味着我们隐藏了这些"不同的问题"
我只是说从外部的API类型来看,它没有太大的区别.因此,如果需要,可以使用自动属性.当然,如果你能做一些像`public string Title {get; 私人只读; }`

7> 小智..:

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



8> ICR..:

自动属性与C#中的其他任何东西一样具有黑魔法.一旦你从编译到IL而不是将它扩展到普通的C#属性的角度考虑它,首先它比许多其他语言结构要少得多.



9> Orion Edward..:

我一直都在使用自动属性。在C#3之前,我不会为所有类型感到烦恼,而只是使用了公共变量。

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

public string Name = "DefaultName";

您必须将默认值转移到带有属性的构造函数中。乏味的:-(


使用C#6中的自动属性初始化程序,您很快就可以做到:`public string Name {get; 组; } =“ DefaultName”;`http://blogs.msdn.com/b/csharpfaq/archive/2014/11/20/new-features-in-c-6.aspx

10> Mike Stone..:

我认为任何直观且能减少代码行的构造都是一个很大的优点。

这些功能使Ruby之类的语言如此强大(具有动态功能,这也有助于减少多余的代码)。

Ruby一直这样:

attr_accessor :my_property
attr_reader :my_getter
attr_writer :my_setter

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有