c# - VB.NET 人员在 C# 中的运算符重载

标签 c#

考虑这个类,它重载了 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 个案例。)

关于c# - VB.NET 人员在 C# 中的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12084212/

相关文章:

c# - 为什么 ICollection<T> 同时实现 IEnumerable<T> 和 IEnumerable

c# - 代码从 vb.net 到 c# 的转换-await 任务

c# - 在 SQL Server 中处理 'Enumerations' 有哪些不同的方法?

c# - 您可以在调用 GC.Collect 和 GC.WaitForPendingFinalizers 时出现死锁吗?

c# - 如何在枚举中获取枚举值的 int

c# - backgroundworker 报告进度 c#

c# - 使用 Nodatime 将 UTC 时间转换为本地时间

C# 标志与 FlagsAttribute

c# - 在 C# 类库中使用 MATLAB MWArray.dll

c# - 将任何类转换为键值对