我有一些我继承的代码,它有很多我想要删除的警告。许多形式为Property '<propertyname>' doesn't return a value on all code paths
。我知道为什么会这样说,我只是想确定解决这个问题的正确方法是什么。
原始代码是:
Public ReadOnly Property LevelName() As String Implements IMember.LevelName
Get
End Get
End Property
我的第一个想法是我可以在那里放一个Return Nothing
语句,但我注意到如果我在Reflector中反编译它会给我这个:
Public ReadOnly Property LevelName As String
Get
Dim LevelName As String
Return LevelName
End Get
End Property
不幸的是,如果我把它放在我的代码中(更改了局部变量名以避免冲突),那么它会在它被赋值之前抱怨它被使用。
尝试分析LinqPad中的IL(不确定这是否是一个好的测试)显示空方法与Reflector给我的上述方法相同,但它与return Nothing
和{{1}不同}}
在保证代码运行100%的同时,我可以使用什么来消除此警告?
编辑:我以为我会包含LinqPad为各种情况提供的IL:
清空:
return ""
返回显式空字符串:
IL_0000: ldloc.0
IL_0001: ret
显式无效:
IL_0000: ldstr ""
IL_0005: ret
我不确定这里有IL_0000: ldnull
IL_0001: ret
做什么。我想知道它是否试图从寄存器中得到一些东西,如果因此在这种情况下与ldnull相同,但我还没有真正研究过IL ...
答案 0 :(得分:1)
你必须有一个return语句! (即使VB允许你把它留下来,我作为程序员的感觉告诉我,一个人必须属于这里。)
Public ReadOnly Property LevelName() As String Implements IMember.LevelName
Get
Return Nothing
End Get
End Property
或者
Public ReadOnly Property LevelName() As String Implements IMember.LevelName
Get
Return ""
End Get
End Property
从IL反编译的代码并不总是有效,因为在IL中你可以做一些在VB中无法实现的事情。通常,像VB或c#这样的高级语言比汇编程序或IL(它是一种汇编程序)等低级语言更具限制性。
答案 1 :(得分:1)
ldloc.0
指令正在加载一个局部变量,然后在下一个语句中返回。代码是空的,不会声明任何变量,所以你可能想知道这是什么。这个幻像本地是VB自动创建的变量,其名称与函数或属性相同。如果你有一个没有返回的分支,它会为你返回这个变量。这大多是现在的遗留/兼容性功能,因为大多数人会使用Return
语句并创建自己的变量。
由于这个变量只是在没有被分配的情况下被定义和返回,你可以看到Oliver对他的答案的评论是VB将返回该类型的默认值是正确的。 Return Nothing
是此案例的最佳匹配。 IL可能不同,但行为将是相同的。 (机器代码可能会相同,但我不会猜测JITter的作用。)