簡體   English   中英

C# 中 Java Objects.hash 和 Objects.hashCode 的等價物

[英]What is equivalent for Java Objects.hash and Objects.hashCode in C#

從 Java 遷移到 C# 開發人員。 在 Java 中,我使用了很多Objects.hash(array)Objects.hashCode(object)在 hashCode 函數中構建對象的哈希碼。 我在 C# 中找不到這些函數的任何等效項。 有任何想法嗎?

事實上,我可以調用GetHashCode並將它們組合起來,如Concise 方式所示組合字段哈希碼? ,但這需要對引用類型進行大量null檢查,這使得代碼比可比較的 Java 代碼長得多。

在 Java 中:

public class MyObject {

    private Integer type;
    private String[] attrs;
    
    @Override
    public int hashCode() {
        int hash = 1, p = 31;
        hash = p * hash + Objects.hashCode(type); // Handle Null case
        hash = p * hash + Objects.hash(attrs); // Handle Null case
        return hash;
    }
}

在 C# 中:

public class MyObject {

    private int? type;
    private string[] attrs;
    
    public override int GetHashCode()
        int hash = 1, p = 31;
        hash = p * hash + hash_of(type);    // Any utilities?
        hash = p * hash + hash_of_array(attrs); // Any utilities?
        return hash;
    }
}

注意:我不是在尋找兼容的結果(因為我知道哈希碼對於類似的對象會有所不同,即使在同一框架的版本/平台之間也可能有所不同),而是代碼大小和簡潔的方式。

.NET 的等效項是新的System.HashCode ,特別是HashCode.Combine<>方法,您可以使用它從多個值創建哈希碼:

public class MyObject
{
    private int? type;
    private string[] attrs;

    public override int GetHashCode()
        => HashCode.Combine(type, attrs);

    // remember to also override Equals
}

請注意,此類型僅在 .NET Core 中可用。 如果您在 .NET Framework 上運行,則必須自己實現哈希碼計算。 這里記錄了這樣做的好方法。

暫無
暫無

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

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