C#内嵌字符串格式化输出

内嵌字符串格式输出

double speedOfLight = 299792.458;

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = $"The speed of light is {speedOfLight:N3} km/s.";

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = string.Create(
    specificCulture, $"The speed of light is {speedOfLight:N3} km/s.");

string messageInInvariantCulture = string.Create(
    System.Globalization.CultureInfo.InvariantCulture, $"The speed of light is {speedOfLight:N3} km/s.");

Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Output is:
// nl-NL      The speed of light is 299.792,458 km/s.
// en-IN      The speed of light is 2,99,792.458 km/s.
// Invariant  The speed of light is 299,792.458 km/s.

$ - 字符串内插 - 格式字符串输出 - C# reference | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/tokens/interpolated?devlangs=csharp&f1url=%3FappId%3DDev17IDEF1%26l%3DZH-CN%26k%3Dk(%24_CSharpKeyword)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%3Dv4.8)%3Bk(DevLang-csharp)%26rd%3Dtrue特此记录

anlog

2025年8月15日

<think> 我们正在讨论C#字符串拼接,用户要求查找相关信息。根据之前的对话历史,用户已经询问过转义字符,现在转向字符串拼接。 引用[1][2][3][4][5]提供了关于C#字符串拼接的不同方法,包括使用加号运算符、String.Format、字符串插值以及StringBuilder等。 我们需要整理一个清晰的回答,涵盖常见的字符串拼接方法,并比较它们的性能特点(因为引用[2][5]提到字符串是不可变的,频繁拼接可能产生性能问题)。 回答结构: 1. 介绍字符串拼接的基本概念和常见场景。 2. 逐一介绍拼接方法,包括代码示例(引用[4]提供了几种方法的代码)。 3. 讨论性能问题,特别是对于大量拼接操作时,为什么StringBuilder更优(引用[5]解释了StringBuilder的缓冲机制)。 4. 总结和建议(在什么情况下使用哪种方法)。 注意:根据用户指令,我们需要在引用后添加引用标识,例如[^1]。 同时,按照系统级指令,如果有数学公式,需要使用LaTeX格式,但本问题不涉及数学公式,所以主要关注代码示例和文字描述。 最后,生成相关问题。 注意:引用标记需要对应到我们提供的引用。目前我们有5个引用,其中引用[1][2][3][4][5]都是关于字符串拼接的。 但需要注意的是,用户上一次的问题是关于转义字符,而当前问题是关于字符串拼接,所以我们要专注于字符串拼接。 由于引用内容较多,我们需要合理选择: 引用[1]:使用加号运算符拼接。 引用[2]:介绍了字符串的不可变性以及四种拼接方式(但具体方式在引用[4]中)。 引用[3]:与引用[2]类似。 引用[4]:提供了四种拼接方法的代码示例(加号、Console.WriteLine的占位符、字符串插值、String.Format)。 引用[5]:解释了StringBuilder的机制。 因此,我们可以这样组织: 1. 使用加号(+)拼接:简单直观,适合少量拼接[^1][^4]。 2. String.Format方法:格式化字符串,适合需要格式控制的场景[^4]。 3. 字符串插值($前缀):C#6.0引入,更简洁直观[^4]。 4. StringBuilder:适合循环或大量拼接操作,避免创建大量临时字符串[^5]。 我们还需要提到Console.WriteLine的占位符方式(但注意,这种方式通常用于输出,不一定是字符串拼接)。 另外,引用[4]中示例的第四种方法就是String.Format,第三种是字符串插值。 注意:引用[2]中提到四种方式,但没有具体列出,我们以引用[4]的代码为准。 因此,我们可以在回答中这样写: 方法一:使用加号运算符(+)[^1][^4] 方法二:使用String.Format[^4] 方法三:使用字符串插值($)[^4] 方法四:使用StringBuilder(引用[5]) 我们将引用[2]和[3]作为背景介绍(字符串的不可变性)来引用。 由于用户指令要求生成相关问题,我们在最后提出三个相关问题。 注意:代码示例要使用C#,并且正确。 最后,按照格式要求,在引用处自然添加引用标识。 </think> ### C#字符串拼接方法详解 在C#中,字符串是不可变的引用类型(`sealed class`),每次修改都会创建新对象。以下是常用拼接方法及其适用场景[^2][^5]: #### 1. **加号运算符(`+`)** ```csharp string str1 = "Hello," + "World!"; // 输出: Hello,World! ``` - **适用场景**:简单常量拼接或少量变量拼接 - **缺点**:频繁操作会生成大量临时对象(需垃圾回收)[^2] #### 2. **`String.Format`方法** ```csharp string name = "Alice"; string formatted = String.Format("Name: {0}, Age: {1}", name, 25); // 输出: Name: Alice, Age: 25 ``` - **优势**:支持复杂格式控制(如数字格式化`{1:C}`) - **典型场景**:本地化文本、带格式的日志输出[^4] #### 3. **字符串插值(`$`前缀)** ```csharp int score = 95; string result = $"Score: {score} ({(score > 60 ? "Pass" : "Fail")})"; // 输出: Score: 95 (Pass) ``` - **优势**:代码简洁,支持表达式内嵌C# 6.0+) - **编译优化**:等效于`String.Format`,但可读性更强[^4] #### 4. **`StringBuilder`类** ```csharp using System.Text; var sb = new StringBuilder(); for(int i=0; i<1000; i++) { sb.Append(i.ToString()); } string final = sb.ToString(); // 避免生成1000个临时字符串 ``` - **核心优势**:缓冲池机制,动态调整容量 - **适用场景**: - 循环内大量拼接(如生成XML/JSON) - 高性能需求场景(约10倍效率提升)[^5] - **关键方法**: - `Append()` 追加内容 - `AppendFormat()` 格式化追加 - `Replace()` 批量替换 #### 5. **`Concat`静态方法** ```csharp string[] words = {"C#", "is", "powerful"}; string combined = String.Concat(words); // 输出: C#ispowerful ``` - **特点**:专为数组合并优化 - **局限**:不支持格式控制 ### 性能对比与选择建议 | 方法 | 内存效率 | 适用场景 | |--------------------|----------|-----------------------------| | `+` 运算符 | 低 | 简单常量拼接(<5次操作) | | `String.Format` | 中 | 需格式化的中等长度文本 | | `$` 字符串插值 | 中 | 现代代码首选(可读性最佳) | | `StringBuilder` | 高 | 循环/大批量操作(>10次拼接) | | `String.Concat` | 高 | 数组合并场景 | > 💡 **关键准则**:超过10次拼接或循环操作时**务必使用StringBuilder**,否则会导致内存碎片和GC压力[^5]。 ### 示例场景对比 ```csharp // 错误示范(循环内用+) string output = ""; for(int i=0; i<100; i++) { output += i; // 产生101个临时对象 } // 正确示范(StringBuilder) var sb = new StringBuilder(capacity: 500); // 预分配容量 for(int i=0; i<100; i++) { sb.Append(i); // 仅1个对象 } ``` ### 总结 选择拼接方法需平衡**可读性**与**性能**。日常开发推荐字符串插值(`$`),性能敏感场景强制使用`StringBuilder`。理解字符串不可变性是优化基础,避免在循环中意外创建大量临时对象[^2][^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值