1

我已经被 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”?由于代码的形成方式永远不会改变任何东西,因此很明显是输入错误。

4

8 回答 8

4

是的,如果没有副作用的方法可以用某种 [NoSideEffectsAttribute()] 标记,这样编译器之类的工具可以警告你,那就太好了,但目前我不知道这样的事情。

但是你可以试试 FxCop,它可以在 .NET 程序集中发现很多细微的编程错误。

于 2009-11-20T18:20:34.307 回答
3

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

“仅仅”返回值的函数必须被标记为让编译器检查它们,并且这不是优先级或被判断为具有足够的投资回报(显然,否则他们会这样做:) .

于 2009-11-20T18:21:10.673 回答
2

在许多情况下,方法返回的值可由程序员选择性地处理。编译器无法知道这个特定的方法什么都不做。它可能会产生副作用,并且您选择对方法的返回值不做任何事情的事实必须是您有意识的决定。

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

于 2009-11-20T18:17:43.610 回答
1

编译器通常很难确定函数是否“做某事”。除非编译器进行严格的过程间分析 (IPA),否则无法确定函数调用是否有副作用。

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

于 2009-11-20T18:27:54.867 回答
0

这是从 C、C++ 继承的行为,最初这样做是为了让您可以选择是否使用函数/方法的返回值......当您编写一个执行一堆东西然后返回的函数/方法时一些值,当你调用它时,你可以选择写

variableName = functionName([parameterlist]);  

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

functionName([parameterlist]);  

如果你不这样做。

对于您提到的没有副作用的函数方法(如您提到的那些),这不太有意义,但是将其更改为新语言将与许多其他符合此标准的语言的悠久历史背道而驰...

于 2009-11-20T18:23:57.487 回答
0

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

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

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

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

于 2009-11-20T18:26:19.817 回答
0

考虑该方法Dictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value):它检查键是否在字典中,如果是,则将值放入out参数中。返回值是bool表示操作是否成功的a。有时你在乎;有时你不知道。我认为对于这样的方法,这是一种相当受欢迎的方法;如果编译器强迫你将返回值分配给一个变量,人们会有很多这样的代码:

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
于 2009-11-20T18:33:22.223 回答
-1

我被咬过几次

妄下结论,而不是

VB.NET 中的语句......那......实际上并没有做任何事情

但这实际上是有据可查的。

于 2009-11-20T18:26:31.707 回答