【发布时间】:2019-01-08 03:08:17
【问题描述】:
我一直在看这个视频: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 或除歌曲标题以外的其他内容(或者我可以通过哪些其他方式来打印)?
【问题讨论】:
-
当你给一个属性赋值时,比如
Title = "Ice cream";,那么这个属性的setter就会被调用。属性设置器中的特殊value变量包含分配给属性的值(在我的示例中为"Ice cream")。您的程序没有打印出“错误”与那个特殊的value变量的性质无关。而是非常仔细地查看您的if语句在属性设置器中的作用,同时考虑到属性获取器实际在做什么。还要注意 setter 何时被调用,何时不被调用...... -
你有一个简单的逻辑错误。在学习的早期学习使用调试器。
-
逻辑错误是,在类构造函数中,您正在设置支持字段。值检查由属性设置器完成。设置支持字段不会触发 setter 中的验证。将在构造函数中传递的值直接分配给属性,以便评估条件。不要尝试更改
value内容,而是使用验证值设置字段。你也可以在这里放弃支持使用自动属性。
标签: c# oop getter-setter