vb.net structs and Nothing-問題
-
02-10-2019 - |
質問
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をご覧ください Point
と Color
公開されたソースコードを使用する、または使用する構造 .NETリフレクター.
「構造には何も、そのメンバーにはない」などの概念はありません。
それはあなたが見ているべきであるように非常に聞こえます Nullable値タイプ と Nullable(Of T)
- 値タイプに「実際の」値がないことを表すことができる必要がある場合、それは 正確に それが発明された理由。
検討 Byte
例えば。 a Byte
値は256値(0-255)のいずれかを持つことができます。値を割り当てる場合 Nothing
, 、それは実際に0になります。 バイトとして. 。私はそれがやや残念なVBと考えています します 使用させてください Nothing
ここで、実際に...哲学的に「欠落」値と値0は非常に異なるものであるためです。
とにかく、nullable値タイプ「通常」の値タイプをラップし、追加のブール値を提供して、あるかどうかを言う 本当 存在する有用な価値。