繁体   English   中英

int.Parse不引发异常

[英]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.MinValueInt32.MinValueMinValue

首先,C#中存在不同的整数数据类型。

例如

Int32 ,范围从-2,147,483,6482,147,483,647

Int64 ,范围从-9,223,372,036,854,775,8089,223,372,036,854,775,807

使用Int32不可能有更大的范围,因为它使用32位内存。 使用该类型的无符号版本会将范围更改为仅正值,因此,如果不需要负值,则还可以查看UInt32
要实际增加范围,唯一的选择是使用Int64数据类型。

另请参阅: https : //msdn.microsoft.com/zh-CN/en-en/library/exx3b86w.aspx

int是一个别名Int32longInt64

其次,由于您既没有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM