gpt4 book ai didi

c# - 为什么我应该避免在 C# 中使用 Properties?

转载 作者:IT王子 更新时间:2023-10-29 03:35:47 25 4
gpt4 key购买 nike

在他的优秀著作 CLR Via C# 中,Jeffrey Richter 说他不喜欢属性,并建议不要使用它们。他给了一些理由,但我不太明白。谁能向我解释为什么我应该或不应该使用属性?在 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);
}
}

• 属性方法可能需要很长时间才能执行;现场访问总是立即完成。使用属性的一个常见原因是执行线程同步,这可以永远停止线程,因此,如果线程同步,则不应使用属性是必须的。在这种情况下,首选方法。另外,如果你的类(class)可以远程访问(例如,您的类派生自 System.MashalByRefObject),调用属性方法会很慢,因此,一个方法比一个属性(property)。在我看来,从 MarshalByRefObject 派生的类永远不应该使用属性。

• 如果连续调用多次,属性方法可能每次返回不同的值时间;一个字段每次返回相同的值。 System.DateTime 类有一个只读的Now 属性返回当前日期和时间。每次你查询这个属性,它将返回不同的值。这是一个错误,Microsoft 希望他们可以通过使 Now 成为方法而不是属性来修复类。

• 属性方法可能会导致明显的副作用;现场访问永远不会。其他换句话说,一个类型的用户应该能够在任何类型中设置由一个类型定义的各种属性他或她选择的顺序没有注意到类型中的任何不同行为。

• 属性方法可能需要额外的内存或返回对某物的引用这实际上不是对象状态的一部分,因此修改返回的对象没有对原始对象的影响;查询字段总是返回对对象的引用保证是原始对象状态的一部分。使用一个属性返回一个副本可能会让开发人员非常困惑,而且这个特性经常出现没有记录。

最佳答案

Jeff 不喜欢属性的原因是因为它们看起来像字段 - 所以不理解区别的开发人员会把它们当作字段,假设它们执行起来很便宜等。

我个人不同意他在这一点上的观点——我发现属性使客户端代码比等效的方法调用更易于阅读。我同意开发人员需要知道属性基本上是伪装的方法——但我认为就此对开发人员进行教育比使用方法使代码更难阅读要好。 (特别是,看过在同一语句中调用多个 getter 和 setter 的 Java 代码后,我知道等效的 C# 代码会更易于阅读。Demeter 法则在理论上非常好,但有时 foo.Name.Length 确实是正确的使用...)

(不,自动实现的属性并没有真正改变任何这些。)

这有点像反对使用扩展方法的论点——我能理解其中的原因,但在我看来,实际好处(当谨慎使用时)超过了缺点。

关于c# - 为什么我应该避免在 C# 中使用 Properties?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/694711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com