C# Setter 和 if 语句
C# Setter and if statement
我一直在观看有关 C# 中的 OOP 的教程。
我不明白为什么在 Name 属性 中对名称的赋值不在 else 子句中。
class Animal
{
private string name;
protected string sound;
public Animal()
:this("No Name", "No Sound") { }
public Animal(string name)
:this(name, "No Sound") { }
public Animal(string name, string sound)
{
Name = name;
Sound = sound;
}
public string Name
{
get { return name; }
set
{
if (!value.Any(char.IsDigit))
{
name = "No Name";
}
name = value;
}
}
public string Sound
{
get { return sound; }
set
{
if (value.Length > 10)
{
sound = "No Sound";
}
else
{
sound = value;
}
}
}
protected AnimalIDInfo animalIDInfo = new AnimalIDInfo();
public void SetAnimalIDInfo(int idNum, string owner)
{
animalIDInfo.IDNum = idNum;
animalIDInfo.Owner = owner;
}
public void GetAnimalIDInfo()
{
Console.WriteLine($"{Name} has the ID of {animalIDInfo.IDNum} and is owned by {animalIDInfo.Owner}");
}
public void MakeSound()
{
Console.WriteLine($"{Name} says {Sound}");
}
}
}
有人能给我解释一下吗?无论 if 语句如何,这段代码不会总是为名称赋值吗?
另一方面,当我尝试使用 else 子句时,即使我传递的值不包含任何数字,我也会得到 "No Name"。
这是主要方法:
static void Main(string[] args)
{
Animal whiskers = new Animal()
{
Name = "Whiskers",
Sound = "Meow"
};
Dog grover = new Dog()
{
Name = "Grover",
Sound = "Woof",
Sound2 = "Grrrr"
};
grover.Sound = "Woooooooof";
whiskers.MakeSound();
grover.MakeSound();
// Inheritance has an "is a" relationship ("A dog IS AN animal")
// aggregation or a delegate represents "has a" relationship
whiskers.SetAnimalIDInfo(12345, "Sally Smith");
grover.SetAnimalIDInfo(12346, "Paul Brown");
whiskers.GetAnimalIDInfo();
grover.GetAnimalIDInfo();
}
提前致谢!
我也想不通。正如现在所写的那样,if 的结果将始终被 name = value;
覆盖。老实说,JiT 的死代码检测很可能会注意到这一点,然后完全删除 if 。除非他打算教你这方面的知识,否则我看不出这段代码有什么意义。
value.Any(char.IsDigit)
的 return 值也被反转,这可能是你应该在那里做的最后一件事。真的,除非他试图教你调试或现场编码,否则我认为这不可能。
我能做出的最接近合理的代码是:
if (value.Any(char.IsDigit))
{
name = "No Name";
}
else{
name = value;
}
我一直在观看有关 C# 中的 OOP 的教程。
我不明白为什么在 Name 属性 中对名称的赋值不在 else 子句中。
class Animal
{
private string name;
protected string sound;
public Animal()
:this("No Name", "No Sound") { }
public Animal(string name)
:this(name, "No Sound") { }
public Animal(string name, string sound)
{
Name = name;
Sound = sound;
}
public string Name
{
get { return name; }
set
{
if (!value.Any(char.IsDigit))
{
name = "No Name";
}
name = value;
}
}
public string Sound
{
get { return sound; }
set
{
if (value.Length > 10)
{
sound = "No Sound";
}
else
{
sound = value;
}
}
}
protected AnimalIDInfo animalIDInfo = new AnimalIDInfo();
public void SetAnimalIDInfo(int idNum, string owner)
{
animalIDInfo.IDNum = idNum;
animalIDInfo.Owner = owner;
}
public void GetAnimalIDInfo()
{
Console.WriteLine($"{Name} has the ID of {animalIDInfo.IDNum} and is owned by {animalIDInfo.Owner}");
}
public void MakeSound()
{
Console.WriteLine($"{Name} says {Sound}");
}
}
}
有人能给我解释一下吗?无论 if 语句如何,这段代码不会总是为名称赋值吗?
另一方面,当我尝试使用 else 子句时,即使我传递的值不包含任何数字,我也会得到 "No Name"。
这是主要方法:
static void Main(string[] args)
{
Animal whiskers = new Animal()
{
Name = "Whiskers",
Sound = "Meow"
};
Dog grover = new Dog()
{
Name = "Grover",
Sound = "Woof",
Sound2 = "Grrrr"
};
grover.Sound = "Woooooooof";
whiskers.MakeSound();
grover.MakeSound();
// Inheritance has an "is a" relationship ("A dog IS AN animal")
// aggregation or a delegate represents "has a" relationship
whiskers.SetAnimalIDInfo(12345, "Sally Smith");
grover.SetAnimalIDInfo(12346, "Paul Brown");
whiskers.GetAnimalIDInfo();
grover.GetAnimalIDInfo();
}
提前致谢!
我也想不通。正如现在所写的那样,if 的结果将始终被 name = value;
覆盖。老实说,JiT 的死代码检测很可能会注意到这一点,然后完全删除 if 。除非他打算教你这方面的知识,否则我看不出这段代码有什么意义。
value.Any(char.IsDigit)
的 return 值也被反转,这可能是你应该在那里做的最后一件事。真的,除非他试图教你调试或现场编码,否则我认为这不可能。
我能做出的最接近合理的代码是:
if (value.Any(char.IsDigit))
{
name = "No Name";
}
else{
name = value;
}