我们可以创建名为"class"的类吗?

Jin*_*ain 6 c#

让我们忘记为什么我需要这个.

我们可以创建一个名为"class"的类.

下面的代码导致编译错误,因为class是一个reserve关键字.

public class class
{

}
Run Code Online (Sandbox Code Playgroud)

那么有什么黑客或方法可以欺骗C#编译器吗?:)

面试官在我的上一次采访中询问了这个问题,他告诉我这是可能的.

Tim*_*ter 21

你可以使用:

public class @class
{ 

}
Run Code Online (Sandbox Code Playgroud)

但是你为什么要这样呢?

C#关键词

关键字是预定义的保留标识符,对编译器具有特殊含义.它们不能用作程序中的标识符,除非它们包含@作为前缀.例如,@ if是有效的标识符,但如果不是因为if是关键字.


我从这个答案中学到的是,新的关键词不会全局添加,而只是作为上下文关键词,以避免破坏早期版本中编写的程序.您可以在上面的链接中找到一个列表.

有趣的是,这是有效的(更好的:编译)代码:

public class var
{
    public void foo()
    {
        var var = new var();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是另一个:

public class dynamic
{
    public void foo()
    {
        dynamic dynamic = new dynamic(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

但永远不要这样做.它将破坏您使用过vardynamic之前使用过的其他代码.

  • 这不是你想要的手写代码,但它可能经常发生在生成的代码中,即如果你有一个名为*Classes*,*Groups*的表,让ORM为它生成代码 (3认同)
  • @JineshJain重要的是要注意`@`在C#编译器级别被"解释".在编译时,函数将是`class`,而不是`@class`(如果你反汇编代码,你可以看到它)参见例如http://goo.gl/mmyLQU (2认同)

Jen*_*iya 8

另一种选择是通过Unicode

using System;

public class Program
{
    public static void Main()
    {
        cl\u0061ss a = new cl\u0061ss();
        Console.WriteLine(a.GetType().Name);
    }
}

public class cl\u0061ss
{


}
Run Code Online (Sandbox Code Playgroud)

注意:Console.WriteLine()将打印课程

DotNetFiddle链接在这里.