对 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 中的字符串插值感到困惑 [重复]的主要内容,如果未能解决你的问题,请参考以下文章