2015-03-31 88 views
6

让我忘记为什么我需要这个。我们可以创建名称为“class”的课程吗?

我们可以创建一个名为“class”的类。

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

public class class 
{ 

} 

所以有没有什么黑客或欺骗C#编译器的方法? :)

这个问题在面试官问我最后一次采访时,他告诉我这是可能的。

+2

你类应该具有大写名称'Class'反正。 – 2015-03-31 09:49:13

+0

添加到亚历克斯的好评 - _ [DO名**类**和名词或名词短语结构,使用** PascalCasing **。](https://msdn.microsoft.com/zh-cn/library/ms229040 %28V = vs.110%29。aspx)_ – MickyD 2015-03-31 09:51:41

回答

21

你可以使用:

public class @class 
{ 

} 

但是为什么你要吗?

C# Keywords

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


什么我已经从这个答案的教训是新的键字不会在全球范围内,但仅添加上下文关键字,以避免破坏写在早期版本的程序。您可以在上面的链接中找到一个列表。

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

public class var 
{ 
    public void foo() 
    { 
     var var = new var(); 
    } 
} 

这里的另一个问题:

public class dynamic 
{ 
    public void foo() 
    { 
     dynamic dynamic = new dynamic(); 
    } 
} 

但从来没有做到这一点。它会破坏你之前使用过vardynamic的其他代码。

+3

这不是你想要的手写代码,但它可以在经常生成的代码中发生,也就是说,如果你有一个名为* Classes *,* Groups *等的表,并让ORM生成代码它 – SWeko 2015-03-31 09:50:16

+0

正如我上面提到的那个问题在我的一次采访中被问到,所以我一直在寻找解决方案。谢谢它的作品。只需等待15分钟即可接受答案。 – 2015-03-31 09:50:29

+2

@JineshJain重要的是要注意在C#编译器级别“@”是“解释”的。当它被编译时,函数将是'class',而不是'@ class'(如果反汇编代码,你可以看到它)例如http://goo.gl/mmyLQU – xanatos 2015-03-31 09:54:05

8

另一种替代方案是通过统一

using System; 

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

public class cl\u0061ss 
{ 


} 

注意Console.WriteLine()将打印

DotNetFiddle链接here

+1

应该去混淆的C#比赛 – DrKoch 2015-03-31 09:58:54

+0

@DrKoch哈哈...我刚刚从msdn中获得了这个想法链接https://msdn.microsoft.com/zh-cn/library/aa664670(v=vs.71).aspx – 2015-03-31 10:02:07

+0

并非所有可能做到的事情都是一个好主意...... – DrKoch 2015-03-31 10:03:47

-3

大多数程序员在变量名称的开头使用下划线'_',或者如果它是保留字,例如

public class _class 
{ 

} 

变量声明例如

int _int; 
+1

但是,然后根据OP的访问者的要求,类名是“_class”而不是“class”。 – 2016-01-02 10:50:48

相关问题