![](/img/trans.png)
[英]Converting Linq to XML query from C# to VB.Net. Can you spot my error?
[英]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#中有不同的東西。
對於預定義的值類型,如果操作數的值相等,則相等運算符(==)返回true,否則返回false。 對於除string之外的引用類型,如果其兩個操作數引用同一對象,則==返回true 。 對於字符串類型,==比較字符串的值。
比較兩個對象引用變量。 Is運算符確定兩個對象引用是否引用同一對象 。 但是,它不執行值比較。 如果object1和object2都引用完全相同的對象實例,則結果為True; 如果他們不這樣做,結果就是假的。
也可以與TypeOf關鍵字一起使用來生成TypeOf ...是表達式,它測試對象變量是否與數據類型兼容。
如果當前實例是引用類型,則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
進行比較)
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.