簡體   English   中英

操作符在C#中為VB.NET人員重載

[英]Operator Overloading in C# for a VB.NET person

考慮這個類重載了Person類的=運算符。 這適用於VB.NET:

Public Class Person

    Public Sub New(ByVal FirstName As String, ByVal LastName As String)
        _FirstName = FirstName
        _LastName = LastName
    End Sub

    Private _LastName As String
    Public Property LastName() As String
        Get
            Return _LastName
        End Get
        Set(ByVal value As String)
            _LastName = value
        End Set
    End Property

    Private _FirstName As String
    Public Property FirstName() As String
        Get
            Return _FirstName
        End Get
        Set(ByVal value As String)
            _FirstName = value
        End Set
    End Property

    Public Shared Operator <>(ByVal Person1 As Person, ByVal Person2 As Person) As Boolean
        Return Not (Person1 = Person2)
    End Operator


    Public Shared Operator =(ByVal Person1 As Person, ByVal Person2 As Person) As Boolean
        Return Person1.FirstName = Person2.FirstName AndAlso Person1.LastName = Person2.LastName
    End Operator

    Public Class Test

        Public Sub TestIt()

            Dim P1 As New Person("f1", "l1")
            Dim P2 As Person = Nothing

            Dim IsEqual As Boolean = False

            If P1 IsNot Nothing AndAlso P2 IsNot Nothing Then

                If P1 = P2 Then
                    IsEqual = True
                End If

            End If

        End Sub
    End Class
End Class

和C#中的同一個類:

public Person(string FirstName, string LastName)
{
    _FirstName = FirstName;
    _LastName = LastName;
}

private string _LastName;
public string LastName
{
    get { return _LastName; }
    set { _LastName = value; }
}

private string _FirstName;
public string FirstName
{
    get { return _FirstName; }
    set { _FirstName = value; }
}

public static bool operator !=(Person Person1, Person Person2)
{
    return !(Person1 == Person2);
}


public static bool operator ==(Person Person1, Person Person2)
{
    return Person1.FirstName == Person2.FirstName && Person1.LastName == Person2.LastName;
}

public class Test
{
    public void TestIt()
    {
        Person P1 = new Person("f1", "l1");
        Person P2 = null;

        bool IsEqual = false;


        if (P1 != null && P2 != null)
        {
            if (P1 == P2)
            {
                IsEqual = true;
            }
        }
    }
}

使用C#類,如何測試,看是否有Person對象是null調用重載之前==操作符的功能,如果功能是用於測試,看它是否為null 也就是說,是否存在與VB的Is Nothing相當的對應函數,它與==測試分開? 似乎C#使用==兩者。

我試過object.IsEqual ; 那看起來也錯了。

順便說一句,既然你正在實現==你也應該重寫Equals(和GetHashCode)。

一個簡單的方法是實現IEquatable<Person>

public bool Equals(Person other)
{
    return other != null &&
           FirstName == other.FirstName &&
           LastName == other.LastName;
}

然后覆蓋等於:

public override bool Equals(object o)
{
    var other = o as Person;
    return other != null && this.Equals(other);
}

最后==只是:

public static bool operator ==(Person left, Person right)
{
    return object.Equals(left, right);
}

public static bool operator !=(Person left, Person right)
{
    return !(left == right);
}

object.Equals正確地處理null案例。)

使用object.ReferenceEquals檢查重載運算符中的null

public static bool operator ==(Person Person1, Person Person2)
{
    if(object.ReferenceEquals(Person1, null)) {
        return object.ReferenceEquals(Person2, null);
    } else if(object.ReferenceEquals(Person2, null)) {
        return false;
    } else {
        return Person1.FirstName == Person2.FirstName && Person1.LastName == Person2.LastName;
    }
}

或者,更簡潔:

return object.ReferenceEquals(person1, person2) || (
           !object.ReferenceEquals(person1, null)
        && !object.ReferenceEquals(person2, null)
        && person1.FirstName == person2.FirstName
        && person1.LastName  == person2.LastName);

暫無
暫無

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

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