簡體   English   中英

通用C#類中== vs Equals的性能

[英]Performance of == vs Equals in generic C# class

出於某種原因,C#不允許在這樣的泛型類中使用==運算符:

class Mine<T> where T : struct
{
    T val;
    public T Value 
    { 
        set 
        { 
            if (val == value) // Operator '==' cannot be applied to operands of type T and T happens here
            {
                // .. do something ...
            }
        }
    }
}

如果我用val.Equals(value)替換==我有代碼按預期工作但如果我看字節碼它看起來要復雜得多。 使用==和Equals()比較循環中的int變量的一個非常簡單的測試表明,Equals()版本比“==”版本慢兩倍。

我想知道是否有一種方法來比較泛型類中的原始值類型,這些類型與==運算符一樣快。 歡迎任何想法。

編輯:我在計時器之間迷路了。 性能差異並不那么顯着。 這是我最新的結果:

== operator                            1974380 ticks
Equals()                               1976358 ticks
== operator in another static function 1974604 ticks
EqualityComparer<int>.Default...      32486695 ticks

簡而言之:Equals()足夠好了。

如果允許將IEquatable<T>約束添加到類中,則可以使用該接口中聲明的IEquatable<T>.Equals(T other)方法:

class Mine<T> where T : struct, IEquatable<T>
{
    T val;
    public T Value
    {
        set
        {
            if (val.Equals(value)) // 
            {
                // .. do something ...
            }
        }
    }
}

原因是==默認引用相等而且對值類型沒有意義,答案總是false 因為沒有語言機制來基於靜態方法來約束泛型類型,所以編譯器完全不允許這樣做,因為它無法驗證T是否真的有一個重載的==運算符。

另一方面,如果你將T約束到class ,它將編譯得很好,因為引用相等確實對引用類型有意義。

解決方案當然是IEquatable<T> ; 在任何IEquatable<T>.Equals(T t)實現的結構中IEquatable<T>.Equals(T t)將為您提供值相等語義,並且==應該表現一致。

並回答你的問題,不,沒有。 如果你真的需要int == int的速度,你需要實現一個非通用的專用類。

暫無
暫無

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

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