[英]int.Parse not throwing an exception
我有一个包含TextBox的自定义控件。 自定义类具有3个属性,MinValue,MaxValue和Value,定义如下:
public int Value
{
get { return int.Parse(text.Text); }
set
{
text.Text = value.ToString();
}
}
public int MaxValue { get; set; }
public int MinValue { get; set; }
当自定义类中的TextBox失去焦点时,将运行以下方法:
void text_LostFocus(object sender, EventArgs e)
{
Value = Value > MaxValue ? MaxValue : Value;
Value = Value < MinValue ? MinValue : Value;
}
如果TextBox的字符串大于2,147,483,647,则丢失焦点时文本将保持不变,并且不会引发任何异常。
为什么不引发异常,我该如何进行设置,以便它将高于Int32.MaxValue
值设置为MaxValue
,并且将低于Int32.MinValue
值Int32.MinValue
为MinValue
?
首先,C#中存在不同的整数数据类型。
例如
Int32
,范围从-2,147,483,648
到2,147,483,647
Int64
,范围从-9,223,372,036,854,775,808
到9,223,372,036,854,775,807
使用Int32
不可能有更大的范围,因为它使用32位内存。 使用该类型的无符号版本会将范围更改为仅正值,因此,如果不需要负值,则还可以查看UInt32
。
要实际增加范围,唯一的选择是使用Int64
数据类型。
另请参阅: https : //msdn.microsoft.com/zh-CN/en-en/library/exx3b86w.aspx
( int
是一个别名Int32
, long
为Int64
)
其次,由于您既没有try-catch
块,也没有使用TryParse
因此应该有未处理的System.OverflowException
。 如果根本没有例外,那就有点奇怪了。 您确定这不是在try-catch
块中吗?
无论如何,我建议使用TryParse
代替Parse
并相应地处理错误。
如果我遇到您的情况,并且想了解发生了什么,我将在调试器下运行该应用程序,并在LostFocus
事件处理程序中使用一个断点。 您还可以考虑添加try / catch / throw,这可以使验证异常确实更容易,如果可以的话,在吞下异常之前对其进行检查:
void text_LostFocus(object sender, EventArgs e)
{
try
{
Value = Value > MaxValue ? MaxValue : Value;
Value = Value < MinValue ? MinValue : Value;
}
catch(Exception ex)
{
throw;
}
}
好的,所以我发现了问题:
红色圆圈内的复选框未选中。 修复IDE(VS Express 2012)的安装时可能就已经存在。 我最近安装了VS 2012 Professional,它们使用相同的选项,因为在Professional中进行检查也已在Express中对其进行了修复
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.