我听说了
在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 :(得分: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
中找到规范文件。