C#中如何判断字符串为int/double类型以调用重载方法?
解决TextBox输入解析与重载方法调用的问题
看起来你卡在了如何正确判断TextBox输入的解析结果,并且安全调用对应重载方法的环节——既不想写一堆冗余的if else,还要避免编译器报变量未赋值的错误。咱们一步步来解决这个问题。
首先得指出你之前的一个关键错误:用f == '\0'判断解析成功与否是行不通的。int类型的默认值是0,不是字符'\0',如果用户输入的就是0,你会误以为解析失败,这肯定会出问题。而且直接使用未解析成功的变量会触发编译器错误,因为它可能没被赋值。
方案1:用布尔标记记录解析状态
这是最直接的方式,给每个解析结果加个bool变量,明确记录是否解析成功:
string a = textBox1.Text, b = textBox2.Text; int f; double d; // 先尝试解析int,成功则标记isAInt为true,否则尝试double并标记isADouble bool isAInt = int.TryParse(a, out f); bool isADouble = !isAInt && double.TryParse(a, out d); int s; double sD; bool isBInt = int.TryParse(b, out s); bool isBDouble = !isBInt && double.TryParse(b, out sD); double x; // 根据标记组合调用对应的重载 if (isAInt && isBInt) { Area(f, s, out x); } else if (isAInt && isBDouble) { Area(f, sD, out x); } else if (isADouble && isBInt) { Area(d, s, out x); } else if (isADouble && isBDouble) { Area(d, sD, out x); } else { // 处理至少一个输入既不是int也不是double的情况 label3.Text = "请输入有效的整数或小数"; return; } label3.Text = "This is the value " + x;
这种方式逻辑清晰,编译器也不会报错——因为每个分支里用到的变量,都是在对应的bool标记为true时才会被访问,确保了变量已经被赋值。
方案2:用可空值类型(Nullable)存储解析结果
如果你觉得布尔标记有点繁琐,可以用可空值类型(在类型后面加?),未解析成功的变量会是null,判断起来更直观:
string a = textBox1.Text, b = textBox2.Text; int? intA = null; double? doubleA = null; if (int.TryParse(a, out var tempInt)) { intA = tempInt; } else if (double.TryParse(a, out var tempDouble)) { doubleA = tempDouble; } int? intB = null; double? doubleB = null; if (int.TryParse(b, out var tempIntB)) { intB = tempIntB; } else if (double.TryParse(b, out var tempDoubleB)) { doubleB = tempDoubleB; } double x; if (intA.HasValue && intB.HasValue) { Area(intA.Value, intB.Value, out x); } else if (intA.HasValue && doubleB.HasValue) { Area(intA.Value, doubleB.Value, out x); } else if (doubleA.HasValue && intB.HasValue) { Area(doubleA.Value, intB.Value, out x); } else if (doubleA.HasValue && doubleB.HasValue) { Area(doubleA.Value, doubleB.Value, out x); } else { label3.Text = "请输入有效的整数或小数"; return; } label3.Text = "This is the value " + x;
可空类型的HasValue属性可以直接告诉你是否解析成功,Value属性则能拿到解析后的具体值,代码可读性更高。
额外优化:简化重载(可选)
其实你的三个重载方法逻辑都是计算乘积,完全可以统一成一个接受double参数的方法——因为int可以自动隐式转换为double,这样就不用处理这么多分支了:
private static void Area(double a, double b, out double x) { x = a * b; }
然后不管输入是int还是double,都转成double传入:
string a = textBox1.Text, b = textBox2.Text; if (double.TryParse(a, out double numA) && double.TryParse(b, out double numB)) { Area(numA, numB, out double x); label3.Text = "This is the value " + x; } else { label3.Text = "请输入有效的数字"; }
这种方式最简洁,当然如果业务上必须保留不同类型的重载,前面的方案就更适合。
内容的提问来源于stack exchange,提问作者Christoffel Joubert
相关产品推荐
相关产品推荐

