为什么使用{}来打印而不是加号?

本文关键字:打印 为什么 | 更新日期: 2023-09-27 18:14:23

我用c#在Unity3D中编码,当打印或使用调试语句或控制台语句时,我一直使用这样的东西:

Debug.Log("The sum of these two variables is :" + SumOfVariables);

然而,我正在阅读一本新书,试图学习成为一个更好的程序员,他们经常使用这个代替:

Debug.Log("The sum of these two variables is {0}", SumOfVariables);

我想这两种方法都没关系,但是使用后者有什么好处吗?此外,对于任何使用unity的人来说,当我尝试以这种方式使用它时,我都会得到一个错误消息,但当我使用第一种方法时,它会工作得很好。它说debug。log没有相应的参数。我也不能将字符串表达式转换为unityengine。object类型。我使用的变量是一个类的String属性。

我的问题不是关于统一件,而是关于哪个更好。但是如果你想告诉我为什么会出现这个错误那就很好了。我确信这个问题之前已经被问到过,但是当我试图搜索时,我得到了各种不同的主题,所以我提前道歉,谢谢回答!!

为什么使用{}来打印而不是加号?

使用格式字符串而不是字符串连接的原因是它使本地化成为可能。将格式字符串翻译成另一种语言很容易,但重写代码就比较困难了。

"{0}: invalid photoscamp (id={1}) inside flange"

在猪拉丁文中,

"{0}: invaliday otoscamphay (iday={1}) insidea angeflay"

使用格式字符串还有其他原因,例如性能、代码可读性以及在文件或数据库中存储格式字符串的能力。参见c#字符串输出:format or concat?

使用格式字符串{} version时,可以更容易地重复变量。

此外,它可以很容易地将字符串作为一个项目读取,带有占位符和添加占位符(只需添加另一个具有正确索引的{}并抛出另一个参数)。

格式字符串通常更容易阅读和稍后更改。

这只是一种不同类型的字符串插值。大多数情况下,这只是为了美观,但有些人发现括号也更容易使用

看一下Debug.Log方法的签名。第二个版本类似于:

string format, params object[] p

第一个参数是格式,第二个参数实际上是一个可变数目的参数,表示格式字符串中的替换项。

从代码维护的角度来看,第二种方法是首选——它更容易阅读代码的意图,并在以后进行修改——因此比连接字符串更好。

所以回答你的问题,为什么它不工作的第二种方式,很可能没有过载的Debug.Log,以格式字符串作为第一个参数。对于其他日志框架(以及,例如Debug.WriteLine),通常会有一个格式参数。

与简单的连接相比,{}机制的一个重要优点是关注点分离。从抽象的角度来看待这个问题:这里有许多数据元素,它们需要按顺序组合以组成一段文本。

使用串联方法,将数据元素组合的确切规则在代码中几乎是固定的。使用{}机制,需要组合的组件列表在代码中仍然是固定的——这是可以的,因为数据列表通常只依赖于程序的逻辑。然而,该组合的确切性质被隔离在单个字符串中,这意味着它可以很容易地根据用户偏好或其他环境因素进行控制和调整,而无需改变逻辑。

这听起来很晦涩和理论化,但事实并非如此。到目前为止,这种能力最常见的用法是"本地化"。通过为不同的语言或"区域性"存储不同版本的模式字符串,您可以很容易地生成在您选择的任何语言(可能基于用户选项)上语法正确的消息。除了最简单的情况外,通过连接方法做同样的事情几乎是不可能的(因为不能在运行时更改元素的顺序)。

这不是唯一的可能性:您可以有一个多客户端系统,根据每个不同客户端的需求产生不同的消息。或者可能是一个系统,它为技术成熟的用户(例如,为您公司的技术支持工作的专家)提供复杂的详细错误消息,而为普通用户(例如,客户)提供简单得多的错误消息。