C# 用于从字符串安全转换的帮助函数

C# 用于从字符串安全转换的帮助函数,c#,vb6,type-conversion,C#,Vb6,Type Conversion,回到VB6,我编写了一些函数,可以让我编写代码,而不必关心字符串的null和“”、数字的null和0等之间的差异。在编写代码时,没有什么比添加特殊情况代码来处理可能导致一些不相关错误的数据更能降低我的工作效率了;9999/10000如果我使用的某个数字为空,那么实际上我将其视为0 我现在在C#,VB6和C#2005之间的差异非常大……所以我真的不知道从哪里开始编写新的帮助函数集,或者我甚至不知道是否需要编写它们 因此,我需要编写一个函数,该函数将接受一个字符串、一个数据库字段、一个请求表单/查询

回到VB6,我编写了一些函数,可以让我编写代码,而不必关心字符串的null和“”、数字的null和0等之间的差异。在编写代码时,没有什么比添加特殊情况代码来处理可能导致一些不相关错误的数据更能降低我的工作效率了;9999/10000如果我使用的某个数字为空,那么实际上我将其视为0

我现在在C#,VB6和C#2005之间的差异非常大……所以我真的不知道从哪里开始编写新的帮助函数集,或者我甚至不知道是否需要编写它们

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

我还需要为短裤、int16、int32、long以及其他我可能关心的东西做这些

然后我会为弦做这个。还有日期

这是值得追求的吗?框架或C#中是否有我可以使用的东西?我真的希望能够在调用其他函数时使用数据内联,而不必创建临时变量等。

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

所有Nullable都具有允许您获取其实际值的属性,如果为null,则为默认值。这将帮助您避免创建这些函数

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

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

public static string ValueOrDefault(this string str) 
{
     if (String.IsNullOrEmpty(str)) return MY_DEFAULT_VALUE;
     else return str;
}

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

它的工作原理基本上类似于Convert.ToInt32(val)

编辑:我真的需要学习阅读所有的单词。没有抓住关于空的担心。。。这有一个接线员。你可以用??检查null并提供默认值,这样可能会起作用


您可能还想看看LINQ,它可以为您处理许多此类映射。

内置了大量转换函数。但是我不确定他们中是否有人能完全满足你的要求。通常,.NET方法在传递无效输入时会出错,并引发异常

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

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

此泛型方法从第二个参数的类型获取其返回类型,当传递的字符串为null或空时,该参数用作默认值。通过
0
,您将得到一个
In32
返回。通过
0L
Int64
。等等…

我认为它类似于@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;
   }
} 
公共静态类安全转换器
{
公共静态T SafeConvert(对象输入,T默认值)
{
如果(输入==null)
返回defaultValue;//默认值(T);
T结果;
尝试
{
结果=(T)Convert.ChangeType(input.ToString(),typeof(T));
}
抓住
{
结果=默认值;//默认值(T);
}
返回结果;
}
} 
现在像下面这样称呼他们

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);
SafeConverter.SafeConvert(null,0);
SafeConverter.SafeConvert(“,0);
SafeConverter.SafeConvert(“null”,0);
SafeConverter.SafeConvert(“-1”,0);
SafeConvert.SafeConvert(“6”,0);
SafeConvert.SafeConvert(-1,0);
SafeConvert.SafeConvert(0,0);
SafeConvert.SafeConvert(1,0);
SafeConvert.SafeConvert(9,0);

我非常喜欢这一个,因为它使用了泛型,这可以节省我创建数十个方法的时间。谢谢这很好,但是如果我们要动态转换类型,我们如何知道传递什么作为默认值呢?我认为TryParse是最好的。无法转换SafeConvert(“null”,0)==0;若要使其成为扩展方法,但在字符串s前面有一个“this”,则可以像stringVariableName.SafeConvert(0)一样使用它
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);