Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如果属性没有显式返回,它返回什么?_Vb.net - Fatal编程技术网

Vb.net 如果属性没有显式返回,它返回什么?

Vb.net 如果属性没有显式返回,它返回什么?,vb.net,Vb.net,我继承了一些代码,其中有很多警告,我想删除它们。许多属性的形式为属性“”,它不会在所有代码路径上返回值。我知道它为什么这么说,我只是想确定解决这个问题的正确方法是什么 原始代码如下: Public ReadOnly Property LevelName() As String Implements IMember.LevelName Get End Get End Property 我的第一个想法是,我可以在那里放一个不返回任何内容语句,但我注意到,如果我在Reflector

我继承了一些代码,其中有很多警告,我想删除它们。许多属性的形式为
属性“”,它不会在所有代码路径上返回值。我知道它为什么这么说,我只是想确定解决这个问题的正确方法是什么

原始代码如下:

Public ReadOnly Property LevelName() As String Implements IMember.LevelName
    Get

    End Get
End Property
我的第一个想法是,我可以在那里放一个
不返回任何内容
语句,但我注意到,如果我在Reflector中反编译它,它会给我以下信息:

Public ReadOnly Property LevelName As String
    Get
        Dim LevelName As String
        Return LevelName
    End Get
End Property
不幸的是,如果我把它放在我的代码中(为了避免冲突而更改了局部变量名),它就会抱怨在给它赋值之前它正在被使用

尝试在LinqPad中分析IL(不确定这是否是一个好的测试)会发现空方法与Reflector给我的上述方法相同,但它不同于
不返回任何内容
返回“”

在保证代码运行100%相同的情况下,我可以使用什么来消除此警告

编辑:我想我应该包括LinqPad为各种情况提供的IL:

空获取:

IL_0000:  ldloc.0     
IL_0001:  ret      
返回的显式空字符串:

IL_0000:  ldstr       ""
IL_0005:  ret         
显式不返回任何内容:

IL_0000:  ldnull      
IL_0001:  ret    

我不确定ldloc.0在这里做什么。我想知道它是否试图从寄存器中获取空值的内容,因此在这种情况下是否与ldnull相同,但我以前从未真正研究过IL…

您必须有一个返回语句!(即使VB允许您省略它,作为程序员,我的感觉告诉我,一个人必须属于这里。)



从IL反编译的代码并不总是有效的,因为在IL中你可以做VB中不可能做的事情。一般来说,像VB或c#这样的高级语言比像assembler或IL(这是一种汇编程序)这样的低级语言要严格得多。

ldloc.0
指令正在加载一个局部变量,然后在下一个语句中返回。代码是空的,没有声明任何变量,因此您可能想知道这是什么。此幻影局部变量是VB自动创建的变量,其名称与函数或属性相同。如果您有一个没有返回的分支,它会为您返回这个变量。到目前为止,这主要是一个遗留/兼容性特性,因为大多数人将使用
Return
语句并生成自己的变量


因为这个变量只是定义并返回的,没有被赋值,所以您可以看到Oliver对他的答案的评论,VB将返回类型的默认值是正确的<代码>不返回任何内容
是这种情况下的最佳匹配。IL可能不同,但行为将是相同的。(机器代码可能是相同的,但我不想猜测抖动的作用。)

事实上,这在经验上是不正确的。这段代码在没有返回语句的情况下编译并运行良好,它只是抛出编译器警告(而不是错误)。上面的两个建议似乎不像空的getter编译成同一个IL,这就是为什么我有点担心对这两个建议中的一个进行更改(尽管我的直觉认为第一个最好)。getter或没有return语句的函数没有多大意义。VB非常宽容,如果不指定return语句,它会返回类型的默认值;然而,这是一种非常糟糕的编程风格,不能表达您的意图。阅读代码的人不知道代码是否不完整,或者是否应该返回
Nothing
。因此,编译器发出警告。我强烈建议您添加一个
不返回任何内容
!如果不可能将编译器编译成相同的代码,是否可以在某些情况下告诉编译器不要警告我某些代码块,这样我就可以说“我知道这是错误的,但我不在乎,请永远不要再告诉我”或类似的话……可悲的是,我就是那个家伙。这是我继承的代码,我试图让它在编译时停止到处发出警告。可悲的是,正如你所说,我不知道它现在应该返回或正在返回什么,这就是为什么我对分配给它一些东西感到非常紧张的原因<代码>不返回任何内容
似乎是我想要的,您的评论“VB非常宽容,如果您不指定返回语句,则返回类型的默认值”似乎是我想要的答案。你不认为你有一个引用吗?这里唯一重要的问题是,函数返回哪个值?它不返回
Nothing
,而不返回语句。因此,改进getter并添加return语句不会带来任何风险。编译器将一个不可见的
Dim LevelName添加为字符串
(用
Nothing
初始化),因为在VB6中,您通过将其分配给该变量返回了一个值。此变量在VB.NET中已过时,请确认。我需要学习IL,这样我才能自己理解这些事情
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