2012-02-27 46 views
0

我有一些我继承的代码,其中有很多警告我想删除。许多形式为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 Nothingreturn ""

我可以用什么来摆脱这个警告,同时保证代码运行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 ...

回答

1

您需要必须有回报声明! (即使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(这是一种汇编程序)等低级语言要严格得多。

+0

实际上,这在经验上不是真实的。这段代码编译并运行正常,没有返回语句,它只是抛出编译器警告(而不是错误)。上述两个建议似乎并没有像空洞的吸气者那样编译到同一个IL中,这就是为什么我对这两个之一进行改变有点紧张(尽管我的直觉说第一个将是最好的)。 – Chris 2012-02-27 17:47:36

+0

一个没有返回语句的getter或函数并没有多大意义。如果你没有指定return语句,VB非常宽容并且返回一个类型的默认值;然而,这是一种非常糟糕的编程风格,并没有表达你的意图。读取代码的人不知道代码是否不完整,或者是否应该返回Nothing。因此编译器的警告。我强烈要求你添加一个'Return Nothing'! – 2012-02-27 17:55:27

+0

如果无法获得符合相同内容的代码,有人可能会告诉编译器不要警告我某些代码块,因此我可以说“我知道这是错误的,但我不在乎,请不要再告诉我“或类似的东西... – Chris 2012-02-27 17:55:41

1

ldloc.0指令正在加载一个局部变量,然后在下一个语句中返回该变量。代码是空的,没有声明任何变量,所以你可能会想知道这是什么。这个幻像本地是VB自动创建的与函数或属性同名的变量。如果你有一个没有返回的分支,它会为你返回这个变量。由于大多数人会使用Return声明并创建自己的变量,因此这主要是传统/兼容性功能。

由于这个变量只是被定义和返回而没有被赋值,所以你可以看到Oliver对他的回答的评论VB会返回该类型的默认值是正确的。 Return Nothing是这种情况的最佳匹配。 IL可能不同,但行为将是相同的。 (机器代码可能会出现相同的结果,但我不试图猜测JITter的作用。)

+0

感谢您的确认。我需要学习IL,所以我可以自己理解这些东西。 ;-) – Chris 2012-02-28 09:29:21

相关问题