0

これは非常に奇妙な質問です、あなたはそれがそうであると思うかもしれません。私はVB6からVB.NET2010への大規模な移行プロジェクトに取り組んでいます。VB6の一部として、NullString = ""として定義された定数があります。.NETでも同様の行に移行され、使用されます。私たちが抱えている問題は、このNullStringと比較されているRecordSet(DataTableの単なるラッパー)からの値を比較するときに、比較のためにエラーが発生することです。プロジェクトは活発に開発されているため、プラグマをほとんど理解していないがあまり高度ではない移行ツール(VB MIgration Partner)に依存する必要があります。クラス(NullStringClass)を作成し、「=」および「<>」演算子をオーバーロードしました。これにより、比較の問題が並べ替えられました。しかし、場所によってはsomeVar = NullStringがあり、someVarは文字列変数です。ここで、NullStringClassから文字列に変換できないエラーが発生します。

<System.Reflection.DefaultMember("Value")> _
Public Class NullStringClass

プロパティは次のように定義されます。

Public Property Value() As String
    Get
        Return ""
    End Get
    Set(ByVal value As String)

    End Set
End Property

しかし、それでも例外がスローされます。私の知る限り、これで問題が解決するはずですが、運がありません。それでも同じエラーが発生します。だから、私の質問は同じです。そのNullString変数をクラスに変換し、さまざまな比較(NullとNothingを含む)に演算子オーバーロードを使用し、文字列変数への通常の代入としても使用できる方法はありますか?例:

Dim s as String
s = NullString

以下と同様に機能するはずです:

If rsData("MyField").Value <> NullString Then
'Note: rsData("MyField").Value is DbNull

これが演算子のオーバーロードのサンプルです(誰かが興味を持っている場合)

Public Shared Operator <>(ByVal mmyVal As Object, ByVal objVal As NullStringClass) As Boolean
    If TypeOf mmyVal Is String Then
        Return (Not String.IsNullOrEmpty(mmyVal))
    Else 'If TypeOf mmyVal Is Object Then
        Return (Not IsDBNull(mmyVal))
    End If
End Operator

ありがとう、ニック

4

2 に答える 2

1

私は2日間苦労し、その「=」を機能させるために頭を悩ませた後、この質問をしました。(オペレーターのオーバーロードは1時間以内に正常に機能していました)。「s=NullString」を正しく取得するための解決策は、NullStringClassに暗黙の演算子を配置することでした。

Public Shared Widening Operator CType(ByVal obj As String) As NullStringClass
    Return New NullStringClass()
End Operator

Public Shared Narrowing Operator CType(ByVal obj As NullStringClass) As String
    Return String.Empty
End Operator

Narrowing Operatorだけで十分でしたが、Wideningも入れました(不要なため、本番コードでは削除されます)。これが私のような人に役立つことを願っています:-)

于 2012-07-12T08:17:47.423 に答える
1

vb.netでは、または初期化されていない値stringを保持する型の格納場所はnull、null文字列とは意味的に異なります。そのような保存場所をnullではないことがわかっている別の文字列と比較し、保存場所がnullの場合(例外をスローするのではなく)単にfalseを返すようにする場合は、式をとして記述できます"Whatever".Equals(storageLocation)。2つの文字列(どちらかまたは両方がnullである可能性があり、null文字列を互いに同等に比較するが、他の文字列(空の文字列を含む)とは比較しない)を比較する場合は、を使用できますString.Equals(string1, string2)。文字列がnullか空かを判断する場合は、次を使用できます。String.IsNullorEmpty(theString)。null文字列が空であると見なされるような方法で比較を実行する場合は、その方法で比較を実行する独自の静的比較を作成するか、またはを指定しstringて渡されたものを返す関数を作成できます。 -null以外の場合は文字列で、それ以外の場合は。を返しString.Emptyます。

うまくいけば、上記の1つがあなたが求めているものです。それらはVB6が「デフォルトのプロパティ」と呼ぶものとは何の関係もないことに注意してください、しかしあなたの質問はVB6プロパティ(そしてとの間の関連する区別)について尋ねているようには見えませLetSet

補遺

ほとんど通常の文字列のように使用できるが、デフォルトではではなく空の文字列になる文字列型が必要な場合はNothing、次のようなものを使用できる可能性があります(不完全ですが、良いスタートになるはずです)

Public Structure SafeString
    Implements IComparable(Of SafeString), IEquatable(Of SafeString)

    Dim _St As String

    Sub New(St As String)
        _St = St
    End Sub

    Public Overrides Function ToString() As String
        Return If(_St, "")
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return If(_St, "").GetHashCode()
    End Function

    Public Overrides Function Equals(obj As Object) As Boolean
        If obj Is Nothing OrElse Not (TypeOf (obj) Is SafeString) Then Return False
        Return If(_St, "") = If(CType(obj, SafeString)._St, "")
    End Function

    Public Function CompareTo(other As SafeString) As Integer Implements System.IComparable(Of SafeString).CompareTo
        Return If(_St, "").CompareTo(If(other._St, ""))
    End Function

    Public Overloads Function Equals(other As SafeString) As Boolean Implements System.IEquatable(Of SafeString).Equals
        Return If(_St, "") = If(other._St, "")
    End Function

    Public Shared Widening Operator CType(st As String) As SafeString
        Dim ret As New SafeString
        ret._St = st
        Return ret
    End Operator

    Public Shared Widening Operator CType(safeSt As SafeString) As String
        Return If(safeSt._St, "")
    End Operator

    Function Length() As Integer
        Return If(_St, "").Length()
    End Function
    Function SubString(startIndex As Integer) As String
        Return If(_St, "").Substring(startIndex, Length)
    End Function
    Function SubString(startIndex As Integer, length As Integer) As String
        Return If(_St, "").Substring(startIndex, length)
    End Function

非常に一般的なパターンに気付くでしょうIf(_St, "")。その関数は、nullでない場合は_Stを使用し、nullでない場合は空の文字列を使用します。すべてのメソッドをサポートしているStringわけではありませんが、まだ機能しないメソッドが必要な場合は、などで示されるパターンに従うことができるはずです。とLengthの間の割り当てと比較は、期待どおりに機能するはずです。 anyはanyと等しいと見なします(文字列を他のタイプのオブジェクトと比較するためにオーバーライドの動作を変更する方法はありません。falseと比較する場合は、同様に行う必要があります。StringSafeStringObject.EqualsStringSafeStringString"Test".Equals(New SafeString("Test"))(New SafeString("Test")).Equals("Test")

于 2012-07-12T15:28:31.353 に答える