我一直在写我的人抽象类的名字属性的支票.我的问题是,我试图实现一段代码,不允许用户将字段留空或超过35个字符的名称限制或输入数字,但我坚持使用它.如果有人可以帮助或建议我.
public string Name
{
get { return name; }
set
{
while (true)
{
if (value == "" || value.Length > 35)
{
Console.Write("Please Enter Correct Name: ");
value = Console.ReadLine();
continue;
}
foreach (char item in value)
{
if (char.IsDigit(item))
{
Console.Write("Digits Are NotAllowed....\n");
Console.Write("Please Enter Correct Name: ");
value = Console.ReadLine();
break;
}
}
break;
}
name = value;
}
}
Run Code Online (Sandbox Code Playgroud)
Hen*_*man 20
不要在属性中执行任何形式的UI或I/O.
public string Name
{
get { return _name; }
set
{
if (! Regex.IsMatch(value, @"\w{1-35}"))
throw new ArgumentException("Name must be 1-35 alfanum");
_name = value;
}
}
Run Code Online (Sandbox Code Playgroud)
确切的正则表达式可供讨论,但最佳做法是:
应该打破这种验证.setter应该只知道它具有的各种限制,并且在无效值使得它远远的情况下抛出异常.不要在那里放置用户界面代码.
尝试这样的事情:
public string Name
{
get { return name; }
set
{
if (value == "" || value.Length > 35)
{
throw new ArgumentException("Invalid name length.");
}
foreach (char item in value)
{
if (char.IsDigit(item))
{
throw new ArgumentException("Digits are not allowed.");
}
}
name = value;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在你的控制台应用程序中这样的事情
bool success = false;
while(!success)
{
try
{
Console.WriteLine("Please enter a name:");
myObject.Name = Console.ReadLine();
success = true;
}
catch(ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
除了 Skeet 先生所说的之外,似乎您应该将其替换break为 acontinue以验证新值(就像您在第一次长度检查中所做的那样):
if (char.IsDigit(item))
{
Console.Write("Digits Are NotAllowed....\n");
Console.Write("Please Enter Correct Name: ");
value = Console.ReadLine();
continue; //here
}
Run Code Online (Sandbox Code Playgroud)