Byref新对象。可以通过新对象作为“byref”吗?

时间:2009-09-07 16:02:10

标签: vb.net

下面我试着做一个例子:

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 = ""

也许它看起来有点难看,但是必须声明未使用的变量也会让人感到困惑。

3 个答案:

答案 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)

我考虑使用它的原因与方法有更多的参数和不同的操作重载获得相同的签名... 它运作的事实非常有趣,而且我偶然变得很有意思......