簡體   English   中英

通過VB.NET和C#中的Ref參數

[英]By Ref parameters in VB.NET and C#

我有問題相關的傳遞參數byRef,我有基於VB.NET的類庫,其中一些函數使用byref參數類型定義。 這些參數是父類對象,當我嘗試調用此函數並在byref參數中傳遞子類對象時,它在VB.NET中工作但我無法在C#中執行相同的操作

以下是我正在嘗試的測試代碼

Public Class Father

        Private _Cast As String
        Public Property Cast() As String
            Get
                Return _Cast
            End Get
            Set(ByVal value As String)
                _Cast = value
            End Set
        End Property

    End Class


 Public Class Son
        Inherits Father

        Private _MyName As String
        Public Property Myname() As String
            Get
                Return _MyName
            End Get
            Set(ByVal value As String)
                _MyName = value
            End Set
        End Property


    End Class

VB中的實現類

Public Class Parent

        Public Function Show(ByRef value As Father) As Boolean
            Dim test As String = value.Cast
            Return True
        End Function

// Herer我可以調用Show方法並將子對象傳遞給ByRef類型參數,它可以工作

Public Function Show2() As Boolean

            Dim s As New Son
            Dim result As Boolean = Show(s)

            Return True
        End Function

    End Class

//但是當我在c#中嘗試相同的事情

Parent p = new Parent();
            Son s = new Son();
            Father f = new Father();

            p.Show(ref s);

我得到Son無法轉換為父親的錯誤,我已經測試它在VB中工作但我怎樣才能使它在c#中工作? 因為我有dll格式的類庫

提前致謝

C#對此嚴格,通過引用傳遞的變量必須與方法參數類型完全匹配。 VB.NET對此感到寬容,它的編譯器會重寫您的代碼並創建所需類型的變量。 粗略地喜歡這個,用C#表示:

    Son s = new Son();
    Father $temp = (Father)s;
    p.Show(ref $temp);
    s = (Son)$temp;

哪個好,但不是沒有問題。 失敗模式是Show()方法將對象分配給其錯誤類型的參數。 由於參數類型是父,因此允許創建父對象。 然而,這將使上述片段中的第4個陳述失敗,無法將父親施放給兒子。 這不是那么漂亮,異常將在錯誤的語句中引發,真正的問題位於Show()方法中。 你可以暫時解決這個問題,但至少是因為你的VB.NET源代碼中實際上看不到強制轉換。 哎喲。 C#強制您明確編寫上述代碼段,以解決您的問題。

此時你應該驚嘆“但等等,Show()方法實際上並沒有創建一個新對象!” 這是很好的啟示,你會發現這段代碼的真正問題,Show()方法應該聲明參數為ByRef。 它只應在方法重新分配參數並且需要將更改傳播回調用方時使用。 最好完全避免,一個對象應該由一個方法返回它的返回值。 VB.NET中的函數而不是Sub。

ByRef允許函數修改托管指針並使其指向Son以外的其他內容,因此C#將不允許您直接將托管指針傳遞給Son 但是,您可以這樣做:

Son s = new Son();
Father f = s;
p.Show(ref f);
s = (Son)f; //Success if f still points to a Son, InvalidCastException  otherwise.

但是,如果您的方法Show確實沒有修改托管指針,那么就沒有理由將它ByRef :只需將它傳遞給ByVal ,您仍然可以修改對象本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM