通过方法使用构造函数创建对象时,使用setter进行验证

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

我有一个用方法创建的Person对象,在该方法内部,我使用构造函数创建该对象。我在二传手中已经对性别进行过验证,但看不到如何使用二传手来进行性别设置?

class Person
    {
        public string name;
        public int age;
        private string gender;
        private static List<Person> Personlist = new List<Person>();

        public Person(string _name, int _age, string _gender)
        {
            this.name = _name;
            this.age = _age;
            this.Gender = _gender;

        }

        public string Gender
        {

            get { return gender; }
            set
            {
                //value = de doorgegeven data
                if (value == "m" || value == "v")
                {
                    gender = value;
                }else
                {
                    gender = "Error: not a valid gender!";
                }
            }
        }
        public static void addPerson(string name, int age, string _gender){
            Personlist.Add(new Person(name, age, _gender));
        }
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Geef de naam van de persoon: ");
            var name = Console.ReadLine();
            Console.WriteLine("Geef de leeftijd van de persoon: ");
            var age = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Geef het geslacht van de persoon [MOET 'v' OF 'm' ZIJN]: ");
            var gender = Console.ReadLine();



            Person.addPerson(name, age, gender);
            Person.speek(name, age, gender);

        }
    }

c# methods constructor setter
1个回答
0
投票

这看起来像C# add validation on a setter method的副本

您增加了通过构造函数初始化属性的复杂性,这又不是标准的设计实践。您可以在实现中放入某些构造,因为编译器无法阻止您执行此操作,但这并不意味着您应该这样做。

也值得一读关于C#中用于构造函数初始化的最佳实践-https://softwareengineering.stackexchange.com/questions/51062/constructor-parameter-validation-in-c-best-practices

我正在更新答案以包括以下代码示例-

//Independent storage, not part of Person class.
private static List<Person> PersonList = new List<Person>();

static void Main()
{
    Console.WriteLine("Geef de naam van de persoon: ");
    var name = Console.ReadLine();
    Console.WriteLine("Geef de leeftijd van de persoon: ");
    var age = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine("Geef het geslacht van de persoon [MOET 'v' OF 'm' ZIJN]: ");
    var gender = Console.ReadLine();

    //PersonList.Add(new Person("Person1", 25, "M"));
    PersonList.Add(new Person(name, age, gender));

    var p = PersonList[0];
    if(p.IsPersonModelStateValid == true)
    {
        Console.WriteLine("Person state is valid");
    }
    else
    {
        Console.WriteLine("Person state is invalid");
    }
    p.PrintPerson();
    Console.Error.WriteLine("Done!");
}

然后将Person类重构为如下-

using System;
using System.Collections;
using System.Collections.Generic;

namespace BSearch
{
    public class Person
    {
        public string name;
        public int age;
        private string gender;
        private bool isPersonStateValid;


        public Person(string _name, int _age, string _gender)
        {
            isPersonStateValid = true;
            this.name = _name;
            this.age = _age;
            this.Gender = _gender;
        }

        public string Gender
        {

            get { return gender; }
            set
            {
                //value = de doorgegeven data
                if (value == "m" || value == "v")
                {
                    gender = value;
                }
                else
                {
                    gender = "Error: not a valid gender!";
                    isPersonStateValid = false;
                }
            }
        }

        public bool IsPersonModelStateValid
        {
            get { return isPersonStateValid;}
            private set { isPersonStateValid = value; }
        }

        /*public static void addPerson(string name, int age, string _gender)
        {
            Personlist.Add(new Person(name, age, _gender));
        }*/

        public static void Speak(string name, int age, string _gender)
        {
            //TODO : The logic to make the person speak goes in here.
        }

        public void PrintPerson()
        {
            Console.WriteLine("name : " + this.name);
            Console.WriteLine("age : " + this.age);
            Console.WriteLine("gender : " + this.gender);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.