簡體   English   中英

將c#轉換為vb.net。 如何處理比較運算符和接口?

[英]Converting c# to vb.net. What to do with comparison operators and Interfaces?

我正在將一個龐大的項目從c#轉換為vb。 我遇到的一個問題是,在c#中,我可以做這樣的事情:

    private ITreeModel _model;
    [Category("Data")]
    public ITreeModel Model
    {
        get { return _model; }
        set
        {
            if (_model != value)
            {
                if (_model != null)
                    UnbindModelEvents();
                _model = value;
                CreateNodes();
                FullUpdate();
                if (_model != null)
                    BindModelEvents();
            }
        }
    }

具體來說,我可以:

If _model != value Then

但是,因為該屬性是一個接口,當我嘗試將其轉換為vb.net時,它告訴我我不能使用<>運算符。 我甚至在實現ITreeModel的所有類中重載了=和<>運算符,但無濟於事。

我不能使用'Is',因為編譯器要我這樣做,因為COURSE它正在實現ITreeModel接口,否則它永遠不會到達這個屬性! 它詢問兩者是否不相等,並且重載=和<>不會使錯誤消失。

這里的天才有關如何解決這個問題的任何想法? 我正在尋找vb.net中的等效代碼,它將完成與c#代碼相同的事情......

清除任何可能的混淆。 C#代碼測試相等性。 它問,“這兩件事情是否平等?” 我意識到我可以做一個a.Equals(b),但我不確定這是否是c#代碼正在做的事情,因為!=可能意味着c#中有不同的東西。

==運算符(C#參考)

對於預定義的值類型,如果操作數的值相等,則相等運算符(==)返回true,否則返回false。 對於除string之外的引用類型,如果其兩個操作數引用同一對象,則==返回true 對於字符串類型,==比較字符串的值。


是運算符(Visual Basic)

比較兩個對象引用變量。 Is運算符確定兩個對象引用是否引用同一對象 但是,它不執行值比較。 如果object1和object2都引用完全相同的對象實例,則結果為True; 如果他們不這樣做,結果就是假的。

也可以與TypeOf關鍵字一起使用來生成TypeOf ...是表達式,它測試對象變量是否與數據類型兼容。


Object.Equals方法(對象)

如果當前實例是引用類型,則Equals(Object)方法測試引用相等性,並且對Equals(Object) 方法的調用等效於對ReferenceEquals方法的調用。 引用相等意味着比較的對象變量引用同一個對象

...您可以通過調用ReferenceEquals方法將當前對象與另一個對象進行比較以獲得引用相等性。 在Visual Basic中,您還可以使用Is關鍵字(例如,If Me Is otherObject Then ...)。


所以你看到這兩個運營商做同樣的事情。 所以你的問題的答案是這樣的:

Public Interface ISomeInterface

    End Interface

    Public Class SomeObject
        Private _someInterface As ISomeInterface



        Public Property SomeInterface As ISomeInterface
            Get
                Return _someInterface
            End Get
            Set(value As ISomeInterface)
                If (Not _someInterface Is value) Then
                    If (_someInterface IsNot Nothing) Then
                        DoSomething()
                    End If

                    _someInterface = value

                    If (_someInterface IsNot Nothing) Then
                        DoSomethingElse()
                    End If
                End If
            End Set
        End Property



        Public Sub DoSomething()

        End Sub

        Public Sub DoSomethingElse()

        End Sub
    End Class

您可以反過來切換邏輯,然后從屬性中提前退出:

If ReferenceEquals(_model,value) Then Return

(當然,答案中最直接的部分 - 使用ReferenceEquals進行比較)


雖然我不確定你對Is看法Is什么。 以下編譯也很好:

Public Interface IDoSomething
    Sub DoNothing()

End Interface
Public Class Class1
    Private _zyx As IDoSomething
    Public Property Xyz As IDoSomething
        Get
            Return _zyx
        End Get
        Set(value As IDoSomething)
            If value Is _zyx Then Return

            If _zyx IsNot Nothing Then
                _zyx.DoNothing()
            End If
            _zyx = value

            If _zyx IsNot Nothing Then
                _zyx.DoNothing()
            End If
        End Set
    End Property

End Class

暫無
暫無

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

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