为何先声明变量时C# IsStrangePair方法无法正常运行?
为什么先声明字符串字符变量会导致代码失效?
核心原因是C#代码是从上到下顺序执行的,你最初的代码里,变量初始化逻辑在空值/长度判断之前,导致传入空字符串或null时,还没走到判断逻辑就触发了异常。
最初代码的问题
当str1或str2是空字符串(Length=0)时,执行str1[0]会抛出IndexOutOfRangeException;如果是null,则会抛出NullReferenceException。这些异常会直接中断代码执行,后面的长度判断逻辑根本没机会运行。
比如传入str1="",代码刚执行到char firstCharInStr1 = str1[0];就报错了,完全走不到下面的if (str1.Length == 0 && str2.Length == 0)判断。
修改后代码有效的原因
你在开头添加的string.IsNullOrEmpty判断,会在变量初始化之前先检查字符串状态:
- 如果任意一个字符串是空或
null,直接返回str1 == str2的结果(两个都为空/null时返回true,否则返回false),不会执行后面的变量声明代码,自然避免了异常。 - 只有当两个字符串都非空非
null时,才会走到变量初始化和字符匹配的逻辑,这时候访问str[0]和str[str.Length-1]是安全的。
关于你疑惑的“变量声明顺序”
你之前认为变量必须先声明再使用,这个没错,但问题出在变量初始化时的代码会立即执行——你在声明变量时直接访问了字符串的索引,这部分代码会在所有判断逻辑之前运行,所以只要字符串不合法,就会直接报错。正确的流程应该是先做合法性校验,确认安全后再去访问字符串的字符或长度属性。
优化建议
修改后的代码里,后面的B部分判断(if (str1.Length == 0 && str2.Length == 0)等)已经完全没用了,因为前面的string.IsNullOrEmpty已经处理了所有空/null情况,可以删掉让代码更简洁:
public static bool IsStrangePair(string str1, string str2) { if(string.IsNullOrEmpty(str1) || string.IsNullOrEmpty(str2)) { return str1 == str2; } char firstCharInStr1 = str1[0]; char lastCharInStr1 = str1[str1.Length-1]; char firstCharInStr2 = str2[0]; char lastCharInStr2= str2[str2.Length-1]; return firstCharInStr1 == lastCharInStr2 && lastCharInStr1 == firstCharInStr2; }
内容的提问来源于stack exchange,提问作者Priscilla
相关产品推荐
相关产品推荐

