10

回到 VB6,我编写了一些函数,让我无需关心字符串的 null 和 '' 、数字的 null 和 0 等之间的区别。在编码时,没有什么比添加特殊情况更能降低我的工作效率了处理可能导致一些不相关错误的数据的代码;9999/10000 如果我用作数字的东西是空的,那么我真的把它当作 0。

我现在在 C# 中,VB6 和 C# 2005 之间的区别非常广泛......所以我真的不知道从哪里开始编写我的新辅助函数集,或者我什至是否需要这样做.

因此,我需要编写一个函数来接受字符串、数据库字段、请求表单/查询字段、???,然后尽其所能将其转换为 Double,并将其返回给调用过程.

我还需要为短裤、int16、int32、long 以及我可能关心的所有其他东西执行此操作。

然后我会为字符串做这个。和日期。

这是值得追求的吗?我可以使用框架或 C# 中的某些内容吗?我真的想要一些可以让我在调用其他函数时使用内联数据,而不必创建临时变量等的东西。

4

4 回答 4

36

内置了许多转换功能。但是...我不确定他们中的任何一个都完全按照您的意愿行事。通常,.NET 方法在传递无效输入时会谨慎行事,并引发异常。

幸运的是,您可以轻松地编写一个实用方法来将数值、空字符串或空字符串的字符串表示形式转换为任何输出类型:

public static T SafeConvert<T>(string s, T defaultValue)
{
    if ( string.IsNullOrEmpty(s) )
        return defaultValue;
    return (T)Convert.ChangeType(s, typeof(T));
}

采用:

SafeConvert(null, 0.0) == 0.0;
SafeConvert("", 0.0) == 0.0;
SafeConvert("0", 0.0) == 0.0;

此泛型方法从第二个参数的类型中获取其返回类型,当传递的字符串为 null 或空时,将其用作默认值。通过0,你会得到一个In32背部。通过0LInt64。等等...

于 2008-10-04T17:41:41.883 回答
6

在 C# 中,大多数数据类型都不可为空(数字、日期等),只有字符串可以为空。如果您从数据库中获取数据,那么您可能会使用Nullable或其语法糖化版本、int?、double?、DateTime? 等。

所有可空对象都有一个方法可以让您获取它们的实际值,如果它们为空,则可以使用默认值。这应该可以帮助您避免创建这些函数。

至于字符串,你有 String.IsNullOrEmpty(str) 函数。

如果您想要一些特殊的不可用功能,您还可以添加扩展方法。请注意,扩展方法可以应用于空值,只要您在代码中处理它。例如:

public static string ValueOrDefault(this string str) 
{
     if (String.IsNullOrEmpty(str)) return MY_DEFAULT_VALUE;
     else return str;
}
于 2008-10-04T17:35:08.493 回答
1

.NET 库中有一个名为 Convert 的类。它具有允许您从任何基本类型和一些常见类(如 DateTime)转换为所需的任何功能的功能。

它基本上像 Convert.ToInt32(val);

编辑:我真的需要学会阅读所有的单词。没有担心 null ......有一个操作员。你可以使用?? 检查 null 并提供默认值,以便可能工作。

您可能还想查看 LINQ,它为您处理了很多此类映射。

于 2008-10-04T17:37:15.073 回答
1

我认为它类似于@Shog9。我只是添加了一个 try catch 来处理用户异常输入。我发送要转换输入的类型并将输入作为对象。

public static class SafeConverter
{
   public static T SafeConvert<T>(object input, T defaultValue)
   {
       if (input == null)
          return defaultValue; //default(T);

       T result;
       try
       {
           result = (T)Convert.ChangeType(input.ToString(), typeof(T));
       }
       catch
       {
          result = defaultValue; //default(T);
       }
       return result;
   }
} 

现在像下面这样称呼他们

SafeConverter.SafeConvert<ushort>(null, 0);
SafeConverter.SafeConvert<ushort>("", 0);
SafeConverter.SafeConvert<ushort>("null", 0);
SafeConverter.SafeConvert<ushort>("-1", 0);
SafeConverter.SafeConvert<ushort>("6", 0);
SafeConverter.SafeConvert<ushort>(-1, 0);
SafeConverter.SafeConvert<ushort>(0, 0);
SafeConverter.SafeConvert<ushort>(1, 0);
SafeConverter.SafeConvert<ushort>(9, 0);
于 2016-11-21T04:08:22.520 回答