C# 中的字符串插值(涵盖 C# 10 和 C# 11)
bigegpt 2024-10-12 05:20 6 浏览
摘要: 本教程探讨了 C# 中字符串插值从开始到最新增强功能的演变。本指南深入探讨了其功能,展示了其可读性、简洁性和灵活性。
如果您已经涉足 C# 一段时间,您可能已经遇到过“字符串插值”一词。这是使我们的编码生活更加丰富多彩的功能之一。
在本教程中,让我们深入了解这个宝石多年来是如何演变的,探索它的起源、演变和最新的增强功能。
一切开始的地方:字符串插值的起源
字符串插值是在 C# 6 中引入的,是一种更易读、更简洁的字符串格式化方式。
早在 C# 6 时代,字符串插值就盛大地进入了它。在此之前,我们一直坚持使用占位符,并希望我们不要将它们混淆。string.Format
还记得这样做吗?
string carModel = "Sedan";
string carBrand = "Maruti";
string carYear = "2020";
string formattedString = string.Format("The car model is: {0}, brand is: {1}, and it was manufactured in {2}", carModel, carBrand, carYear);
在这里,我们使用该方法来格式化我们的字符串。、 和 用作占位符,分别替换为 、 和 的值。string.Format{0}{1}{2}carModelcarBrandcarYear
这种方法的缺点是,随着变量数量的增加,跟踪哪个占位符对应于哪个变量变得更加困难,从而使代码的可读性降低。
但是有了字符串插值,感觉就像呼吸了一口新鲜空气:
string carModel = "Sedan";
string carBrand = "Maruti";
string carYear = "2020";
string formattedString = #34;The car model is: {carModel}, brand is: {carBrand}, and it was manufactured in {carYear}";
不再计算占位符,对吧?
使用插值字符串,我们现在可以直接将变量嵌入到字符串中。0
它的工作方式是,字符串之前表示它是一个插值字符串。因此,现在的代码更具可读性,而且无需将占位符与变量匹配,从而减少了出错的机会。$
旅程:从 C# 6 到 C# 12 的字符串插值的演变
C# 6:字符串插值简介
这是字符串插值的曙光。简单而优雅。
示例:
string carBrand = "Maruti";
string message = #34;The car brand is {carBrand}";
C# 7 和 8:优化和可用性
虽然 C# 7 和 8 没有对字符串插值进行重大更改,但它对功能进行了微调,确保它与其他语言方面很好地融合在一起。
示例:将插值字符串与本地函数一起使用:
string GetCarDetails(string brand, int year)
{
return #34;The car brand is {brand} and it was manufactured in {year}.";
}
string details = GetCarDetails("Maruti", 2020);
这种方法比使用占位符更直观,尤其是在处理多个变量时。
C# 9:性能改进
C# 9 增强了字符串插值的性能,这在构造大型字符串或性能关键型应用程序时特别有用。
示例:
使用字符串插值构建大型字符串:
List<string> carBrands = new List<string> { "Ambassador", "Maruti", "Tata", "Mahindra" };
StringBuilder sb = new StringBuilder();
foreach (var brand in carBrands)
{
sb.AppendLine(#34;Brand: {brand}, Founded in: {GetFoundationYear(brand)}");
}
string carHistory = sb.ToString();
int GetFoundationYear(string brand)
{
// Sample logic to return a foundation year based on the brand
return brand switch
{
"Ambassador" => 1948,
"Maruti" => 1983,
"Tata" => 1991,
"Mahindra" => 1954,
_ => 0,
};
}
在此 C# 9 示例中,我们强调在循环中使用字符串插值来生成更大的字符串,并展示了使用插值构造字符串的性能改进。
C# 10:改进的插值字符串
这个版本改变了游戏规则。从直接嵌入变量到条件插值和格式说明符,它带来了很多好处。
1. 插值字符串处理程序:
之前:
string name = "Supro";
string age = "44";
string city = "Cloud9";
var message = string.Format("Hello {0}, aged {1}, from {2}!", name, age, city);
在这里,我们使用该方法来格式化我们的字符串。、 和 是分别替换为 、 和 值的占位符。随着变量数量的增加,管理起来变得繁琐,容易出错。string.Format{0}{1}{2}nameagecity
之后:
string name = "Supro";
string age = "44";
string city = "Cloud9";
FormattableString message = #34;Hello {name}, aged {age}, from {city}!";
使用插值字符串,我们现在可以直接将变量嵌入到字符串中。这使代码更加简洁,并减少了占位符不匹配的可能性。
2. 条件插值:
之前:
bool isMorning = true;
string greeting = isMorning ? "Good morning" : "Good evening";
string name = "Bob";
var message = string.Format("Hello {0}, {1}!", name, greeting);
早些时候,我们使用三元条件运算符的组合来构造我们的消息。正如你所看到的,在复杂的条件和多个变量的情况下,这可能变得难以阅读。string.Format
之后:
bool isMorning = true;
string name = "Bob";
var message = #34;Hello {name}, {(isMorning ? "Good morning" : null)}!";
在这个改进的版本中,我们现在可以有条件地直接包含插值字符串的部分。正如你所看到的,代码更具可读性,允许更灵活的字符串构造。
3. 格式说明符:
之前:
double cost = 100.50;
double tax = 10.05;
var price = string.Format("Total price: {0:C2}", cost + tax);
在这里,我们使用 和 的总和格式化为小数点后两位的货币。string.Formatcosttax
这种方法要求我们跟踪格式说明符及其相应的变量。
之后:
double cost = 100.50;
double tax = 10.05;
var price = #34;Total price: {cost + tax:C2}";
通过改进的插值字符串,我们可以直接在插值字符串中应用格式说明符,使代码更加直观,并减少格式说明符不匹配的机会。:C2
C# 11:插值中的原始字符串文本和换行符
原始字符串文字:
之前:
var path = "C:\\Users\\John\\Documents";
字符串中的反斜杠需要用另一个反斜杠进行转义,这使得路径和正则表达式变得繁琐。
之后:
var path = @"C:\Users\John\Documents";
C# 11 中引入的原始字符串文本允许我们编写字符串,而无需使用字符串前的符号转义特殊字符。@
插值中的新行:
之前:
string name = "Alice";
var message = #34;Hello\n{name}!";
为了在字符串中包含新行,我们必须使用转义序列。\n
之后:
string name = "Alice";
var message = #34;Hello
{name}!";
如您所见,C# 11 现在允许我们直接在插值字符串中包含新行。这使代码更具可读性。
字符串插值的优点
插值字符串更具可读性,因为它们允许开发人员直接查看最终的字符串结构,并带有嵌入的表达式。
它们还减少了对额外占位符和函数调用的需求。
字符串插值还支持任何表达式类型,包括方法调用和算术运算。
结论
从 C# 6 中的引入到 C# 11 中的最新增强功能以及 C# 12 中的预期功能,字符串插值已被证明是 C# 中的一项非常宝贵的功能。
它不仅使字符串格式更具可读性和简洁性,而且还不断发展以解决性能问题并为开发人员提供更大的灵活性。
随着 C# 的不断发展,字符串插值必将得到更多的改进,巩固其作为该语言最受欢迎的功能之一的地位。
原文链接:String Interpolation in C# (Covers C# 10 and C# 11) | DotNetCurry
讨论
在你的开发生涯中,最经常使用的是哪种字符串插值方式,欢迎评论区留言讨论!
相关推荐
- 得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践
-
一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...
- warm-flow新春版:网关直连和流程图重构
-
本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...
- 扣子空间体验报告
-
在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...
- spider-flow:开源的可视化方式定义爬虫方案
-
spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...
- solon-flow 你好世界!
-
solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...
- 新一代开源爬虫平台:SpiderFlow
-
SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...
- 通过 SQL 训练机器学习模型的引擎
-
关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...
- 鼠须管输入法rime for Mac
-
鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...
- Go语言 1.20 版本正式发布:新版详细介绍
-
Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...
- iOS 10平台SpriteKit新特性之Tile Maps(上)
-
简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...
- 程序员简历例句—范例Java、Python、C++模板
-
个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...
- Telerik UI for iOS Q3 2015正式发布
-
近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...
- ios使用ijkplayer+nginx进行视频直播
-
上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...
- IOS技术分享|iOS快速生成开发文档(一)
-
前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...
- macOS下配置VS Code C++开发环境
-
本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- httperror403.14-forbidden (63)
- logstashinput (65)
- hadoop端口 (65)
- dockernetworkconnect (63)
- esxi7 (63)
- vue阻止冒泡 (67)
- c#for循环 (63)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- java大写转小写 (63)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)