6

这似乎违背了每一个设计准则。接受 T 类型的单个参数的静态方法通常应该只是成员方法。

太奇怪了,我实际上不得不发布一个StackOverflow 问题来了解 IsUpper 的存在(因为它没有出现在自动完成中)

编辑

我知道我之前的陈述需要一点解释。一个好的设计示例是 String.ToLower()。它不是被原型化为静态 void ToLower(String foo),而是一个成员方法。很明显(至少对我而言)char.IsLower() 也应该如此。

4

3 回答 3

7

结构上的实例方法不是线程安全的。另一方面,静态方法.

静态方法接收结构的副本,实例方法接收托管指针。通过指针访问数据不是安全操作,很容易导致竞争条件。

这就是为什么结构/基元上的大多数方法都是静态的而不是实例的。

这里有一个类似的问题。

为什么 IsNan 是 Double 类的静态方法而不是实例属性?

于 2008-12-23T16:45:31.537 回答
3

另请参阅问题。

简短版本 - 当从字符串文字调用时,最初的 IDE 遇到了智能感知问题(我也假设为 char 文字)。因此设计者将方法设为静态来解决这个问题。

重新编辑:我在这里对 .NET 设计师屈服于来自 IDE 设计师的压力有些抱怨。但是看到 Pop 对这个问题的回答后,我现在对此不太确定了。

EDIT2:蒂姆在评论中问我们是否知道这是真的,或者只是猜测。我找不到对这个问题的确切参考,但我发现了一篇 2002 年的文章,讨论了字符串文字中的智能感知错误。大约在这一页的一半。

于 2008-12-23T16:20:14.177 回答
2

在我看来,这确实是有道理的。

有许多接受单个参数的静态方法。用这样的方法计算平方根不是很好:

double d = 100.0;
Console.WriteLine("Square root of d is " + d.Sqrt());

这会降低 OO 设计的“凝聚力”,这不是一个好的做法。把这个职责分给Math类会更好。

double d = 100.0;
Console.WriteLine("Square root of d is " + Math.Sqrt(d));
于 2008-12-23T16:44:32.803 回答