C#如何根据输入行数动态拼接字符串并解决变量未赋值报错
报错原因
使用了未赋值的局部变量'MessageToSend'
你的代码仅覆盖了AmountOfLines为1、2的赋值分支,当输入为其他数值(3-10、非法值)时,MessageToSend没有被赋值就被后续代码调用,C#编译器对局部变量的明确赋值规则不允许这种情况,因此抛出错误。
实现方案选择
不管是if-else还是switch-case都不是最优解,你最多要处理10种分支,代码冗余度高,后续修改也麻烦,直接用内置方法实现即可,代码更简洁易维护。
最优实现代码
首先给MessageToSend设默认值兜底,再做范围校验,之后用Enumerable.Repeat+string.Join实现重复拼接:
// 先做输入范围校验,确保行数在1-10之间 int validLines = AmountOfLines switch { < 1 => 1, > 10 => 10, _ => AmountOfLines }; // 重复N次Message后用换行拼接 string MessageToSend = string.Join(Environment.NewLine, Enumerable.Repeat(Message, validLines));
如果你的项目运行环境是.NET 6及以上,还可以用更高效的string.Create实现:
int validLines = Math.Clamp(AmountOfLines, 1, 10); int singleLength = Message.Length + Environment.NewLine.Length; int totalLength = singleLength * validLines - Environment.NewLine.Length; string MessageToSend = string.Create(totalLength, (Message, validLines), (span, state) => { var (msg, lines) = state; for (int i = 0; i < lines; i++) { msg.CopyTo(span); span = span.Slice(msg.Length); if (i != lines - 1) { Environment.NewLine.CopyTo(span); span = span.Slice(Environment.NewLine.Length); } } });
分支实现的注意事项
如果确实要走if-else或switch分支,必须给MessageToSend设置初始默认值,或者覆盖所有可能的分支:
// 方法1:声明时给默认值兜底 string MessageToSend = string.Empty; if(AmountOfLines == 1) { MessageToSend = Message; } else if(AmountOfLines == 2) { MessageToSend = Message + Environment.NewLine + Message; } // 其他分支补充... // 方法2:用switch的default分支兜底 string MessageToSend = AmountOfLines switch { 1 => Message, 2 => $"{Message}{Environment.NewLine}{Message}", // 其他case... _ => Message // 兜底分支,避免未赋值 };
内容的提问来源于stack exchange,提问作者Lets go yea
相关产品推荐
相关产品推荐

