C # Setter и если заявление - PullRequest
       20

C # Setter и если заявление

2 голосов
/ 25 октября 2019

Я смотрел учебник о ООП в C #.

Я не понимаю, почему присвоение значения имени внутри свойства 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();




    }

Заранее спасибо!

1 Ответ

4 голосов
/ 25 октября 2019

Я тоже не могу понять. Как написано сейчас, результат if всегда будет перезаписан на name = value;. Честно говоря, вполне вероятно, что обнаружение мертвого кода JiT может заметить это и просто полностью исключить его. Если он не собирается рассказывать вам об этом, я не вижу смысла в этом коде.

Также возвращаемое значение value.Any(char.IsDigit) инвертировано, что, вероятно, является последним, что вы должны делать там. На самом деле, если он не пытался научить вас отладке или программированию в реальном времени, я не вижу, как это могло бы сработать.

Самый близкий разумный код, который я могу из этого сделать:

if (value.Any(char.IsDigit))
{
  name = "No Name";
}
else{
  name = value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...