Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';输出';VB.NET中的问题_Vb.net_Reference_Compiler Warnings - Fatal编程技术网

';输出';VB.NET中的问题

';输出';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

在C中,我们有
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询问的警告。