C#3.0自动性—有或没有?[关闭]
-
08-06-2019 - |
题
注:这是张贴了当我开始。与2014年的知识,我可以真正地说,自动性质是其中最好的事情曾经发生的C#语言。
我用来建立我的特性C#中使用私人和公共领域:
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
现在, .净 3.0,我们得到了自动性质:
public string Title { get; set; }
我知道这更是一个哲学/主观的问题,但是没有任何理由使用这些自动性,除了从节省的五个行代码的每个领域?我个人的抱怨是,那些性质被隐藏的东西从我,我不是一个大风扇的黑魔法。
实际上,隐藏私人领域不出现在调试器,这是确定的,考虑到一个事实,即get/set功能做什么。但是当我想到实际执行某些吸气/器的逻辑,我必须使用私人/公共对无论如何。
我看到的利益,我节省了大量的代码(一vs六条线),而不会失去能力改变吸气/器的逻辑后,但是,有一次我已经可以做的是,通过简单地声明一个公共领域"公共串的标题",而不需要的{获得;集;}块,因此即便节省更多的代码。
因此,我是什么丢在这里?为什么会有人实际上想要使用自动性?
解决方案
我们使用它们所有的时间堆溢出。
你还可以在感兴趣的讨论 性质与公共变量.恕我直言,那是真的这是什么反应,并为此目的,这是伟大的。
其他提示
是的,它不会 只是 保存的代码。这里的更易于阅读的时候你已经负荷。他们更快地编写和更容易维护。节的代码始终是一个很好的目标。
你可以设定不同的范围:
public string PropertyName { get; private set; }
因此,性可以只是改变内部的类。这不是真的不可改变的,因为你仍然可以进入私人设置器通过的反映。
作为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"; }
在一成不变的类有很多的成员,这样可以节省大量的过剩的代码。
三大缺点使用领域而不是属性为:
- 你不能据绑定到场而你可以给一个酒店
- 如果你开始使用的一个领域时,你不能稍后的(轻松)改变他们的财产
- 有一些属性,可以添加到一个酒店,你不能添加到领域
我个人喜欢自动的性质。什么是错节的代码?如果你想要做的东西中吸气或者,没有任何问题向它们转换到正常的性质。
因为你说过你可以使用领域,并且如果你想添加逻辑,以后他们你会把他们的属性。但是,这可能存在的问题与任何使用的反思(以及可能在其他地方?).
还的属性,可以设置不同的访问水平对于吸气和装置,它你不能做一个领域。
我猜这是相同的,因为var关键词。一个人喜好的问题。
从Bjarne Stroustrup的创造者C++:
我特别不喜欢的类有很多的获得和设置职能。这往往表明,它不应该被一个类在第一位。这只是一个数据结构。如果它真的是一个数据结构,使它成为一个数据结构。
你知道什么?他是正确的。如何通常你只是包装私人领域中的获得和设置的,而实际上不做任何内get/set,仅仅是因为它是"面向对象"的事情要做。这是Microsoft的解决问题;他们基本上是公共领域,可以结合。
有一件事似乎没有人已经提及的是如何自动性质是不幸的是没有用的不可改变的对象(通常不变的结构).因为你真的应该做的:
private readonly string title;
public string Title
{
get { return this.title; }
}
(在现场初始化的构造经通过的参数,然后是只读的。)
所以这个具有优势的一个简单的 get
/private set
autoproperty.
我一直创造性而不是公共领域,因为可以使用特性在一个接口的定义,不能使用公共领域中的一个接口的定义。
自动性是一个黑色魔术一样东西。一旦你认为它在编写下来IL而不是它被扩大到一个正常C#财产的第一这是一个很小的黑魔法比很多其他语言结构。
我用自动性所有的时间。C之前#3我不能被打扰的所有打字输入,只是使用公共变量,而不是。
我唯一想念的是能够做到这一点:
public string Name = "DefaultName";
你必须移defaults到您的构造与的性质。繁琐:-(
我认为,任何建构,这是直观的,并减少了行代码是一个很大的加。
这些类型的特征是什么语言,如红宝石所以强有力(就和动态的特点,这还有助于减少过量的代码)。
红宝石了这所有沿着为:
attr_accessor :my_property
attr_reader :my_getter
attr_writer :my_setter
唯一的问题,我们与他们的是他们不去远远不够的。同样释放的编译器,加入自动性,增加的部分方法。为什么他们不把这两个在一起超出了我。一个简单的"局部上<PropertyName>改变"会做这些事情真的真的有用的。
很简单,它的短期和如果你想要创建一个真正实施内的财产的身体的某处,它不会破坏你的类型的外部界面。
如此简单。
有一点要注意的是,我的理解是,这是 只是 句法上的糖C#3.0结束,这意味着所产生的IL通过编译是一样的。我同意关于避免黑魔法,但都是一样的,较少的行为同样的事情通常是一件好事。
在我看来,你应该总是使用自动性的,而不是公共领域。这就是说,这是一个妥协:
开始用一个 内部 现场使用的命名约定你会使用的财产。当你第一次么
- 需要访问的领域,从外其组件,或
- 需要将逻辑的吸气/器
这样做:
- 重命名的领域
- 把它私人
- 增加一个公共财产
你的客户的代码不需要改变。
总有一天,不过,你的系统将增长和你分解成独立的集会和多个解决方案。当发生这种情况,任何暴露的领域将回来纠缠你因为正如杰夫所提到的, 改变一个公众领域公共财产是破API改变.
我用CodeRush,它的速度比自动的性质。
要做到这一点:
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
要求八键击总数。
好的代码段的一个自动的财产相同的名称将有七键在总;)
@多米尼克:我不得到它..你不能这么做有自动性?:
public string Title { get; }
或
public string Title { get; private set; }
这是什么你指的是?
我最大的抱怨与自动性质是,他们的目的是节省时间,我经常发现我们扩大它们成为完全成熟的性质以后。
什么VS2008是在缺少的是一个 爆炸的汽车属性 重构。
事实上我们有 封场 "重构"使我的工作方式更快,只是使用公共领域。