2012-02-27 16 views
0

私はいくつかのコードを持っていますが、私は削除したいという警告がたくさんあります。多くのものはProperty '<propertyname>' doesn't return a value on all code pathsの形式です。私はそれがなぜこれを言っているのか知っている、私はちょうどこれを修正する正しい0インパクトの方法を決定しようとしている。プロパティに明示的な戻り値がない場合、それは何を返していますか?

元のコードはこれです:

Public ReadOnly Property LevelName As String 
    Get 
     Dim LevelName As String 
     Return LevelName 
    End Get 
End Property 

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

    End Get 
End Property 

私の最初の考えは、私はちょうどそこにReturn Nothing文を置くことができるが、私は、私は反射でそれをデコンパイルならば、それは私にこれを与え気づくということでした

私はこのコードを(ローカル変数名を変更して衝突を回避するように変更した)コードに入れておくと、値が割り当てられる前に使用されていると不平を言います。

LinqPadでILを分析しようとすると(このテストが良いかどうかわからない)、空の方法はReflectorが私に与えた上記と同じですが、return Nothingととは異なります。

コードが100%同じであることを保証しながら、この警告を取り除くために使用できるのは何ですか?

編集:は、私はLinqPadは、さまざまな状況のために私を与えていることをILを含めるしようと思いました。

空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

あなたはが必要ですにはreturn文があります! (VBは、あなたがそれを除外することができたとしても、プログラマとしての私の気持ちは1がここに属していなければならないことを私に言います。)

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

または

をILから逆コンパイル
Public ReadOnly Property LevelName() As String Implements IMember.LevelName 
    Get 
     Return "" 
    End Get 
End Property 

コードはしていませんなぜなら、ILではVBでは不可能なことができるからです。一般に、VBやC#のような高水準言語は、アセンブラやIL(アセンブラの一種)のような低レベル言語よりはるかに制限的です。

+0

実際は経験的に真実ではありません。このコードは、return文がなくてもコンパイルして正常に動作しますが、コンパイラの警告(エラーではありません)がスローされます。そして、上記の2つの提案は、空のゲッターと同じILにコンパイルされていないように見えます。なぜなら、私はこれら2つのうちの1つに変更を加えるのが少し緊張しているからです(私の本能は、 – Chris

+0

returnステートメントのないゲッターまたは関数は、あまり意味がありません。 VBは非常に寛容で、return文を指定しなければ型のデフォルト値を返します。しかし、これは非常に悪いプログラミングスタイルであり、あなたの意図を表現していません。コードを読んでいる誰かが、コードが不完全であるかどうか、または 'Nothing'を返すことになっているかどうかはわかりません。したがって、コンパイラの警告。 'Return Nothing'を追加することを強くお勧めします! –

+0

同じことをcompielsするコードを取得することは不可能な場合はいくつかのコードの特定のブロックについて私に警告しないようにコンパイラに指示することが可能ですので、私はちょうど "私はこれが間違っていることを知っているが、もう一度教えてくださいませんか "と似たようなものです... – Chris

1

命令ldloc.0命令は、ローカル変数をロードしており、次のステートメントで返されます。コードは空ですが、変数を宣言していないので、これが何であるか疑問に思うかもしれません。このファントムローカルは、VBが関数またはプロパティと同じ名前で自動的に作成する変数です。リターンのないブランチがあれば、この変数を返します。ほとんどの人がReturnステートメントを使用して独自の変数を作成するため、これはほとんどの場合従来の互換性/互換性の機能です。

この変数は定義されずに返されただけなので、VBの型のデフォルト値が返されると答えたOliverのコメントが正しいことがわかります。この場合はReturn Nothingが最適です。イリノイ州は異なるかもしれませんが、行動は同じです。 (マシンコードは同じになるかもしれませんが、私はJITterが何をしているのか推測しようとしません)。

+0

確認していただきありがとうございます。私はILを学ぶ必要があるので、私はこれらのことを自分で理解することができます。 ;-) – Chris

関連する問題