杰弗里·里希特(Jeffrey Richter)在他的出色著作《 CLR Via C#》中说,他不喜欢属性,建议不要使用它们。他给出了一些理由,但我不太了解。谁能向我解释为什么或不应该使用属性?在具有自动属性的C#3.0中,这会更改吗?
作为参考,我添加了Jeffrey Richter的意见:
•属性可以是只读或只写的;现场访问始终是可读写的。如果定义属性,则最好同时提供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);
}
}
• A property method can take a long time to execute; field access always completes immediately. A common reason to use properties is to perform thread synchronization, which can stop the thread forever, and therefore, a property should not be used if thread synchronization is required. In that situation, a method is preferred. Also, if your class can be accessed remotely (for example, your class is derived from System.MashalByRefObject), calling the property method will be very slow, and therefore, a method is preferred to a property. In my opinion, classes derived from MarshalByRefObject should never use properties.
•如果连续调用多次,则属性方法每次可能返回不同的值;字段每次都返回相同的值。System.DateTime类具有只读的Now属性,该属性返回当前日期和时间。每次查询此属性时,它将返回一个不同的值。这是一个错误,Microsoft希望他们可以通过将Now作为方法而不是属性来修复该类。
•属性方法可能会导致明显的副作用;现场访问从未如此。换句话说,类型的用户应该能够以他或她选择的任何顺序设置由类型定义的各种属性,而无需注意该类型的任何不同行为。
•属性方法可能需要额外的内存或返回对实际上不是对象状态一部分的内容的引用,因此修改返回的对象对原始对象没有影响;查询字段总是返回对对象的引用,该对象保证是原始对象状态的一部分。使用返回副本的属性可能会使开发人员感到困惑,并且通常不会记录此特征。