';输出';VB.NET中的问题
在C中,我们有';输出';VB.NET中的问题,vb.net,reference,compiler-warnings,Vb.net,Reference,Compiler Warnings,在C中,我们有out和ref参数选项,在VB中只有一个:ByRef 现在,在尝试“消除”编译器警告时出现了一个小“问题”,该警告表示测试在作为参数传递之前未初始化: Dim test As MyParsableClass ' = Nothing need imperatively?? ' ' some code ... ' MyParsableClass.TryParse("value", test) ' warning on "test" here 课程简介: Class MyParsab
out
和ref
参数选项,在VB中只有一个:ByRef
现在,在尝试“消除”编译器警告时出现了一个小“问题”,该警告表示测试在作为参数传递之前未初始化:
Dim test As MyParsableClass ' = Nothing need imperatively?? '
' some code ... '
MyParsableClass.TryParse("value", test) ' warning on "test" here
课程简介:
Class MyParsableClass
Public Shared Function TryParse(ByVal value As String, _
ByRef myParsableClass As MyParsableClass) As Boolean
myParsableClass = Nothing
If True Then
' parse code OK'
myParsableClass = New MyParsableClass()
Return True
Else
' parse code NOK '
' myParsableClass remains Nothing '
Return False
End If
End Function
End Class
也许一个解决办法是宣布
...Optional ByRef myParsableClass As MyParsableClass = Nothing)
但我无法将此参数设置为可选参数。如果我错过了怎么办
PS.(编辑)
在实际项目中,我的“parsable”类是
MyHour
,具有Hour
和Minute
属性。我已经编写了解析(值为字符串)
,其中有一个FormatException,但我认为当我不使用try-catch块时,代码可以更清晰、紧凑和快速…这不完全是对您问题的回答,但是,为什么要首先使用它们呢?许多开发人员认为.NETFramework1.0中的TryParse
范式是一个糟糕的选择
为什么不选择一个MyParsableClass
方法,该方法将公共共享函数Parse(ByVal值作为字符串)作为MyParsableClass
方法,在需要时引发适当的异常
或者甚至是作为MyParsableClassParsed的公共共享函数Parse(ByVal值作为字符串)
其中,MyParsableClassParsed
是一个帮助器内部类,它包含两个只读属性:Success As Boolean
和Result As MyParsableClass
?然后,调用Parse
总是可以得到一个结果,但是您会得到Success==True
和result==whatever]
,或者干脆得到Success==False
和result==Nothing
此外,您的MyParsableClassParsed
helper类还可以使用枚举器而不是布尔值和/或错误消息列表来告诉调用方解析操作失败的原因。或者,抛出异常可能具有这样的枚举值和/或错误消息
更容易使用,更灵活。没有ByRef给你带来麻烦/警告。如果没有明确的任务,我认为不可能阻止这个警告 不同的语言有不同的功能/设施-如果没有,就只有一种编程语言:-)在这种情况下,是的,VB不会像C一样假装有两种类型的ref参数-就CLR而言,“out”不存在 我不确定peSHIr在说什么——TryParse被添加到BCL的后续版本中,正是因为在这种情况下,解析可能失败,也可能成功——所以您可以选择错误路径,而不需要抛出异常 编辑
要添加-对于存在TryParse的许多内置类型(例如Int32),您没有收到警告的原因是它们是结构/值类型,因此总是有值。如果您的类足够简单,那么将其改为结构是否合乎逻辑?您的问题到底是什么?@divo:如何消除警告(没有
#pragma
或其他类似技巧)?因此,当您使用Nothing
初始化局部变量时是否存在问题?@divo:是,但是当我在C#项目中工作时,我总是试图用0警告和0错误来编码。@serhio-正如您和divo都指出的,有一种方法可以在这里用0警告和0错误来编码-执行“Nothing”赋值。不同的语言有不同的巫毒咒语来安抚编译器。实际上,我的可解析类是MyHour
,具有Hour
和Minute
属性。如果我还要添加Success
和Result
属性,这将不是很清楚。。。我已经用FormatException编写了Parse(value as String)
,但是当我不使用try-catch块时,代码更加清晰、紧凑和快速…只是指出所有不是从System.ValueType派生的对象都是由ByRef隐式处理的,即无论您在方法参数列表中指定它,您的类都是ByRef,猴子:你错了。ByRef可以在调用方法中将外部引用设置为nothing,ByVal不能。@Monkey:默认情况下,所有参数都是通过ByVal传递的,即使是引用类型。通过引用传递参数的唯一时间是在使用ByRef关键字时。@serhio:啊,对于这种“简单”的情况(我假设更复杂的解析),您可能已经将MyHour
定义为Struct
(不是Class
,您可以为它定义一个类型转换器。正如我提到的,(real)MyHour类可能真的是一个结构…这是一个有趣的想法。我不能将MyHour声明为结构…有用作可选参数的。可选参数不能是结构。而且结构不能有无参数构造函数或受保护的成员,它们的成员在声明时不能初始化,我不能实现IComparable使用Equals(object)等。啊,这就是为什么我问它是否合乎逻辑-显然,我不知道您在实现中有哪些附加约束-尽管(在可选参数可以更好地处理为可空或重载-这对非VB语言更友好。添加了类似TryParse
的内容(作为总是在Parse
上获取异常的选项)并不是一个坏主意,但它的实现方式(=使用out
参数)很多人认为这是一个糟糕的决定。微软也在这个阵营中,这就是为什么你会收到serhio询问的警告。