C# 没有内置 String.Reverse() 方法,需用 new string(str.Reverse().ToArray()) 安全反转;手动循环适用于高性能或旧框架场景。

直接说结论:C# 里没有内置的 String.Reverse() 方法,所谓“一行反转”实际调用的是 LINQ 的 Enumerable.Reverse(),它返回 IEnumerable<char></char>,不是 string——不显式转回字符串会出错或静默失败。
用 new string(str.Reverse().ToArray()) 最稳妥
这是最常用、语义最清晰的方式,适用于 .NET Core 2.0+ 和 .NET Framework 4.7.2+:
string str = "hello"; string reversed = new string(str.Reverse().ToArray()); // "olleh"
注意点:
-
str.Reverse()不修改原字符串(字符串本就不可变) - 必须用
.ToArray()再传给string构造函数;只写new string(str.Reverse())会编译失败(无匹配构造函数) - 性能上:产生中间数组,对超长字符串(如 >1MB)要注意内存分配
手动 for 循环反转 —— 避免 LINQ 开销时用
当处理高频、短字符串(比如解析协议字段),或目标框架不支持 LINQ(如旧版 .NET Micro Framework),手动循环更可控:
string str = "world";
char[] chars = str.ToCharArray();
for (int i = 0, j = chars.Length - 1; i < j; i++, j--)
{
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
string reversed = new string(chars); // "dlrow"关键细节:
- 必须用
ToCharArray()拷贝一份,不能直接索引字符串赋值(string是只读的) - 循环边界是
i ,不是 <code>i ,否则中间字符会被换两次,等于没换 - 这个版本无 LINQ 依赖,兼容性最好,也最容易调试
别踩 Array.Reverse(str.ToCharArray()) 这个坑
常见错误写法:
string reversed = Array.Reverse(str.ToCharArray()); // ❌ 编译不过
原因:
-
Array.Reverse()返回void,不是数组本身 - 即使写成两行:
var arr = str.ToCharArray(); Array.Reverse(arr); string s = new string(arr);—— 看似可行,但容易漏掉第二步,尤其在链式调用场景下 - 和 LINQ 版本混用时,命名相似(
Reverse())但行为差异大,团队协作时易误读
Unicode 字符(如 emoji、组合字符)要小心
以上所有方法都按 char(UTF-16 code unit)反转,不是按“用户感知的字符”反转。例如:
string s = "??"; // ZWJ 序列,占 4 个 char string r = new string(s.Reverse().ToArray()); // 结果是乱码,ZWJ 关系被破坏
如果业务涉及 emoji、带重音符号的字母(如 “café”)、中文生僻字等,需用 StringInfo 或 TextElementEnumerator 拆分图元簇(grapheme clusters)再反转:
using System.Globalization;
string s = "café";
var enumerator = StringInfo.GetTextElementEnumerator(s);
var elements = new List<string>();
while (enumerator.MoveNext())
elements.Add(enumerator.GetTextElement());
string reversed = string.Concat(elements.AsEnumerable().Reverse()); // "éfac"这点常被忽略——日常测试用英文 ASCII 字符串看不出问题,一到真实多语言数据就暴露。


















