基本的用户输入字符串验证

Sar*_*jad 10 c# validation

我一直在写我的人抽象类的名字属性的支票.我的问题是,我试图实现一段代码,不允许用户将字段留空或超过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)

确切的正则表达式可供讨论,但最佳做法是:

  • 不要试图列出并拒绝你不喜欢的所有模式.太多的可能性.
  • 接受你的期望(和理解),拒绝其他一切.


Ada*_*son 6

应该打破这种验证.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)


Nic*_*ndo 0

除了 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)