对 C# 6.0 中的字符串插值感到困惑 [重复]

Posted

技术标签:

【中文标题】对 C# 6.0 中的字符串插值感到困惑 [重复]【英文标题】:Confuse about String Interpolation in C# 6.0 [duplicate] 【发布时间】:2018-01-23 03:15:34 【问题描述】:

我有这段代码,这个内联变量 (hour > 12 ? "PM" : "AM")

我创建它并且它可以工作但我很困惑,因为没有大括号() 我有一些代码有很多红色下划线的问题,感染编译器代码建议用红色下划线重构它,但是在用() 包装我的表达式之后它有效。

我只想知道() 在这个插值内联变量中的状态是什么?

WriteLine($"hour:minout:seconds  (hour > 12 ? "PM" : "AM") ");

【问题讨论】:

只是为了确保您提供了一个示例,但不要真的以这种方式使用此代码 - dateTime.ToString("HH:mm:ss tt") 是这样做的正确方法。附: 12:00 是下午 12 点,而不是上午 12 点。 感谢您的回复。但我只是为了演示目的而创建它。只是为了学习一些 C# 6 和 c# 7 的特性。谢谢,我会在我的项目中使用您的建议。谢谢 【参考方案1】:

: 运算符是用于字符串插值的字符串格式化的有效运算符

var date = new DateTime(2017, 8, 31);
var stringDate = $"Date is date:yyyy.MM.dd"; // "Date is 2017.08.31"

不带括号的: 被认为是格式字符串,而不是条件运算符,因此对于使用条件运算符,您应该将条件表达式用括号括起来。

var stringDate = $"It is (date.Hours > 12 ? "evening" : "morning")";

另一种方法(可能更具可读性)在格式化结果之前执行所有表达式

var dayPart = date.Hours > 12 ? "evening" : "morning";
var stringDate = $"It is dayPart";

【讨论】:

我一直不明白他们为什么允许在那里表达。我的意思是如果你以后需要它,你需要复制粘贴你的代码。虽然使用计算变量(如在您的第二种方法中)使其至少可重用,而且它更具可读性。【参考方案2】:

那里的括号表示一个表达式,首先需要对其求值,然后其结果将是插值字符串的输入。

对于正式的方法,请查看以下链接

Expressions 并搜索词带括号的表达式 在本文档中。

关于内插字符串,您可以找到更多信息here。但是,您必须记住的一件事是它的结构:

$"<text> <interpolated-expression> [,<field-width>] [<:format-string>]  <text> ..."

在您的情况下,(...) 是插值表达式。

【讨论】:

感谢您的回复。但是为什么代码建议没有以正确的方式重构。 @BabarQB 欢迎您。就我对重构建议的了解而言,我可以说编译器无法建议您重构代码的所有可能方式。当然,它可以发现许多常见的模式,然后给你一个建议。但是,还有许多其他模式,您不会从任何编译器/或任何静态分析工具中获得重构建议。

以上是关于对 C# 6.0 中的字符串插值感到困惑 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

对c#中的引用传递和值传递感到困惑

C#6.0新特性

C#发展历程以及C#6.0新特性

C#发展历程以及C#6.0新特性

对JAVA界面感到困惑[重复]

对 SQL Server 中的默认字符串比较选项感到困惑