Winforms:TypeConverter.IsValid中的改动

本文探讨了.NET 2.0与.NET 4.0中TypeConverter.IsValid方法的不同行为。在.NET 2.0中,由于子类未重写IsValid,导致总是返回true,即使输入值有误。而在.NET 4.0中,基类TypeConverter.IsValid进行了修正,会正确判断输入有效性。若要保持.NET 2.0行为,可通过配置文件设置UseCompatibleTypeConverterBehavior。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TypeConverter是我们在做类型转换时经常会被用到的一个类型。在做类型转换之前,我们首先需要判断待转换的值是不是有效的。比如我们打算把一个字符串转换为整数值,首先我们需要判断该字符串表示的是不是一个有效的整数。.NET团队在设计类型TypeConverter的时候,方法TypeConverter.IsValid(Object)就是用来判断传入的参数对于转换的目标类型是不是有效。

一、在.NET 2.0中调用TyoeConverter.IsValid

1.       Visual Studio 2010中创建一个基于.NET 2.0Console工程;

2.       Main中添加如下代码:

        TypeConverter converter = new BooleanConverter();

        String str = "flase";

        bool valid = converter.IsValid(str);

        Console.WriteLine(str + (valid ? " is" : " is not") + " a valid bolean value");

 

        converter = new Int32Converter();

        str = "123$";

        valid = converter.IsValid(str);

        Console.WriteLine(str + (valid ? " is" : " is not") + " a valid int value");

 

3.       编译运行。我们发现运行的结果是“flase”是一个有效的布尔值,“123$”也是一个整数值。

上述结果可能和很多人预期不一致。“flase”中有一个单词拼写错误,而“123$”也含有一个非数字字符。因此,我们预期上述代码中两次调用IsValid 应该返回false

为什么上述代码中会返回true呢?这是因为最初在设计开发TypeConverter时,TypeConverter.IsValid始终返回true。类型TypeConcerter的开发者希望TypeConverter的子类自己定义它的IsValidTypeConverter的子类在重写(overrideIsValid时,可以根据自己类型的特点来判断输入的参数是不是有效的。但遗憾的是,.NET中的TypeConverter的所有子类比如BooleanConverterInt32Converter并没有重写IsValid方法。因此我们在调用IsValid的时候,不管输入是什么,都一律返回true

二、在.NET 4.0中调用TyoeConverter.IsValid

在开发.NET 4.0时,我们意识到IsValid的不合理,于是做了修改。我们在基类TypeConverterIsValid中,会判断输入的参数是不是真的有效,如果有效则返回true,否则返回false

如果我们在Visual Studio中创建一个基于.NET 4.0Console工程,并添加前面的代码。编译运行之后,我们发现此时两次调用IsValid,都是返回false

可能有些程序员会担心此次改动会导致原先运行正常的程序现在会出问题。我们在修改TypeConvert.IsValid的时候,意识到了程序员的这种担忧。如果程序员希望该方法还是保留.NET 2.0中的行为,他可以为程序添加一个配置文件(后缀为*.config),并添加如下设置:

<configuration>

    <appSettings>

      <add key="UseCompatibleTypeConverterBehavior" value="true" />

    </appSettings>

</configuration>

如果我们在.NET 4.0的程序中添加了上述设置,TypeConverter.IsValid仍然按照.NET 2.0的行为不管输入的参数是否有效始终返回false

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值