2017-03-31 36 views
0

听说什么可以在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#中的任何类以外定义?

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

谢谢。

+0

在java中,一切都是对象。 – Omore

+2

一个类是一个类型。类型可以在名称空间中或在命名空间中的类(嵌套)中全局定义。我不确定我是否理解你在这里问的问题...... –

+2

enum和delegate是一个类型,任何类型都可以在全局范围内定义。 –

回答

1

按照C#规范,在B2.6命名空间

  • 编译单元:
    的extern别名指令选择 using指令选择全局属性 opt
    namespace-member-declarations opt
  • namespace-declaration:
    namespace qualified-identifier namespace-body; 选择
  • 合格标识符:
    标识符
    合格标识符。标识符
  • 名称空间结构体:
    {的extern别名指令选择 using指令选择命名空间成员声明选择}
  • 的extern别名指令:
    的extern别名指示
    extern-alias-directives extern-alias-directive
  • extern-alias-directive:
    extern alias identifier;
  • using指令:
    using指令using指令using指令
  • using指令

    使用别名指令
    using命名空间指令
  • 使用别名指令:
    using identifier = namespace-or-type-name;使用namespace-directive:
    using namespace-name;
  • 命名空间成员声明:
    命名空间成员声明
    命名空间成员声明命名空间成员声明
  • 命名空间成员声明:
    命名空间声明
    类型声明
  • 类型声明:
    类声明
    结构声明
    接口声明
    枚举声明
    委托声明
  • 合格别名成员:
    标识符::标识符类型参数列表选择

根据规则命名空间成员声明 ,那些可以放在C#以外的任何类中是

命名空间声明
类型声明

即,命名空间类型

和类型包括:

类型声明:
类声明
结构声明
接口声明
枚举声明
委托声明

所以答案是命名空间结构接口枚举委托声明。注意我不把这些指令看作是定义,如使用别名指令

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

相关问题