Jeffrey Richter 在他的优秀著作 CLR Via C # 中说,他不喜欢属性,建议不要使用它们。他给了一些理由,但我真的不明白。有人能解释一下为什么我应该或不应该使用属性吗? 在具有自动属性的 C # 3.0中,这种情况会改变吗?
作为参考,我加入了杰弗里 · 里克特的观点:
•属性可以是只读或只写; 字段访问始终是可读和可写的。 如果定义属性,最好同时提供 get 和 set 访问器方法。
属性方法可能引发异常; 字段访问从不引发异常。
•属性不能作为 out 或 ref 参数传递给方法; 字段可以 例如,下面的代码将无法编译:
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
•属性方法可能需要很长时间才能执行; 字段访问总是立即完成。 使用属性的一个常见原因是执行线程同步 可以永远停止线程,因此,如果线程同步,则不应使用属性 是必需的。在这种情况下,方法是首选的。此外,如果您的类可以 远程访问(例如,您的类派生自 System.MashalByRefObject) , 调用属性方法将非常缓慢,因此,方法优先于 在我看来,从 MarshalByRefObject 派生的类永远不应该使用 物业。
•如果在一行中多次调用,则属性方法可能每次返回不同的值 字段每次返回相同的值。 System.DateTime 类具有一个只读的 返回当前日期和时间的属性 属性,它将返回一个不同的值。这是一个错误,微软希望 可以通过使 Now 成为方法而不是属性来修复类。
•属性方法可能会引起可观察到的副作用; 实地访问从来不会引起副作用 单词,则类型的用户应该能够在任何 他或她选择的顺序没有注意到任何不同的行为类型。
属性方法可能需要额外的内存或返回对某些内容的引用 实际上不是对象状态的一部分,因此修改返回的对象没有 对原始对象的影响; 查询字段总是返回对 保证是原始对象状态的一部分 返回一个副本可能会使开发人员非常困惑,而且这个特征经常 没有记录。