我有一些我继承的代码,其中有很多警告我想删除。许多形式为Property '<propertyname>' doesn't return a value on all code paths
。我知道为什么这么说,我只是想确定解决这个问题的正确的0影响方式。如果一个属性没有明确的返回它返回什么?
原始代码是这样的:
Public ReadOnly Property LevelName() As String Implements IMember.LevelName
Get
End Get
End Property
我首先想到的是,我可以把一个Return Nothing
声明在那里,但我发现,如果我在反光反编译它,它给了我这样的:
Public ReadOnly Property LevelName As String
Get
Dim LevelName As String
Return LevelName
End Get
End Property
不幸的是,如果我把它放在我的代码中(改变了本地变量的名字以避免冲突),它会在它被赋值之前抱怨它正在被使用。
试着在LinqPad中分析IL(不知道这是否是一个好的测试)显示空方法与Reflector给我的上面相同,但它不同于return Nothing
和return ""
。
我可以用什么来摆脱这个警告,同时保证代码运行100%一样?
编辑:我想我会包括IL是LinqPad是给我的各种情况:
空GET:
IL_0000: ldloc.0
IL_0001: ret
显式空字符串返回:
IL_0000: ldstr ""
IL_0005: ret
显式不返回:
IL_0000: ldnull
IL_0001: ret
我不确定ldloc.0
在这里做什么。我想知道它是否试图从一个寄存器中得到一些东西,如果在这种情况下它与ldnull是一样的,但我还没有真正研究过很多IL ...
实际上,这在经验上不是真实的。这段代码编译并运行正常,没有返回语句,它只是抛出编译器警告(而不是错误)。上述两个建议似乎并没有像空洞的吸气者那样编译到同一个IL中,这就是为什么我对这两个之一进行改变有点紧张(尽管我的直觉说第一个将是最好的)。 – Chris 2012-02-27 17:47:36
一个没有返回语句的getter或函数并没有多大意义。如果你没有指定return语句,VB非常宽容并且返回一个类型的默认值;然而,这是一种非常糟糕的编程风格,并没有表达你的意图。读取代码的人不知道代码是否不完整,或者是否应该返回Nothing。因此编译器的警告。我强烈要求你添加一个'Return Nothing'! – 2012-02-27 17:55:27
如果无法获得符合相同内容的代码,有人可能会告诉编译器不要警告我某些代码块,因此我可以说“我知道这是错误的,但我不在乎,请不要再告诉我“或类似的东西... – Chris 2012-02-27 17:55:41