下面我试着做一个例子:
Public Function UserData(ByVal UserDN As String) As DataTable
Dim myTable As DataTable = UserData_Table()
Dim dr As DataRow
dr = myTable.NewRow()
SplitOU2(UserDN, dr("OUDN"), dr("Organisation"), New Object)
dr("UserDN") = UserDN
myTable.Rows.Add(dr)
Return myTable
End Function
以下是被叫方法:
Friend Sub SplitOU2(ByVal inDN As String, ByRef OUDN As Object, ByRef Organisation As Object, ByRef VerksamhetTyp As Object)
通过这样做,我可以跳过在这个例子中声明“无用”变量
Dim VerksamhetTyp as Object = ""
。
也许它看起来有点难看,但是必须声明未使用的变量也会让人感到困惑。
答案 0 :(得分:0)
摘要:检查方法是否确实需要这些参数ByRef
。还要检查你真的不关心它对参数做了什么。经过仔细检查后,可以这样做 - 在CLR方面没有任何“坏”发生,因为它只是一个编译器技巧。
嗯,VB(与C#不同)会让你这样做。在幕后,有效地创建一个新变量并通过引用传递它 - 毕竟,它必须正确调用该方法。但是,我认为这通常是一个坏主意。 ByRef
的要点是您在方法中设置后使用该值。
你真的首先需要所有这些参数ByRef
吗?如果您发现自己为特定方法做了很多事情,您总是可以编写一个调用原始方法的包装器方法,但本身没有ByRef
参数。
(我经常发现有很多ByRef
参数的方法表明要么缺乏对.NET中参考类型的理解,或那些参数应该用自己的类型封装。)
说完所有这些之后,在调用方法后忽略ByRef
参数的值不是总是不正确。例如,如果您只想知道某些文本是否可以解析为整数,那么使用Int32.TryParse
是合理的 - 但只有返回值对您有用。
答案 1 :(得分:0)
是的,您可以按照以下代码演示:
Public Shared Function Show()
Dim myTable As New DataTable
myTable.Columns.Add("OUDN")
myTable.Columns.Add("Organisation")
Dim dr As DataRow = myTable.NewRow()
Dim UserDNmyTable As New DataTable
Dim UserDN As Object = Nothing
dr = myTable.NewRow()
SplitOU2(UserDN, dr("OUDN"), dr("Organisation"), New Object)
dr("UserDN") = UserDN
myTable.Rows.Add(dr)
Return myTable
End Function
Shared Sub SplitOU2(ByVal a As Object, ByVal b As Object, ByVal c As Object, ByRef d As Object)
d = "asdf"
End Sub
代码没有做任何有用的事情。它的唯一目的是证明copile允许你要求的东西。
如果您可以控制SplitOU2,我会考虑创建一个不带额外参数的重载。
答案 2 :(得分:0)
我考虑使用它的原因与方法有更多的参数和不同的操作重载获得相同的签名... 它运作的事实非常有趣,而且我偶然变得很有意思......