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可能会给您留下一些可能是错误的东西。
TA贡献1860条经验 获得超8个赞
您不应将“错误”分配给 Value 关键字。
值关键字是保存输入。如果您想在为字段分配值之前执行验证,这很有用。如果您将某些内容分配给 Value ,则该课程将不会保留该内容。
编辑-正如下面评论中提到的-您的代码没有使用属性设置器,而是通过构造函数设置值。
你有两个选择——
选项 1 - 在构造函数中添加相同的验证。
选项 2 - 在构造函数中设置属性而不是字段
选项 2 对我来说更有意义,因为它避免了代码重复。
您将不得不对标题属性进行小幅更改
public string Title
{
get { return title; }
set {
if (value == "Hello")
{
title = "ERROR";
} else
{
title = value;
}
}
}
- 2 回答
- 0 关注
- 85 浏览
添加回答
举报