在函数中使用之前验证变量

时间:2013-03-04 08:19:21

标签: web-services c#-4.0 int signature webmethod

我有一个带有此签名的c#函数:

public XmlNode getName(int a, double b){}

问题是a变量并不总是有效的int(用户可以将其保留为null或空格。在这些情况下,函数失败(不足为奇)。如何在\之前验证int为int功能的开始?


编辑:

该函数是webservice(asmx文件)中的WEBMETHOD,这就是用户可以在其中键入任何值的原因。问题是,当有人输入字符串而不是int时,webservice崩溃,这就是我想要避免的。

3 个答案:

答案 0 :(得分:1)

目前,您需要将有效的int传递给您的方法。你不能这样称呼它:

getName("", 3);

这会给你一个编译错误,因为第一个参数不是int类型。

所以你有两个选择:

  1. 让来电者将用户输入转换为int
  2. 调整您的方法签名以接受stringobjectNullable<int>类型。
  3. Nullable<int>允许您方法的调用者传递null。您可以使用a.HasValue检查用户是否通过了null或有效的int。 (MSDN Documentation

    要在.NET Framework中转换值,您还有其他三个选项:

    int.Parse

    此方法采用字符串参数并尝试将其转换为int。如果转换失败或stringnull,则会引发异常。

    int.TryParse

    此方法采用string和输出参数并尝试转换。如果失败,则不会抛出异常。相反,该方法会返回,您可以决定要做什么。

    Convert.ToInt32

    此方法采用object类型的参数。它不会抛出null但返回默认值(对于int,这是0)。除此之外,它在内部使用int.Parse。

    在您的情况下,您可以执行以下操作:

    public XmlNode getName(string a, double b)
    {
       if ( string.IsNullOrWhiteSpace(a))
       {
          // Handle null case
       }
    
       int result;
       if (!int.TryParse(a, out result)
       {
         // handle invalid int case
       }
    
       // Use result to get your XmlNode
    }
    

答案 1 :(得分:1)

用户无法将空格或null传递给该函数。你是。你给它一个int的签名,如果你尝试用coul dbe null或space的东西来调用它,它就不会编译。

如果你的意思是传递给它的输入是一个字符串,但它只对int有效。这两个输入你想要什么?也许它会返回null。如果不是,请责备我。

public XmlNode getName(String a, double b)
{
   int someval;
   if (int.TryParse(s, out someval))
   {
       // do whatever you were going to in here, but using someval not a
   }
   else
   {
      return null;
   }  
}

答案 2 :(得分:0)

您可以尝试将用户输入解析为int。如果失败,请不要调用getName函数。

            var isAInt = "1";
            var isNotAnInt = "f";
            String nothing = null;
            int tmp;
            var res1 = Int32.TryParse(isAInt, out tmp); // true
            var res2 = Int32.TryParse(isNotAnInt, out tmp); // false
            var res3 = Int32.TryParse(nothing, out tmp); // false