在 C# 中声明 class 时可以拥有的最大有效修饰符数是多少?

What is max number of valid modifiers you can have while declaring a class in c#?

这个问题更多是出于好奇

修饰符是指在声明 class 之前添加的关键字。

例如

//1       2        3             
public abstract partial class Foo
{

}

这有 3 个修饰符 publicabstractpartial

从这个问题的角度来看,零修饰符类似于

class Foo
{

}

声明时 class 的名称前最多可以有多少个有效修饰符?

最大数量是...

5!

(如果你算的话是 6 unsafe

根据 here,class 声明如下所示:

class_declaration
    : attributes? class_modifier* 'partial'? 'class' identifier type_parameter_list?
      class_base? type_parameter_constraints_clause* class_body ';'?
    ;

您可能不会将属性算作 "modifiers",但您可能 partial 关键字算作 "class modifier",虽然它不是实际的 class_modifier.

class_modifier的名单是:

class_modifier
    : 'new'
    | 'public'
    | 'protected'
    | 'internal'
    | 'private'
    | 'abstract'
    | 'sealed'
    | 'static'
    | class_modifier_unsafe
    ;

我们知道最长的访问修饰符是protected internal,所以我们可以忽略所有的访问修饰符:

class_modifier
    : 'new'
    | 'abstract'
    | 'sealed'
    | 'static'
    | class_modifier_unsafe
    ;

sealedstaticabstract只能选其一,所以剩下6个"keywords":

  • protected
  • internal
  • new
  • sealed/static/abstract
  • partial
  • unsafe

请注意 newprotected internal 只能在嵌套的 class 声明中使用。