Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么.NET颜色类不是静态的?_C#_.net - Fatal编程技术网

C# 为什么.NET颜色类不是静态的?

C# 为什么.NET颜色类不是静态的?,c#,.net,C#,.net,我在reflector中浏览了colors类的源代码,它只是一个密封类。但所有成员都是静态的。那么为什么有人要创建Colors类的副本呢 它位于: System.Windows.Media.Colors 静态类只是一个密封的抽象类,没有构造函数的私有构造函数(如中所示,在任何可访问级别都没有构造函数,甚至没有编译器生成的构造函数)[根据Eric的注释修复]。C#keywordstatic只是这方面的简写,它还迫使您将所有成员都设置为静态,但对于API客户端来说,这是完全一样的 考虑到WPF(当

我在reflector中浏览了colors类的源代码,它只是一个密封类。但所有成员都是静态的。那么为什么有人要创建Colors类的副本呢

它位于:

System.Windows.Media.Colors

静态类只是一个密封的抽象类,没有构造函数的私有构造函数(如中所示,在任何可访问级别都没有构造函数,甚至没有编译器生成的构造函数)[根据Eric的注释修复]。C#keyword
static
只是这方面的简写,它还迫使您将所有成员都设置为静态,但对于API客户端来说,这是完全一样的


考虑到WPF(当时是Avalon)的工作在.NET2.0发布之前就开始了,所以这个特定的类可能是在
静态类出现之前编写的。或者作者根本没有意识到这种语言特性。

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

公共静态颜色AliceBlue{get;}

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

假设您正在创建一个以颜色为参数的API,如果颜色是一个静态类,它会是什么样子

可以说不同的颜色应该是不同的类型(也可以说是静态的),而不是颜色类的不同实例。即使在这种情况下,颜色也不应该是静态类,因为您希望为各个颜色类创建一个基色类,并自动将基色类设置为静态将使其密封


有人可能仍然认为颜色应该是一个名称空间,单个颜色应该是静态类。我会简单地让他们想象一下API会是什么样子:)

因为一个包含所有静态成员和私有构造函数的
密封的
类构成了某些性能增强,因为
IL
是为使用
静态
类而形成的,而不是
密封的
类,事实上,静态类在IL中获得
抽象
修饰符,以防止在
密封
类没有的地方调用new


他说的不是
Color
class(它也在那里,不是静态的)。他说的是
颜色
类,它的存在仅仅是为了提供像
红色
绿色
这样的成员-它在WPF中是一个单独的类。哦。。。我懂了。谢谢你的评论。我把原来的问题逐字逐句地理解,弄糊涂了。在这种情况下,我同意颜色可能是一个静态类。你的第一段是不正确的。静态类不是作为带有私有构造函数的密封类实现的。相反,静态类是一个没有构造函数的密封抽象类如果需要,它可以初始化任何静态成员,CLR保证在引用任何成员或类型本身之前,每个AppDomain调用它一次。为了澄清潜在的误解:Chansik Im指的是静态构造函数(.cctor),Eric Lippert只指的是实例构造函数(.cctor).IL的形成方式存在差异。由于
abstract
修饰符,无法实例化新的静态类。请看我的答案。成员都是静态的,因此您不需要实例化副本,而且您不能实例化副本,因为构造函数不能通过常规方法使用。