2010-01-18 190 views
1

在C#中我们有outref参数选项,在VB中只有一个:ByRefVB.NET中'out'问题

现在,小“问题”试图“消灭”的编译器警告说,检验合格的参数之前未初始化的时候:

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。(编辑)

在实际项目中,我的“可解析”类MyHourHourMinute性能。我已经写了一个FormatException的Parse(value as String),但我认为当我不使用try catch块时代码可以更清晰,更紧凑和更快...

+1

你的问题到底是什么? – 2010-01-18 12:47:28

+0

@divo:如何消除警告(没有'#pragma'或其他类似的技巧)? – serhio 2010-01-18 12:48:53

+0

那么当你用'Nothing'初始化局部变量时会出现问题吗? – 2010-01-18 12:50:00

回答

3

我不相信有可能防止这个警告,没有明确的任务。

不同的语言具有不同的功能/设施 - 如果他们不这样做,只会有一种编程语言:-)在这种情况下,是的,VB不假装有两种类型的ref参数,如C#确实 - 就CLR而言,“out”不存在。

我不确定peSHIr在说什么 - TryParse是增加了到BCL的后续版本,正是因为解析可能失败以至于成功 - 所以你可以采取一个错误路径而不需要抛出异常。

编辑

要添加 - 你没有得到一个警告,对于许多内置了对其中存在的TryParse类型的原因(例如Int32)已是因为他们的Structs /值类型和因此总是有价值。如果你的课程够简单,那么将它作为一个结构是合乎逻辑的呢?

+0

正如我所提到的,(真正的)MyHour类可能真的是一个结构...这是一个有趣的想法 – serhio 2010-01-18 13:45:04

+0

我不能将MyHour声明为结构体...有可选参数,可选参数不能是结构体 – serhio 2010-01-18 14:00:09

+0

同样,结构体不能有无参数的构造函数或受保护的成员,它们的成员不能被初始化当声明时,我不能实现与Equals(对象)等IComparable。 – serhio 2010-01-18 14:06:11

0

不完全是对你的问题的回答,但是out and ref/ByRef are bad,那么为什么首先使用它们?许多开发人员认为.NET Framework 1.0中的TryParse范例是一个不好的方法。

为什么不去MyParsableClass有一个Public Shared Function Parse(ByVal value As String) As MyParsableClass方法,在需要时引发适当的异常?

甚至是Public Shared Function Parse(ByVal value As String) As MyParsableClassParsed其中,MyParsableClassParsed是一个辅助内部类,它包含两个只读属性:Success As BooleanResult As MyParsableClass?你可以总是得到调用Parse的结果,但你会得到Success==TrueResult==[whatever],或简单地Success==FalseResult==Nothing

此外,您的MyParsableClassParsed辅助类也可以使用枚举数而不是布尔值和/或错误消息列表来告诉调用方/解析操作失败的原因。或者抛出异常可能有这样一个枚举值和/或错误信息。

更简单易用,更灵活。并没有ByRef给你头痛/警告。

+0

在现实中,我的可解析类是具有'Hour'和'Minute'属性的'MyHour'。如果我还要添加'Success'和'Result'属性,我将不会很清楚......我已经写了'Parse(value as String)',它带有FormatException,但是当代码更清晰,更紧凑和更快时我不使用try catch块... – serhio 2010-01-18 13:36:12

+0

只是指出所有不是从System.ValueType派生的对象都是隐式处理的ByRef,即无论您是否在方法参数列表中指定它,您的类都是ByRef。 – invert 2010-01-18 13:51:13

+0

@Monkey:你错了。 ByRef可以将外部引用设置为无任何内部调用方法,ByVal不能。 – serhio 2010-01-18 14:10:43