这是一个非常奇怪的问题,你可能会发现它。 我正在开发VB6到VB.NET 2010的庞大迁移项目。作为VB6的一部分,我们有一个常量定义为NullString =“” 在.NET中,它也在类似的行上迁移并使用。 我们遇到的问题是比较RecordSet(它只是DataTable的一个包装)的值与这个NullString进行比较,我们得到比较的错误。 由于该项目正在积极开发中,我们必须依赖迁移工具(VB MIgration Partner),该工具了解一些Pragma但不太先进。 我创建了一个类(NullStringClass)并重载了“=”和“<>”运营商,它排序了我的比较问题。 但是在某些地方我们有someVar = NullString,其中someVar是一个字符串变量。现在,我得到无法从NullStringClass转换为字符串的错误。 我试图重载ToString方法并返回“”并在类上放置一个属性,如下所示:
<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
谢谢, NIK
答案 0 :(得分:1)
我在挣扎了两天之后提出了这个问题并且为了让“=”工作而挠头。 (操作员重载在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(将在生产代码中删除,因为它不是必需的)。 希望这对像我这样的人有用: - )
答案 1 :(得分:1)
在vb.net中,类型为string
且存储null
或未初始化值的存储位置在语义上与空字符串不同。如果您希望将这样的存储位置与另一个已知不为null的字符串进行比较,并且如果存储位置为空(而不是抛出异常),则只需返回false,您可以将表达式写为{{1 }}。如果您希望比较两个字符串,其中一个或两个字符串可能为null,并且空字符串比较相等但不包含任何其他字符串(包括空字符串),则可以使用"Whatever".Equals(storageLocation)
。如果您希望确定字符串是空还是空,则可以使用String.Equals(string1, string2)
。如果你希望以一种空字符串被认为是空的方式进行比较,你可以编写自己的静态比较,以这种方式进行比较,或者你可以编写一个函数,给定{{1}如果非null,则返回传入的字符串,否则返回String.IsNullorEmpty(theString)
。
希望以上之一就是你所追求的。请注意,它们与VB6称为“默认属性”无关,但您的问题似乎并未询问VB6属性(以及string
和String.Empty
之间的相关区别。
附录
如果你想要一个主要像普通字符串一样使用的字符串类型,但是默认为空字符串而不是Let
,你可以使用这样的东西(不完整,但应该是好的开始)
Set
您会注意到一种非常常见的模式Nothing
。如果它不是null,那么该函数将使用_St,如果不是,则使用空字符串。它不支持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, "")
等所示的模式。分配和比较String
和Length
应该按预期工作,但String
不会将任何SafeString
视为等于任何Object.Equals
(没有办法改变行为)使用String
覆盖使字符串比较等于任何其他类型的对象;如果SafeString
将比较为false,则String
必须这样做。