为什么不执行任何操作的语句不会引发异常(或警告开发人员)?

时间:2009-11-20 18:13:23

标签: .net vb.net exception self-reference language-specifications

我曾经被VB.NET中的语句(不确定C#中是否存在这种效果)被咬了几次似乎是自引用的,但是当它们被执行时,它们实际上并没有做任何事情因为他们需要一个目标而一个没有提供。例如:

Dim MyString as string = "String to test"

' Neither of these lines do anything '
MyString.Replace(" ", "-")
MyString.Substring(0,5)

' This will return the original string, because neither statement did anything '
Messagebox.Show(MyString)

在这两种情况下,似乎都没有打扰.NET语句需要一个目标来分配结果,我不给它一个。有没有理由说IDE /编译器没有警告我这种效果,或者没有抛出异常“StatementDoesntDoAnything”?由于代码是以永远不会改变任何东西的方式形成的,所以它显然是错误输入的。

8 个答案:

答案 0 :(得分:4)

是的,如果没有副作用的方法可以使用某种[NoSideEffectsAttribute()]进行标记,以便像编译器这样的工具可以警告你,那将是很好的,但目前我并不知道这样的事情。< / p>

但你可以尝试使用FxCop,它可以在.NET程序集上发现许多细微的编程错误。

答案 1 :(得分:3)

很难说忽略返回值是不可取的,因为有些函数会产生一些副作用并返回一个值。

“仅仅”返回值的函数必须标记为让编译器检查它们,并且这不是优先级或者被认为具有足够的投资回报(显然,否则它们已经完成了它:)。

答案 2 :(得分:2)

在许多情况下,方法返回可由程序员选择处理的值。编译器无法知道此特定方法不执行任何操作。它可能会产生副作用,而且您选择不对方法的返回值做任何事情这一事实必须是您自己的一个有意义的决定。

如果编译器选择警告您发生了这种情况,那么您将收到太多错误警告。

答案 3 :(得分:1)

编译器通常很难确定函数是否“执行某些操作”。除非编译器执行严格的Inter-Procedural Analysis(IPA),否则无法确定函数调用是否具有副作用。

IPA是一个缓慢的过程,会显着增加编译器的内存需求,因此默认情况下大多数编译器都不会执行此操作。

答案 4 :(得分:0)

这是来自C,C ++的继承行为,并且是orioginally完成的,因此您可以选择是否使用函数/方法的返回值...当您编写一个函数/方法来执行一堆东西时然后返回一些值,当你调用它时,你可以选择写

variableName = functionName([parameterlist]);  

如果你想在某些东西中使用returnb值,或者只是

functionName([parameterlist]);  

如果你不这样做。

对于没有副作用的函数方法(如你提到的那些),如你所指出的,这没有多大意义,但是为新语言改变它会违背很多其他语言的长期历史达到这个标准......

答案 5 :(得分:0)

我不确定是否还有另一个关键词强制或不将返回值放入变量中因各种原因是个好主意

1)假设您在返回值为optinal时添加关键字(因此暗示它通常是强制性的)会导致大量代码停止编译或发出大量警告

2)假设你做了相反的事情,在强制返回值时添加一个关键字,有些人只会使用虚拟变量来存储它们并继续使用它的方式。

3)我认为很多人不会花时间思考返回值是否可选。在某些情况下,我承认它是给定的,但并非总是如此。

答案 6 :(得分:0)

考虑方法Dictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value):它检查密钥是否在字典中,如果是,则将值放入out参数。返回值是bool,表示操作是否成功。有时你关心;有时候你没有。对于像这样的方法,我认为这是一种非常被接受的方法;如果编译器强迫您将返回值赋给变量,那么人们会有很多这样的代码:

int someValue = 0;
bool discard = IntDictionary.TryGetValue("key", out someValue);

// I don't even care if discard is true or false;
// someValue will be 0 if it wasn't in IntDictionary

答案 7 :(得分:-1)

  

我被咬了几次。

得出结论,而不是

  VB.NET中的

语句......实际上并没有做任何事情

但实际上已有很好的记录。