LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

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

.NET中,強(qiáng)類型字符串(Strongly typed string)并不是一個(gè)官方的概念,是指使用特定的結(jié)構(gòu)來表示某種類型字符串?dāng)?shù)據(jù)的編碼實(shí)踐。類似于枚舉,可以提供編譯時(shí)檢查類型,減少運(yùn)行時(shí)錯(cuò)誤,以及更好的可讀性和維護(hù)性。相比于枚舉,具有更好的擴(kuò)展性以及更強(qiáng)的約束性。

枚舉#

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

public enum Roles {

    Author,

    Editor,

    Administrator,

    SalesRepresentative

}

然后,有一個(gè)方法接受這個(gè)枚舉類型的參數(shù):

public string DoSomething(Roles role) {

    return role.ToString();

}

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

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

輸出的結(jié)果是 “10”,如果后續(xù)代碼中有基于這個(gè)枚舉的分支語句或者條件判斷,將產(chǎn)生錯(cuò)誤的結(jié)果。對于這種情況,強(qiáng)類型字符串是一個(gè)不錯(cuò)的選擇。

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

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

        }

        //其他擴(kuò)展功能

        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));

        }

    }

}

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

參考#

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

轉(zhuǎn)自https://www.cnblogs.com/czwy/p/18576931


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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲国产精品久久精品怡红院 | 欧美一级a毛无片在线 | 亚洲无遮挡免费在线观看 | 欧美日韩一区日本道 | 中文字幕在线播 | 亚洲一区二区少妇 |