c# - 通过方法使用构造函数创建对象时使用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# 中构造函数初始化的最佳实践 - 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);
}
}
}
推荐阅读
- audio - 8 通道录音,32 位宽度音频无法播放
- java - PemWriter 在 pemWriter.close() 之前不写
- python-3.x - 销售订单行和制造订单 BOM 创建流程
- php - 如何将具有元素分配的两个数组组合为一个。PHP
- php - 如何在php中将数组值字符串转换或转换为布尔值
- c++ - 在linux中检测分号作为命令行参数
- python - 在 Tornado,Python 中读取 excel 时出现 UnicodeDecodeError
- php - 如何找出 Symfony 主页空白页的原因?
- html - Selenium 在 Python3 中获取表格内容
- python - 在OCR opencv中检测字符之间的空格