为什么.NET Colors类不是静态的?

时间:2009-10-06 23:53:58

标签: c# .net

我正在浏览反射器中的颜色类源,它只是一个密封的类。但所有成员都是静态的。那么为什么有人会创建Colors类的副本?

它在里面:

System.Windows.Media.Colors

3 个答案:

答案 0 :(得分:8)

静态类只是一个密封的抽象类,其中私有构造函数没有构造函数(在任何可访问级别都没有构造函数,甚至没有编译器生成的构造函数) [修正了Eric的评论]。 C#关键字static只是一种简写,并且还会强制您将所有成员设置为静态,但对于API客户端则完全相同。

鉴于WPF(当时是Avalon)的工作是在.NET 2.0发布之前开始的,可能是这个特定的类是在static class出现之前编写的。或许作者可能根本没有意识到这种语言特征。

答案 1 :(得分:2)

对我来说,Colors.AliceBlueColors.AntiqueWhite(Colors类:)的第一个和第二个静态属性)应该是Color对象的差异实例而不是不同的类型。

public static Color AliceBlue {get;}

请注意,静态类是一个密封类,只包含静态成员,无法使用 new 关键字进行实例化,因为它只能有一个私有默认构造函数(至少在C#中。

想象一下,您正在创建一个以Color作为参数的API,如果Color是静态类,它会是什么样子?

有人可以争辩说,不同的颜色应该是不同的类型(也可以说是静态的),而不是Color类的不同实例。即使在这种情况下,Color也不应该是静态类,因为您希望为各个Color类创建一个基本Color类,并使基本Color类自动保持密封。

有人可能仍然想要争论Color应该是命名空间,而单个颜色应该是静态类。我只想让他们想象一下API会再次出现的样子:)

答案 2 :(得分:1)

因为包含所有静态成员和私有构造函数的sealed类构成了某些性能增强,因为IL类与{{1}的使用形成static的方式实际上,静态类在IL中获取sealed修饰符,以防止在abstract类没有调用new的地方调用new。

请参阅.. This post on msdn social