为什么System.Activator在.NET Core中可见为静态类?

时间:2017-08-15 20:01:12

标签: c# .net reflection .net-core

根据this StackOverflow question,可以使用Type.IsAbstractType.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中,这个类实际上是密封的:

Activator is Sealed in .NET

但是,从.NET核心元数据来看,它似乎是静态的:

.NET Core Activator is Static

现在,实际问题应该是:为什么在.NET Core中出现Activator作为静态类(在NetStandard中也是如此,顺便说一句。),但实际上是一个密封的类?

3 个答案:

答案 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 assemblypart 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