如何在C#中定义支持out变量传递值的自定义TryParse方法?
解决C#中重复
double.TryParse逻辑的封装问题 你的问题核心是想把重复的数值解析+错误提示逻辑封装成通用方法,但最初的尝试因为对C#变量传递逻辑的误解没成功——你需要让封装方法既能完成解析校验,又能把解析后的double变量传递回调用方供后续使用对吧?
先看看你最初的冗余代码,确实每一段都重复了判断和提示逻辑,维护起来很麻烦:
private void button_Click(object sender, EventArgs e) { bool resSPos = double.TryParse(txtSPos.Text, out double SPos); if (resSPos == false) FalseBoolMsg("Starting Position"); bool resTPos = double.TryParse(txtTPos.Text, out double TPos); if (resTPos == false) FalseBoolMsg("Target Position"); bool resIncr = double.TryParse(txtIncr.Text, out double Increment); if (resIncr == false) FalseBoolMsg("Increment"); Ch.FunctionA(Ch.FunctionX, SomeInt, Increment, Ch.FunctionY); Ch.FunctionB(SomeInt, SPos, Ch.FunctionY); Ch.FunctionA(0, SomeInt, TPos, Ch.FunctionZ); }
你最初尝试把变量名作为字符串传递的思路走不通,因为C#是强类型语言,没法直接通过字符串操作变量。正确的思路是复用double.TryParse本身的**out参数**设计,让封装方法返回解析结果的同时,把解析后的数值通过out参数传递回调用方。
你最终找到的方案完全正确,这里拆解一下它为什么能完美解决问题:
封装后的通用解析方法
private bool TryParseDouble(string parseInput, out double parsedValue, string fieldName) { if (!double.TryParse(parseInput, out parsedValue)) { FalseBoolMsg(fieldName); return false; } return true; }
parseInput:直接传入TextBox的文本值(比如txtSPos.Text),不用再传字符串形式的控件名out double parsedValue:通过out参数把解析后的数值传递回调用方,这正是你后续需要使用的变量fieldName:错误提示框中要显示的字段名称(比如"Starting Position")- 返回值:标记解析是否成功,方便你后续如果需要中断逻辑的话做判断
简洁的调用方式
在按钮点击事件里这样调用,既精简了代码,又能正常拿到解析后的变量供后续方法使用:
private void button_Click(object sender, EventArgs e) { // 一行代码完成一个输入的解析+错误提示 TryParseDouble(txtSPos.Text, out double SPos, "Starting Position"); TryParseDouble(txtTPos.Text, out double TPos, "Target Position"); TryParseDouble(txtIncr.Text, out double Increment, "Increment"); // 后续正常使用解析后的变量 Ch.FunctionA(Ch.FunctionX, SomeInt, Increment, Ch.FunctionY); Ch.FunctionB(SomeInt, SPos, Ch.FunctionY); Ch.FunctionA(0, SomeInt, TPos, Ch.FunctionZ); }
如果需要在任意一个输入解析失败时直接中断后续逻辑(比如不让FunctionA/B执行),还可以结合返回值做判断:
private void button_Click(object sender, EventArgs e) { // 解析失败就直接return,避免后续无效逻辑 if (!TryParseDouble(txtSPos.Text, out double SPos, "Starting Position")) return; if (!TryParseDouble(txtTPos.Text, out double TPos, "Target Position")) return; if (!TryParseDouble(txtIncr.Text, out double Increment, "Increment")) return; // 只有所有解析都成功才执行后续业务逻辑 Ch.FunctionA(Ch.FunctionX, SomeInt, Increment, Ch.FunctionY); Ch.FunctionB(SomeInt, SPos, Ch.FunctionY); Ch.FunctionA(0, SomeInt, TPos, Ch.FunctionZ); }
这样一来,所有重复的解析和提示逻辑都被收拢到一个方法里,后续新增类似的输入解析只需要一行调用代码,代码的整洁度和可维护性都提升了不少。
内容的提问来源于stack exchange,提问作者Stoverflow
相关产品推荐
相关产品推荐

