为什么要嘘.TrueString和bool.FalseString存在

本文关键字:bool FalseString 存在 TrueString 为什么 | 更新日期: 2023-09-27 18:20:54

我在阅读MSDN上关于布尔结构的文章时,发现布尔有两个字段:TrueString和FalseString。它们分别返回"True"answers"False"。

经过一番搜索,我能找到的唯一例子是在这篇dotnetperls文章中。文章指出:

程序通常需要这些字符串。TrueString和FalseString是一对有用的只读成员。它们以字符串格式表示真值。它们提供了间接性和抽象性,而不是直接使用字符串文字。

从表面上看,它对某些情况很有用。但同一篇文章未能提供一个现实的例子(无论如何,IMHO)。

一些进一步的阅读也引起了我的注意:TrueString和FalseString是公共静态只读字段。这篇文章指出:

语言规范建议使用公共静态只读字段。。。当该领域在未来可能发生变化时。

现在我可以稍微理解了。如果.NET开发人员决定将"True"answers"False"分别更改为"OkeyDokey"answers"Negory",那么明智的做法是使用TrueString和/或FalseString。

但这仍然给我留下了一个问题:在什么样的场景中,你想将字符串与布尔值的字符串文字进行比较?因为显而易见:"程序经常需要"它们

为什么要嘘.TrueString和bool.FalseString存在

原因与string.Empty存在的原因相同。有些人更喜欢代码中的语义命名值,而不是字面命名值。

在现代.NET(.NET Framework之后的任何东西)中,以下代码打印True三次:

Console.WriteLine(ReferenceEquals("True", bool.TrueString));
Console.WriteLine(ReferenceEquals("False", bool.FalseString));
Console.WriteLine(ReferenceEquals("", string.Empty));

这告诉我们文字和字段之间存在零运行时差异。它们在运行时是完全相同的对象。

在sharplab.io上试试这个。


其他人提到在解析布尔字符串时使用它进行比较,但我不建议这样做。如果要将string转换为bool,请使用bool.TryParsebool.Parse。使用==可以进行区分大小写的比较,这可能不是您想要的。此外,该框架的方法专门针对常见情况进行了优化。你可以在GitHub上的代码中看到这些优化:https://github.com/dotnet/runtime/blob/f8fa9f6d1554e8db291187dd7b2847162703381e/src/libraries/System.Private.CoreLib/src/System/Boolean.cs#L226

如果程序将数据存储在可读文件或数据库中,则可能需要将值存储为字符串。当您在中读取数据时,如果您知道数据是由您的应用程序编写的,并且使用标准字符串表示,则可以比bool.TryParse(x ...)更快地比较x == bool.TrueString。您还可以通过确保所有值x == bool.TrueString || x == bool.FalseString 来验证数据

如果数据是由人类或其他系统键入的,TryParse是一个更好的选择,因为它接受更多的true值,并区分明确的false和无效输入。(MSDN布尔TryParse)

它可以用作缺失的默认值"字符串类型的";配置参数。下面是我最近使用的一个具体示例:

 if (bool.Parse(ConfigurationManager.AppSettings["IsTestMode"] ?? bool.FalseString)) ...

在我看来,它比更简单、更可读

 var isTestModeString = ConfigurationManager.AppSettings["IsTestMode"];
 if (isTestModeString != null && bool.Parse(isTestModeString)) ...

(我故意不在这里使用TryParse,因为我不希望静默地忽略无效值。如果存在配置值以及TrueFalse以外的其他值,我希望抛出异常。)

在许多情况下,您可能需要比较字符串是否等于"真";,例如检查API响应。注意:比较字符串更有效,但解析起来更安全。

使用内置属性的唯一优点是不会拼写错误(假设您有Intellisense),也不必记住大小写(例如"true"而不是"true")。

用简单的话来说。布尔值是一种结构。这个布尔值公开ToString()方法,它为用户表示一个可读的文本。所以,如果你写一些类似的东西。

bool b = false;
b.ToString();

输出将是"False"而不是0。"虚假"是可读的人和容易被捕获。

还有一些地方,您可能希望将文本值解析为布尔值。所以这些也可以表示为布尔值。例如我们使用

Boolean.TryParse("false" ,out mybool)

错误值是由Tryprse方法设置的,因为它发现我们可以从字符串工具中读取值。