可以在C#中的任何类外定义什么?

时间:2017-03-31 14:17:47

标签: c#

我听说了

  • 在Java中,所有内容都在类中定义,除了类本身。

  • C#和Java是非常相似的语言。

所以我认为C#的情况是一样的,直到我看到两个例子,其中没有在任何类中定义枚举类型和委托类型:

using System; 
enum Color 
{ 
  Red, 
   Green, 
   Blue 
} 
class Test 
{ 
  static void PrintColor(Color color) { 
    switch (color) { 
      case Color.Red: 
        Console.WriteLine("Red"); 
        break; 
      case Color.Green: 
        Console.WriteLine("Green"); 
        break; 
      case Color.Blue: 
        Console.WriteLine("Blue"); 
        break; 
      default: 
        Console.WriteLine("Unknown color"); 
        break; 
    } 
  } 
  static void Main() { 
    Color c = Color.Red; 
    PrintColor(c); 
    PrintColor(Color.Blue); 
  } 
} 

using System; 
delegate double Function(double x); 
class Multiplier 
{ 
  double factor; 
  public Multiplier(double factor) { 
    this.factor = factor; 
  } 
  public double Multiply(double x) { 
    return x * factor; 
  } 
} 
class Test 
{ 
  static double Square(double x) { 
    return x * x; 
  } 
  static double[] Apply(double[] a, Function f) { 
    double[] result = new double[a.Length]; 
    for (int i = 0; i < a.Length; i++) result[i] = f(a[i]); 
    return result; 
  } 
  static void Main() { 
    double[] a = {0.0, 0.5, 1.0}; 
    double[] squares = Apply(a, Square); 
    double[] sines = Apply(a, Math.Sin); 
    Multiplier m = new Multiplier(2.0); 
    double[] doubles =  Apply(a, m.Multiply); 
  } 
} 

那么可以在C#中的任何类之外定义什么?

基于上面的例子,可以在任何类之外定义任何类型的定义吗?

感谢。

1 个答案:

答案 0 :(得分:1)

根据C#规范, B2.6命名空间

  
      
  • 编译单元:
      extern-alias-directives opt using-directives opt global-attributes opt
          namespace-member-declarations opt
  •   
  • 命名空间声明:
      namespace qualified-identifier namespace-body; opt
  •   
  • 合格标识符:
      标识
      限定标识符。标识符
  •   
  • 名称空间结构体:
      {extern-alias-directives opt using-directives opt namespace-member-declarations opt }
  •   
  • 的extern别名指令:
      的extern别名指示
      extern-alias-directives extern-alias-directive
  •   
  • 的extern别名指示:
      外部别名标识符;
  •   
  • using指令:
      using指令
      using-directives using-directive
  •   
  • 使用指示符:
      使用别名指令
      using-namespace-directive
  •   
  • 使用别名指示:
      使用identifier = namespace-or-type-name;
  •   
  • 使用名称空间指令:
      使用namespace-name;
  •   
  • 命名空间成员声明:
      命名空间成员声明
      namespace-member-declarations namespace-member-declaration
  •   
  • 命名空间成员声明:
      命名空间声明
      type-declaration
  •   
  • 类型声明:
      类声明
      结构声明
      接口声明
      枚举声明
      委托声明
  •   
  • 合格别名构件:
      identifier :: identifier type-argument-list opt
  •   

根据规则 namespace-member-declaration ,可以将它们放在C#的任何类之外

  

命名空间声明
    类型声明

名称空间类型

并且输入包含:

  

类型声明:
    类声明
    结构声明
    接口声明
    枚举声明
    代表声明

所以答案是名称空间结构接口枚举委托声明。注意我不认为指令(如 using-alias-directive )作为定义。

如果您使用的是VS2017,则可以在C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC#\Specifications\1033中找到规范文件。