[英]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.