为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信