質問

VB.NETで何も返す構造と機能を使用して、いくつかの頭痛があります。

このコードでここで説明してみましょう。

Public Class Form1
    Structure Test
        Dim field1 As String
    End Structure

    Private Function Foo() As Test
        Return Nothing
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim st As Test = Foo()
    End Sub
End Class

前のコードでは、foo関数の結果として何も返さないとき、私はそれを期待する st何もない. 。しかし、これは起こることではありません。

次に、MSDNドキュメントで見つけました:

変数に何も割り当てられないと、宣言されたタイプのデフォルト値に設定されます。そのタイプに変数メンバーが含まれている場合、それらはすべてデフォルト値に設定されます。

それで、私はそれを割り当てるときにそれを発見しました 何もない 構造に対して、すべてのメンバーは、構造体自体ではなく、デフォルト値に設定されます。

また、私は作ろうとしました st 宣言することによる無効なタイプ:

    Dim st As Nullable(Of Test) = Foo()  

しかし、それでも私は確認できません st 使用することは何もありません:

    If st Is Nothing Then  

また

    If st.Equals(Nothing) Then

だから、質問:
1-割り当てることは可能ですか 何もない 構造に、そのメンバーではありませんか?
2-戻り構造値があるかどうかを確認するにはどうすればよいですか 何もない?

役に立ちましたか?

解決

構造は値の種類であり、何もできません。 Nullableタイプは問題を解決し、タイプ名の後に疑問符を付けて、それを短くてきれいにすることができます。これが例です:

Module Module1

    Structure Test
        Dim field1 As String
    End Structure

    Private Function Foo() As Test?
        Return Nothing
    End Function

    Sub Main()
        Dim st As Test? = Foo()
        Debug.Assert(st is Nothing)
    End Sub

End Module

他のヒント

最初の2つの次のメソッドは、.NETフレームワークで頻繁に使用されます。使用する方法は、要件に依存します。構造がまれにテストされていれば、方法#3を使用します。頻繁にテストするには、方法#2が「空の」テストに適していない場合は、方法#1を使用します。たとえば、 Point 構造は空の点を{x = 0、y = 0}として定義しますが、これは正しいとは思いません。したがって、ポイント構造実装で最初の方法を使用します。

方法1:定義します Empty 比較テストのテスト

共有を追加します Test 空の比較に使用します。

Structure Test
    Public Shared Empty As Test = New Test
    Dim field1 As String 
End Structure 

テスト:

If st = Test.Empty Then

方法2:定義します IsEmpty テスト用のプロパティ

定義します IsEmpty 構造の内部状態に基づくプロパティ。

Structure Test 
    Public ReadOnly Property IsEmpty As Boolean
        Get
            Return Len(field1) = 0
        End Get
    End Property
    Dim field1 As String 
End Structure 

テスト:

If st.IsEmpty Then

方法3:(tの)ヌル可能な使用

次のように定義します:

Dim st As Test? = Foo() 
'--or--
Dim st As Nullable(Of Test) = Foo()

テスト:

If st Is Nothing Then
'--or--
If st.HasValue = False Then

ノート

上記のコードをテストしていないため、コードライブラリにアクセスできません。

インスピレーション

Microsoft'sをご覧ください PointColor 公開されたソースコードを使用する、または使用する構造 .NETリフレクター.

「構造には何も、そのメンバーにはない」などの概念はありません。

それはあなたが見ているべきであるように非常に聞こえます Nullable値タイプNullable(Of T) - 値タイプに「実際の」値がないことを表すことができる必要がある場合、それは 正確に それが発明された理由。

検討 Byte 例えば。 a Byte 値は256値(0-255)のいずれかを持つことができます。値を割り当てる場合 Nothing, 、それは実際に0になります。 バイトとして. 。私はそれがやや残念なVBと考えています します 使用させてください Nothing ここで、実際に...哲学的に「欠落」値と値0は非常に異なるものであるためです。

とにかく、nullable値タイプ「通常」の値タイプをラップし、追加のブール値を提供して、あるかどうかを言う 本当 存在する有用な価値。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top