首页 > 解决方案 > 通过方法使用构造函数创建对象时使用setter进行验证

问题描述

我有一个使用方法创建的 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#methodsconstructorsetter

解决方案


这看起来像C# 在 setter 方法上添加验证的副本

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

还值得阅读 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);
        }
    }
}

推荐阅读