根据this StackOverflow question,可以使用Type.IsAbstract
和Type.IsSealed
属性来确定某个类是否为静态。但是,请看下面的测试:
[Fact]
public void ActivatorNotAbstract()
{
var activatorType = typeof(Activator);
Assert.True(activatorType.IsClass);
Assert.True(activatorType.IsSealed);
Assert.True(activatorType.IsAbstract);
}
此测试失败,因为最后一个断言不正确,尽管System.Activator
被定义为静态类。这对于.NET Core 2.0(可能是以前的版本)以及.NET 4.5(以及可能还有其他版本)都是如此。您还可以在this GitHub repo中找到上述测试。
为什么Activator
在这方面很特别?我在BCL中找不到任何其他类似行为的静态类。
从Camilo回答后编辑
你是对的,我看起来并不彻底 - 在.NET中,这个类实际上是密封的:
但是,从.NET核心元数据来看,它似乎是静态的:
现在,实际问题应该是:为什么在.NET Core中出现Activator
作为静态类(在NetStandard中也是如此,顺便说一句。),但实际上是一个密封的类?
答案 0 :(得分:3)
如果您指的是System.Activator
类,那么它根本不是静态的,look at the .NET source code
public sealed class Activator : _Activator
因此:
答案 1 :(得分:3)
这里的问题是你假设如下:
虽然System.Activator被定义为静态类
有趣的是,这在技术上是正确的,因为您编译的库将System.Activator
定义为静态类。例如,可以在source code of the System.Runtime reference assembly或part of the netstandard.dll
reference assembly source code中看到。
但是,这些库是一个编译时接口,实际的运行时实现可能会从这个声明中略微推导出来。
事实上,.NET Core和.NET Framework都将该类实现为public sealed class Activator
(.NET Core)或public sealed class Activator : _Activator
(.NET Framework)。
此实施会导致IsAbstract
返回false
。
答案 2 :(得分:-3)
如果一个类被密封,则意味着它不能被子类继承。如果一个类是抽象的,则意味着该类只能通过调用它的子类来使用。基本上抽象和密封是相互排斥的。
请参阅:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/sealed