亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Getter 和 Setter - “值”如何工作,尤其是在 if 語句中?

Getter 和 Setter - “值”如何工作,尤其是在 if 語句中?

C#
當年話下 2022-07-10 10:12:04
我一直在看這個視頻:https ://www.youtube.com/watch?v=GhQdlIFylQ8&t=11038s我正在 3:54:60 完成“Getters & Setters”(C# 的其他主題在任何需要的上下文的描述中)。這是我為了打印到控制臺以及“Getter and Setter”而創建的一個類。class Song{    private string title;    public string artist;    public int duration;    public Song(string aTitle, string aArtist, int aDuration)    {        title = aTitle;        artist = aArtist;        duration = aDuration;    }    public string Title    {        get { return title; }        set {            if (value == "Hello")            {                value = "ERROR";            } else            {                title = value;            }        }    }}這是打印兩個Song對象標題的“主要”代碼:“hello”和“kashmir”。class Program{    static void Main(string[] args)    {        Song hello = new Song("Hello", "Adele", 400);        Song kashmir = new Song("Kashmir", "Green Day", 200);        Console.WriteLine(hello.Title);        Console.WriteLine(kashmir.Title);        Console.ReadLine();    }}但是,我嘗試通過查看如何打印除歌曲標題以外的其他內容來嘗試“Getters and Setters”。當我運行程序時,它會打印出來Hello,并且Kashmir都在不同的行上。我如何讓它打印ERROR或除歌曲標題以外的其他東西(或者我可以通過什么其他方式來做到這一點)?
查看完整描述

2 回答

?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

這里發生了一件有趣的事情,即使是經驗豐富的開發人員偶爾也會絆倒……而且它忽略了支持字段和屬性之間的區別。這種情況時有發生......并且絕對讓開發人員感到困惑,直到他們意識到他們已經犯了一個 Visual Studio 智能感知輔助錯誤。如果您將支持字段命名為與屬性名稱相同,則可能性會加倍......僅以防萬一。


class Song

{

    private string title;  //--> this is the "backing field" for the property "Title"

    public string artist;

    public int duration;


    public Song(string aTitle, string aArtist, int aDuration)

    {

        //title = aTitle; //--> this only sets the backing field...not the "Title" property

        Title = aTitle;  //--> this sets your "Title" property

        artist = aArtist;

        duration = aDuration;

    }

下一個問題是,在屬性set中,value是該屬性的傳入建議值。你不必接受它。您在屬性中的工作set是驗證傳入的值,如果您喜歡它,則將其放入支持字段......或者如果您不喜歡,則可以放入其他內容。更改傳入value很少是您想要做的。你幾乎做對了......這是評論修復:


    public string Title

    {

        get { return title; }


        set {

            if (value == "Hello")

            {

                //value = "ERROR"; //--> this only changes the incoming value

                title = "ERROR";   //--> this sets your backing field


            } else

            {

                title = value;

            }

        }

    }

}

說了這么多,看到構造函數只設置支持字段,而不是通過有時昂貴的屬性驗證代碼,這并不罕見set。很多時候,該屬性是您的類型的用戶設置值的公共API……而構造函數保持內部或私有,僅用于填充已保存在某處的值……例如一個數據庫。一個好主意?也許/也許不是。正如您剛剛發現的那樣,繞過該屬性set可能會給您留下一些可能是錯誤的東西。


查看完整回答
反對 回復 2022-07-10
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

您不應將“錯誤”分配給 Value 關鍵字。


值關鍵字是保存輸入。如果您想在為字段分配值之前執行驗證,這很有用。如果您將某些內容分配給 Value ,則該課程將不會保留該內容。


編輯-正如下面評論中提到的-您的代碼沒有使用屬性設置器,而是通過構造函數設置值。


你有兩個選擇——


選項 1 - 在構造函數中添加相同的驗證。

選項 2 - 在構造函數中設置屬性而不是字段


選項 2 對我來說更有意義,因為它避免了代碼重復。


您將不得不對標題屬性進行小幅更改


    public string Title

    {

        get { return title; }


        set {

            if (value == "Hello")

            {

                title = "ERROR";


            } else

            {

                title = value;

            }

        }

    }


查看完整回答
反對 回復 2022-07-10
  • 2 回答
  • 0 關注
  • 106 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號