Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串变量转换为实际类型的编码实践_C#_Refactoring - Fatal编程技术网

C# 将字符串变量转换为实际类型的编码实践

C# 将字符串变量转换为实际类型的编码实践,c#,refactoring,C#,Refactoring,我有一个验证用户输入的服务。所以,在其他层中,我只是使用下面的语句来获取amount值,假设它已经过验证 但是在编写单元测试用例时,我意识到这是失败的。所以,我的问题是,每当字符串值需要转换为实际类型时,我们是否需要始终尝试解析这些值 var amountValue = Convert.ToDecimal(string.Format("{0}.{1}", view.amount, view.fraction)) 您应该解析字符串,因为这才是您真正想要做的 类型转换与解析不同 想象一下,在美国,

我有一个验证用户输入的服务。所以,在其他层中,我只是使用下面的语句来获取amount值,假设它已经过验证

但是在编写单元测试用例时,我意识到这是失败的。所以,我的问题是,每当字符串值需要转换为实际类型时,我们是否需要始终尝试解析这些值

var amountValue = Convert.ToDecimal(string.Format("{0}.{1}", view.amount, view.fraction))

您应该解析字符串,因为这才是您真正想要做的

类型转换与解析不同

想象一下,在美国,你用点分隔小数,在欧盟,你用逗号分隔小数。您无法真正了解语言环境如何区分小数和其他数字(尤其是日期非常重要,应该进行解析而不进行转换)


也就是说,规则user input=>parse非常简单。

下面是一个基于泛型的转换方法:

public static void Convert<T>(string text, out T value, CultureInfo culture) where T : IConvertible
{
    if (typeof(T).IsEnum)
    {
        value = (T) Enum.Parse(typeof (T), text, true);
    }
    else
    {
        value = (T)System.Convert.ChangeType(text, typeof(T), culture);
    }
}
publicstaticvoidconvert(字符串文本、out T值、CultureInfo区域性),其中T:IConvertible
{
if(类型(T).IsEnum)
{
value=(T)Enum.Parse(typeof(T),text,true);
}
其他的
{
value=(T)System.Convert.ChangeType(text,typeof(T),culture);
}
}

。如果您需要“Decimal”类型,并且您有一个字符串,那么您需要使用Convert.ToDecimal、Decimal.TryParse、Decimal.Parse或类似的方法。您的单元测试覆盖范围应该包括字符串无法解析的情况和字符串可以正确解析的情况。很好奇,为什么不能使用var amountValue=view.amount+view.fraction?
view.amount
view.fraction
都定义为
string
s吗
int
s?我的疑问是使用TryParse还是Convert.todecimale即使在验证层中进行了处理,您是否建议始终在使用这些转换的层中使用TryParse。请确认。不,绝对不是!解析和呈现属于UI层。较低的层没有UI的概念,不应该负责解析或呈现数据。他们应该只处理这些数据。另外,您希望尽早解析和筛选(验证/安全性)。当它到达较低的层时,您可能已经做了不必要的处理。验证应该在解析之后进行。您不知道字段的验证是否依赖于其他字段,所以在验证任何字段之前,您需要首先解析所有数据。如果您使用干净的阶段,它非常简单:解析->验证->过程。