最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Record構(gòu)造函數(shù)的行為更改詳解

 更新時(shí)間:2021年08月29日 09:04:13   作者:Christian Findla  
C# 9 中的record類型是僅具有只讀屬性的輕量級(jí)、不可變數(shù)據(jù)類型(或輕量級(jí)類),下面這篇文章主要給大家介紹了關(guān)于C# Record構(gòu)造函數(shù)的行為更改的相關(guān)資料,需要的朋友可以參考下

如何更改 C# Record 構(gòu)造函數(shù)的行為

Record[1] 是 C# 9 中的一個(gè)新功能。Record是從Structs[2]借用的特殊類, 因?yàn)樗鼈兙哂?基于值的相等性,您可以將它們視為兩類類型之間的混合體。默認(rèn)情況下,它們或多或少是不可變的,并且具有語法糖,使聲明更容易和更簡潔。但是,語法糖可能會(huì)掩蓋更多標(biāo)準(zhǔn)任務(wù),例如更改默認(rèn)構(gòu)造函數(shù)的行為。在某些情況下,您可能需要這樣做以進(jìn)行驗(yàn)證。本文將向您展示如何實(shí)現(xiàn)這一目標(biāo)。

以這個(gè)簡單的示例類為例:

public class StringValidator
{
    public string InputString { get; }


    public StringValidator(string inputString)
    {
        if (string.IsNullOrEmpty(inputString)) throw new ArgumentNullException(nameof(inputString));


        InputString = inputString;
    }
}

很明顯,如果消費(fèi)者試圖在沒有有效字符串的情況下創(chuàng)建此類的實(shí)例,他們將收到異常。創(chuàng)建Record的標(biāo)準(zhǔn)語法如下所示:

    public record StringValidator(string InputString);

它既友好又簡潔,但并不清楚您將如何驗(yàn)證字符串。此定義告訴編譯器將有一個(gè)名為 的屬性InputString,并且構(gòu)造函數(shù)會(huì)將值從參數(shù)傳遞給該屬性。我們需要?jiǎng)h除語法糖來驗(yàn)證字符串。幸運(yùn)的是,這很容易。我們不需要使用新語法來定義我們的Record。我們可以定義類似于類的Record,但將關(guān)鍵字類更改為Record。

public record StringValidator
{
    public string InputString { get;  }


    public StringValidator(string inputString)
    {
        if (string.IsNullOrEmpty(inputString)) throw new ArgumentNullException(nameof(inputString));


        InputString = inputString;
    }
}

不幸的是,這意味著我們不能使用 非破壞性突變[3]。該with關(guān)鍵字給我們創(chuàng)造了一些屬性來更改Record的新版本的功能。這意味著我們不會(huì)修改Record的原始實(shí)例,但我們會(huì)得到它的副本。這是 Fluent API 和函數(shù)式編程的常用方法。這使我們能夠保持不變性。

為了允許非破壞性突變,我們需要添加init屬性訪問器。這與構(gòu)造函數(shù)的工作方式類似,但僅在對(duì)象初始化期間調(diào)用。這是實(shí)現(xiàn)init訪問器的更完整的解決方案。這允許您共享構(gòu)造函數(shù)邏輯和初始化邏輯。

using System;


namespace ConsoleApp25
{
    class Program
    {
        static void Main(string[] args)
        {
            //This throws an exception from the constructor
            //var stringValidator = new StringValidator(null);


            var stringValidator1 = new StringValidator("First");
            var stringValidator2 = stringValidator1 with { InputString = "Second" };
            Console.WriteLine(stringValidator2.InputString);


            //This throws an exception from the init accessor
            //var stringValidator3 = stringValidator1 with { InputString = null };


            //Output: Second
        }
    }


    public record StringValidator
    {
        private string inputString;


        public string InputString
        {
            get => inputString;
            init
            {
                //This init accessor works like the set accessor
                ValidateInputString(value);
                inputString = value;
            }
        }


        public StringValidator(string inputString)
        {
            ValidateInputString(inputString);
            InputString = inputString;
        }


        public static void ValidateInputString(string inputString)
        {
            if (string.IsNullOrEmpty(inputString)) throw new ArgumentNullException(nameof(inputString));
        }
    }
}

Record構(gòu)造函數(shù)應(yīng)該有邏輯嗎?

這是一個(gè)有爭議的辯論,超出了本文的范圍。很多人會(huì)爭辯說你不應(yīng)該把邏輯放在構(gòu)造函數(shù)中。Record的設(shè)計(jì)鼓勵(lì)您不要在構(gòu)造函數(shù)或 init 訪問器中放置邏輯。一般來說,Record應(yīng)該及時(shí)代表數(shù)據(jù)的快照狀態(tài)。您不需要應(yīng)用邏輯,因?yàn)榧僭O(shè)您知道此時(shí)數(shù)據(jù)的狀態(tài)。但是,就像其他所有編程結(jié)構(gòu)一樣,無法知道Record可能會(huì)產(chǎn)生哪些用例。這是庫 Urls 中的[4]一個(gè)示例[5] , [6]它將 URL 視為不可變Record:

using System.Net;


namespace Urls
{
    public record QueryParameter
    {
        private string? fieldValue;


        public string FieldName { get; init; }
        public string? Value
        {
            get => fieldValue; init
            {
                fieldValue = WebUtility.UrlDecode(value);
            }
        }


        public QueryParameter(string fieldName, string? value)
        {
            FieldName = fieldName;
            fieldValue = WebUtility.UrlDecode(value);
        }


        public override string ToString()
            => $"{FieldName}{(Value != null ? "=" : "")}{WebUtility.UrlEncode(Value)}";
    }
}

我們確保在存儲(chǔ)查詢值時(shí)對(duì)其進(jìn)行解碼,然后在將其用作 Url 的一部分時(shí)對(duì)其進(jìn)行編碼。

你可能會(huì)問:為什么不把一切都Record下來?似乎會(huì)有與此相關(guān)的陷阱,但我們正在冒險(xiǎn)進(jìn)入新領(lǐng)域,我們尚未為 C# 上下文中的Record制定最佳實(shí)踐。

總結(jié)

開發(fā)人員需要幾年時(shí)間才能接受Record并制定使用它們的基本規(guī)則。您目前有一張白紙,您可以自由嘗試,直到“專家”開始告訴您其他情況。我的建議是只使用Record來表示固定數(shù)據(jù)和最小邏輯。盡可能使用語法糖。但是,在某些情況下,構(gòu)造函數(shù)中的最小驗(yàn)證可能是可行的。運(yùn)用你的判斷力,與你的團(tuán)隊(duì)討論,權(quán)衡利弊。

到此這篇關(guān)于C# Record構(gòu)造函數(shù)行為更改的文章就介紹到這了,更多相關(guān)C# Record構(gòu)造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

References

[1] Record: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/records

[2] Structs: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/struct

[3] 非破壞性突變: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/records#non-destructive-mutation

[4] Urls 中的: https://github.com/MelbourneDeveloper/Urls

[5] 示例: https://github.com/MelbourneDeveloper/Urls/blob/5f55a9437cfac1223711d616bfdbeb72b230d263/src/Uris/QueryParameter.cs#L5

[6] , : https://github.com/MelbourneDeveloper/Urls

相關(guān)文章

  • C#反射實(shí)現(xiàn)插件式開發(fā)的過程詳解

    C#反射實(shí)現(xiàn)插件式開發(fā)的過程詳解

    插件式架構(gòu),一種全新的、開放性的、高擴(kuò)展性的架構(gòu)體系,插件式架構(gòu)設(shè)計(jì)好處很多,把擴(kuò)展功能從框架中剝離出來,降低了框架的復(fù)雜度,讓框架更容易實(shí)現(xiàn),這篇文章主要介紹了C#反射實(shí)現(xiàn)插件式開發(fā),需要的朋友可以參考下
    2023-09-09
  • LINQ基礎(chǔ)之Intersect、Except和Distinct子句

    LINQ基礎(chǔ)之Intersect、Except和Distinct子句

    這篇文章介紹了LINQ使用Intersect、Except和Distinct子句的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • c#匹配整數(shù)和小數(shù)的正則表達(dá)式

    c#匹配整數(shù)和小數(shù)的正則表達(dá)式

    c#中使用正則表達(dá)式需要加入using System.Text.RegularExpressions的引用
    2010-12-12
  • c#系列 list詳情

    c#系列 list詳情

    這篇文章主要介紹了c#系列 list,list 本質(zhì)是一個(gè)數(shù)組,。就跟我們操作系統(tǒng)一樣,提前申請(qǐng)內(nèi)存大小。所以我們程序一般都有一個(gè)申請(qǐng)內(nèi)存,實(shí)際使用內(nèi)存,內(nèi)存碎片這幾個(gè)概念,下面?zhèn)z看文章詳細(xì)內(nèi)容吧
    2021-10-10
  • C#中DataGridView的樣式

    C#中DataGridView的樣式

    這篇文章主要介紹了C#中DataGridView的樣式設(shè)置方法,包括交替行顏色、單元格內(nèi)容有效性檢查、單元格的選擇模式等,需要的朋友可以參考下
    2015-02-02
  • WinForm ToolTip使用方法小結(jié)

    WinForm ToolTip使用方法小結(jié)

    這篇文章主要介紹了WinForm ToolTip使用方法小結(jié),對(duì)C#初學(xué)者有一定的借鑒參考價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(2)

    C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(2)

    這篇文章主要介紹了C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì),介紹了電影院座位的動(dòng)態(tài)繪制、電影信息綁定到窗體中如何展現(xiàn)出來,需要的朋友可以參考下
    2015-11-11
  • 解決C#全屏幕截圖的實(shí)現(xiàn)方法

    解決C#全屏幕截圖的實(shí)現(xiàn)方法

    本篇文章是對(duì)在C#中實(shí)現(xiàn)全屏幕截圖的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用C#實(shí)現(xiàn)上位機(jī)與PLC通信的過程詳解

    使用C#實(shí)現(xiàn)上位機(jī)與PLC通信的過程詳解

    隨著工業(yè)自動(dòng)化技術(shù)的不斷發(fā)展,PLC(可編程邏輯控制器)已成為現(xiàn)代生產(chǎn)過程中不可或缺的設(shè)備,為了實(shí)現(xiàn)設(shè)備之間的數(shù)據(jù)交換和遠(yuǎn)程控制,上位機(jī)系統(tǒng)需要與PLC進(jìn)行通信,在本文中,我們將從零開始,介紹如何使用C#實(shí)現(xiàn)上位機(jī)與PLC的通信,需要的朋友可以參考下
    2025-01-01
  • C#中Selenium?WebDriver的常用操作小結(jié)

    C#中Selenium?WebDriver的常用操作小結(jié)

    這篇文章主要為大家詳細(xì)介紹了C#中Selenium?WebDriver的常用操作,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下
    2024-01-01

最新評(píng)論

安徽省| 枣阳市| 滨州市| 连南| 丹东市| 沭阳县| 洛宁县| 扶沟县| 建湖县| 安平县| 同仁县| 内江市| 富阳市| 龙川县| 康保县| 拜城县| 清远市| 邢台县| 北京市| 安乡县| 集安市| 金门县| 丘北县| 石台县| 东方市| 石景山区| 五家渠市| 溧阳市| 临湘市| 贵州省| 和静县| 依兰县| 阳高县| 收藏| 博湖县| 甘洛县| 万宁市| 太谷县| 内江市| 怀宁县| 泰宁县|