【问题标题】:validate variable before use in function在函数中使用之前验证变量
【发布时间】:2013-03-04 08:19:21
【问题描述】:

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

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

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


编辑:

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

【问题讨论】:

  • 如果a 不是 int 则不能调用该函数,“验证”是什么意思?

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


【解决方案1】:

用户不可能将空格或空值传递给该函数。你是。你给了它一个 int 的签名,如果你尝试用可能为 null 或空格的东西来调用它,它将无法编译。

如果你的意思是你传递给它的输入是一个字符串,但它只对 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】:

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

    getName("", 3);
    

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

    所以你有两个选择:

    1. 让调用者将用户输入转换为int
    2. 调整您的方法签名以接受stringobjectNullable<int> 类型。

    Nullable<int> 允许您的方法的调用者传递null。您可以使用a.HasValue 来检查用户是否通过了null 或有效的int。 (MSDN Documentation)

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

    int.Parse

    此方法接受一个字符串参数并尝试将其转换为int。如果转换失败或stringnull,则抛出异常。

    int.TryParse

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

    Convert.ToInt32

    此方法采用对象类型的参数。它不会抛出 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
    }
    

    【讨论】:

      【解决方案3】:

      您可以简单地尝试将用户输入解析为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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        相关资源
        最近更新 更多