我正在浏览反射器中的颜色类源,它只是一个密封的类。但所有成员都是静态的。那么为什么有人会创建Colors类的副本?
它在里面:
System.Windows.Media.Colors
答案 0 :(得分:8)
静态类只是一个密封的抽象类,其中私有构造函数没有构造函数(在任何可访问级别都没有构造函数,甚至没有编译器生成的构造函数) [修正了Eric的评论]。 C#关键字static
只是一种简写,并且还会强制您将所有成员设置为静态,但对于API客户端则完全相同。
鉴于WPF(当时是Avalon)的工作是在.NET 2.0发布之前开始的,可能是这个特定的类是在static class
出现之前编写的。或许作者可能根本没有意识到这种语言特征。
答案 1 :(得分:2)
对我来说,Colors.AliceBlue
和Colors.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