2012-07-25 59 views
1

说我有两种方法,一种叫另一种。第二种方法的代码会产生编译时错误。既然它没有被调用,为什么编译器仍然懒得去处理它呢?为什么c#编译器仍然从未使用的方法读取编译代码?

void method1() 
{ 
    var i = 1; 
    //method2(); 
} 

void method2() 
{ 
    int i = "2"; 
} 
+4

编译器不能保证它永远不会被调用。此外,你真的不想留下这样的错误,只会让他们以后再回来咬你。 – BoltClock 2012-07-25 14:33:28

+0

它不能保证它永远不会被调用,但它知道(我假设这是)它现在没有被调用。所以我想我很好奇为什么编译器不会跳过它,直到有方法的已知调用。抛开代码或实践的质量,严格来自编译器的pov。 – 2012-07-25 14:39:01

+0

编译器不能认为它没有被称为“现在”。 – BoltClock 2012-07-25 14:42:05

回答

10

您不能确定别人不会在运行时使用反射调用该方法。你的代码必须编译或者它不是有效的代码 - 如果它从未被使用过......将它注释掉!

进一步来说:

基本上你是强类型的编译时间 - .NET将键入检查一切,确保你正在试图做的是合法的,但是,你仍然可以在运行时抛出异常由于空引用,不良铸件等等

思考是.NET框架,它允许开发者经由集元数据

反射允许检查一个组件类型的属性/字段/方法等等的部件运行时类型发现和这些类型的检查,它也允许调用方法/属性和字段的修改等等(你甚至可以在运行时创建新的通用类型或完全新的类型)。

换句话说,你不能保证你的代码认为不会被调用,不会在某个地方被调用。为使反思成为可能,每一位代码都需要有效且可编译

代码在运行时是否会成功是另一回事 - 但这就是我们进行异常处理的原因。

+2

不要评论它!这留下了可怕的遗留代码。删除它! – 2012-07-25 14:38:52

+0

我想这取决于你是否正在修复它,并需要在稍后的日期修复它。但开发人员真的有时间:D – Charleh 2012-07-25 14:40:41

1

然后如果其他人稍后使用您的编译代码并决定使用它呢?

即使使用私有方法反射也会使事情复杂化。

如果您不使用它,请将其丢失。 (或至少注释掉)

+0

我不关心这个例子,说明未来可能会发生什么,也可能不会发生在另一个程序员身上。除非这种“预警”是编译器为什么要处理未被调用的方法的原因。 – 2012-07-25 14:42:31

+1

仅仅因为你不关心,并不意味着编译器应该让它通过未经检查。编译器应该如何知道你打算在以后做什么。另外,为什么留下不能编译的存根代码?正确的行为是抛出新的NotImplementedException。 – KingCronus 2012-07-25 14:51:22