C#Setter and if语句

问题描述 投票:2回答:1

我一直在看有关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子句时,即使我传递的值不包含任何数字,我也会得到“无名”。

这里是主要方法:

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();




    }

提前感谢!

c# if-statement properties setter
1个回答
4
投票

我也不知道。如现在所写,if的结果将始终被name = value;覆盖。老实说,JiT的死代码检测可能会注意到这一点,并完全将其切掉。除非他不打算教您有关这一方面的知识,否则这段代码毫无意义。

也将value.Any(char.IsDigit)的返回值取反,这很可能是您应该在那里做的最后一件事。真的,除非他试图教您调试或实时编码,否则我认为这是行不通的。

我可以使用的最接近的明智代码是:

if (value.Any(char.IsDigit))
{
  name = "No Name";
}
else{
  name = value;
}

0
投票
if (!value.Any(char.IsDigit))

我不认为这可以实现作者所希望的。

也许

if (name.Any(char.IsDigit))

它们是什么意思?

© www.soinside.com 2019 - 2024. All rights reserved.