我的理解提供了一个接口来访问类的成员间接的诸多好处。 我的问题是:是不是已经是你能做到的只是用(沿东西线)的任何OO语言
public int NormalClass::getQuality() {
return this->quality;
}
和
protected void NormalClass::setQuality(int q) {
this->quality = q;
}
?
做.NET属性提供什么额外的好处,超越纯粹的美学?
我会接受“可读性”如果你可以为它令人信服的理由; 但就个人而言,我倾向于认为get / set函数比财产更可读的,因为它是明确,而不是一个直线上升的值的函数 。
编辑:谢谢大家的回答! 这一直是我真正的信息; 总结一下我所收集/从所有已经说了,下面是一些结论,到目前为止,我已经达到了解到:
- 性能的最大好处不是来自性质的特定功能本身,而是从处理以特殊方式性质的框架和IDE的功能; 例如,属性编辑器,XML序列化,数据绑定。
- 属性可以被视为在获得/设置功能不能某些方便的方式简单值:特别是,obj.Prop ++和obj.Prop =值。
- 属性让你得逞使用公共成员快速和肮脏的代码,而无需通过实施一帮后来的get / set功能的头痛会; 如果你曾经需要增加一些逻辑和/或使公共成员私有的,你可以简单地介绍一个属性,而不是风险打破任何旧的代码。
现在,是在答案的2或3已取得到目前为止,我个人觉得有点可疑的一点:即性能意味着廉价的读/写操作,因此可以基本相同的方式简单变量使用。 我的这点问题是,没有什么固有的实际强制执行此属性; 它仅仅是他们应如何使用。 对我来说,这是类似于一个“shouldBePrivate”限定符指示值应该仅由它自己的类直接访问,但仍然可以从外部访问无论如何; 或者一个警察巡逻队上街提醒我们,我们应该表现自己,但是当我们开始作案实际上不会干扰(如果不执行,什么是它真正做的我们呢?)。
我会通过这一点更感兴趣,如果性能有某种确保读/写廉价的内置机制。
Answer 1:
乔恩斯基特有关于他的C#博客文章很好的概括为什么性关系 。 他在文中解释了为什么属性应该被用来在暴露的公共领域。
至于为什么要使用属性而不是getter / setter方法,我建议以下思路:
- 性能提供一个更清洁,更简洁的语法,很容易理解和阅读。
- 属性使赋值表达式链:
Ax = By = Cz
- 属性传达的数据访问语义清晰和一致 - 消费者希望有任何副作用。
- 属性是由许多图书馆在.NET中公认的任务,如XML序列化,绑定WPF,ASP.NET 2路结合,等等。
- 属性是由IDE和许多可视化设计器可识别和显示在属性编辑器。
- 属性启用增量(++)和递减支持( - )运算符。
- 属性可以使用反射方法容易地分化,并允许动态消费者来提取有关某一对象公开的数据的知识。
- C#3支持自动性质,这有助于消除样板代码。
Answer 2:
的属性(在.NET 3.5专门自动属性)比设置器/吸气剂,和代码==维护更少的代码==更少的错误少线条更简洁。
我要说的可读性第一,但你已经表示,不会算到你.. :)
Answer 3:
我相信XML序列化仅读/写公共属性,让你的get和set方法会被忽略。
另外,如果你有对象的泛型列表,你可以分配到一个DataGridView.DataSource,你会得到一个列每个属性。 这可能是什么@LPalmer指的是。
Answer 4:
其不仅在语言,但在CLR性质意味着大家对.NET可以依靠自己的元数据。 特性具有获得是没有副作用和get和set是一个快速运行的内涵。 许多工具使用这些假设:设计师的WinForms,LINQ to SQL的...
因此,它不仅是方便而且关于具有元数据的附加零件。
以下是其他典型的假设:
customer.Name = "a";
Assert.IsTrue(customer.Name == "a");
try { var ignored = customer.Name; }
catch { Assert.Fail("Exceptions are not expected"); }
Answer 5:
两大优势性能:
- 它们可以显示在属性网格编辑。 如果没有属性,你会如何知道哪些方法来显示编辑器?
- 他们提供了一个线索的东西是便宜的读取和写入,并读它不会造成副作用。 (这是可能的侵犯,当然,而是使一些属性,你宣称这是你的意图。)因此,调试器可以采取暗示。 如果你将鼠标悬停在某个属性,调试器将显示其在工具提示值。 这是没有意义做任何可能的方法同样的事情; 太容易不小心做的副作用的东西。
Answer 6:
其中一个看着面向对象编程流行的方式是在我们头脑中的概念在我们的方案中的类模型。
在我们的头脑中的概念是基于我们周围感知(我们是否认为他们或者我们与其他人谁也察觉他们沟通)的实际对象。
我们周围的物体 - 家具,动物,航天飞机等 - 具有特殊性能和特殊的方式行事。
这就是我们得到的属性和方法。
在C#,属性可以不还原为一个单一的场获取或字段集(例如,它可能需要额外的检查,或者可以存在介入缓存或任何数目的原因)。 因此,我们需要获取的方法和设置方法属性的独立概念,使我们的项目更接近我们希望他们建模的概念。
Answer 7:
除了使用属性描述对象的属性值的语义的正确性,你不能用这个争论:
obj.SetValue(obj.GetValue() + 1);
VS
obj.Value++;
Answer 8:
在本质属性是 get / set方法对。
属性是露出的一对有元数据支持,这意味着他们使用反射无猜的方法都应该形成基于方法名称和签名的访问有什么发现得到一套方法的运行时支持的方法。
性能的另一个优点是,他们像场语法,而不是像方法,它具有创造更干净的代码的优势。
我倾向于认为get / set函数比财产更可读的,因为它是明确,而不是一个直线上升的值的函数。
大部分的时间属性是由JIT引擎内联,因为他们是非常简单的,这意味着大多数的时间特性像场比他们多像功能,使它们更接近田的行为比功能。
在性能的情况下,它不会母校,如果有一个函数调用和现场访问之间的模糊,因为最大的一部分,您不支付,因为他们的简单功能通话费用,物业getter和setter方法,是高考生内联,这意味着成本的明智比功能更接近于领域调用*。
- 注意:并不是所有的属性都便宜,但一般准则规定,他们应该尽可能简单,重量轻越好。
Answer 9:
对我来说,这很容易:
myprop = myvalue;
console.writeline(myprop);
没有必要
mysetfunc(myvalue);
console.writeline(mygetprop);
更容易记住1两件事比2
Answer 10:
我知道,在某些情况下,你可以在数据集使用属性称为“列”的名称等。 我认为.NET做到这一点通过内省。 我不敢相信这是可能的get / set函数。
Answer 11:
也许一个小点,但getter / setter方法我觉得这恼人的是,当我在“智能感知”的IDE循环通过他们还有的“干将”旁边的对方和“二传手的另一块大规模块。 我觉得它更难以找到我要找。
Answer 12:
随着get
和set
方法,你必须决定从一开始就使用它们,几乎总是写很多的样板代码为每个公共财产的类公开。
class Point
{
private int x, y;
// Ew, pointless boilerplate!
public int getX() { return x; }
public void setX(int x) { this.x = x; }
public int getY() { return y; }
public void setY(int y) { this.y = y; }
}
// ...
Point p = new Point();
p.setX(5);
p.setY(10);
随着性能可以消除对于只有微不足道的getter和setter属性的90% 样板 getter和setter。 你可以只是还公共变量直接暴露
class Point
{
public int x, y;
}
Point p = new Point();
p.x = 5;
p.y = 10;
再后来,如果你决定要一些行为添加到您的公共变量,你可以将它们与实际行为切换到属性get
或set
方法。 这里是向上是你的类的用户不受任何影响。 没什么改变; 他们没有从切换point.x = 5
至point.setX(5)
你的公共接口稳定 ,让您在第一次使用普通的变量,并切换到速度较慢get
/ set
方法后,当你添加一些防护/日志/不管。
class Point
{
public int x { get; set; }
}
// No change!
Point p = new Point();
p.x = 5;
p.y = 10;
(现在严格来说,你的语法接口并没有改变,但类的编译接口已经改变,所以你必须重新编译使用你的类,如果你从变量切换到性能的所有代码。你不能逃脱刚重新编译类下降到位旧阶级,如果你的类是一种广泛使用的库的一部分,说你的图书馆用户必须重新编译他们的代码对你的库的新版本。)
Answer 13:
作为USR状态:
“一个酒店有获得是没有副作用和get和set是一个快速操作的内涵。”
究竟。 这暗示一个getter / setter方法会很快。 通过将一些财产你暗示,你快速获取/把一个属性的对象。 方法是做某种形式的假设涉及多个周期不是简单地获取/设置一个属性的工作。 我们通常会放一个冗长的操作“属性”进入的getFoo(...)/ SetFoo(...)方法,以表明计算操作比财产更重。
Answer 14:
至少在数据绑定
UI相关的开发变得更加方式复杂离不开它。
Answer 15:
它们允许类型的用户有一个简单的语法,并允许您创建只读和只写字段。 因此me.SetAge(34); 年龄= me.GetAge(); 变得me.age = 34; 年龄= me.age;
文章来源: Why do we use .NET properties instead of plain old get/set functions?