欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

什么是.NET的強類型字符串(Strongly typed string)?

freeflydom
2024年12月5日 9:36 本文熱度 355

.NET中,強類型字符串(Strongly typed string)并不是一個官方的概念,是指使用特定的結構來表示某種類型字符串數據的編碼實踐。類似于枚舉,可以提供編譯時檢查類型,減少運行時錯誤,以及更好的可讀性和維護性。相比于枚舉,具有更好的擴展性以及更強的約束性。

枚舉#

枚舉提供了一種便捷的方法來使用相關常數集并將常數值與名稱相關聯,具有類型安全、可讀性高以及編譯時檢查等優點。但是枚舉類型不能定義任何方法、屬性或事件,只能通過擴展方法功能模擬向枚舉類型添加方法。
盡管枚舉提供了編譯時檢查,但對輸入值的約束是有限的。例如,下面這個枚舉有四個值,默認情況下是int類型。取值范圍為0 ~ 3。

public enum Roles {

    Author,

    Editor,

    Administrator,

    SalesRepresentative

}

然后,有一個方法接受這個枚舉類型的參數:

public string DoSomething(Roles role) {

    return role.ToString();

}

許多開發人員可能不會檢查傳入值是否為實際有效的枚舉值。任何int類型都可以轉換,可能出現下邊這種代碼:

var result = myObject.DoSomething((Roles)10);

輸出的結果是 “10”,如果后續代碼中有基于這個枚舉的分支語句或者條件判斷,將產生錯誤的結果。對于這種情況,強類型字符串是一個不錯的選擇。

強類型字符串(Strongly typed string)#

強類型字符串要聲明成帶有字符串構造函數的不可變值類型(struct),即要在該類型上用 readonly 修飾符,并為其實現 IEquatable<T> 接口。要覆寫強類型字符串的 ToString() 方法,以返回隱式的字符串值。并將已知的強類型字符串通過靜態只讀屬性聲明到該類型上。
為了讓強類型字符串在通用代碼的語言結構上看起來更像字符串或者枚舉,需要為強類型字符串覆寫相等運算符。
以下就是 .NET 源碼中加密哈希算法的名稱強類型字符串HashAlgorithmName的代碼

using System.Diagnostics.CodeAnalysis;

namespace System.Security.Cryptography

{

    

    public readonly struct HashAlgorithmName : IEquatable<HashAlgorithmName>

    {

        public static HashAlgorithmName MD5 { get { return new HashAlgorithmName("MD5"); } }

        public static HashAlgorithmName SHA1 { get { return new HashAlgorithmName("SHA1"); } }

        public static HashAlgorithmName SHA256 { get { return new HashAlgorithmName("SHA256"); } }

        public static HashAlgorithmName SHA384 { get { return new HashAlgorithmName("SHA384"); } }

        public static HashAlgorithmName SHA512 { get { return new HashAlgorithmName("SHA512"); } }

        public static HashAlgorithmName SHA3_256 => new HashAlgorithmName("SHA3-256");

        public static HashAlgorithmName SHA3_384 => new HashAlgorithmName("SHA3-384");

        public static HashAlgorithmName SHA3_512 => new HashAlgorithmName("SHA3-512");

        private readonly string? _name;

        public HashAlgorithmName(string? name)

        {

            // Note: No validation because we have to deal with default(HashAlgorithmName) regardless.

            _name = name;

        }

        public string? Name

        {

            get { return _name; }

        }

        public override string ToString()

        {

            return _name ?? string.Empty;

        }

        public override bool Equals([NotNullWhen(true)] object? obj)

        {

            return obj is HashAlgorithmName && Equals((HashAlgorithmName)obj);

        }

        public bool Equals(HashAlgorithmName other)

        {

            // NOTE: intentionally ordinal and case sensitive, matches CNG.

            return _name == other._name;

        }

        public override int GetHashCode()

        {

            return _name == null ? 0 : _name.GetHashCode();

        }

        public static bool operator ==(HashAlgorithmName left, HashAlgorithmName right)

        {

            return left.Equals(right);

        }

        public static bool operator !=(HashAlgorithmName left, HashAlgorithmName right)

        {

            return !(left == right);

        }

        //其他擴展功能

        public static bool TryFromOid(string oidValue, out HashAlgorithmName value)

        {

            ArgumentNullException.ThrowIfNull(oidValue);

            switch (oidValue)

            {

                case Oids.Md5:

                    value = MD5;

                    return true;

                case Oids.Sha1:

                    value = SHA1;

                    return true;

                case Oids.Sha256:

                    value = SHA256;

                    return true;

                case Oids.Sha384:

                    value = SHA384;

                    return true;

                case Oids.Sha512:

                    value = SHA512;

                    return true;

                case Oids.Sha3_256:

                    value = SHA3_256;

                    return true;

                case Oids.Sha3_384:

                    value = SHA3_384;

                    return true;

                case Oids.Sha3_512:

                    value = SHA3_512;

                    return true;

                default:

                    value = default;

                    return false;

            }

        }

        public static HashAlgorithmName FromOid(string oidValue)

        {

            if (TryFromOid(oidValue, out HashAlgorithmName value))

            {

                return value;

            }

            throw new CryptographicException(SR.Format(SR.Cryptography_InvalidHashAlgorithmOid, oidValue));

        }

    }

}

這段代碼更好地約束了加密哈希算法名稱的輸入,同時還擴展了其他功能。但比枚舉繁瑣不少。
根據《框架設計指南》建議:當基類支持一組固定的輸入參數,但是派生類需要支持更多的參數時,建議使用強類型字符串;當僅由密封類型使用時,只需要使用預定義的值,枚舉將是更好的選擇。
此外,枚舉通常定義的是封閉的選項集,對于操作系統版本這種開放集合,也建議使用強類型字符串。控件庫 HandyControl 中的 SystemVersionInfo正是這樣的例子。

參考#

Enum Alternatives in C# | Blog
使用枚舉類(而不是枚舉類型) - .NET | Microsoft Learn

轉自https://www.cnblogs.com/czwy/p/18576931


該文章在 2024/12/5 9:40:23 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved