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

时间:2013-05-19 19:53:43

标签: c# debugging printing

我在C#中用Unity3D编码,在打印或使用调试语句或控制台语句时,我总是使用这样的东西:

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

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

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

我认为无论哪种方式都无关紧要,但使用后者是否有优势?此外,对于使用统一的任何人,当我尝试以这种方式使用它时,我收到错误消息,但是当我使用第一种方法时,它工作正常。它基本上说Debug.Log没有一个参数。而且我无法将字符串表达式转换为UnityEngine.Object类型。我正在使用的变量是类的String属性。

我的问题不是关于团结的问题,而是关于哪个更好。但是如果你想告诉我为什么我会得到那个很棒的错误,那么还有额外的功劳。我确信以前曾经问过这个问题,但是当我尝试搜索时,我得到了各种不同的主题,所以我提前道歉,谢谢你回答!!

6 个答案:

答案 0 :(得分:4)

您应该使用格式字符串而不是字符串连接的原因是因为它使本地化成为可能。将格式字符串转换为不同的语言很容易,但重写代码更加困难。

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

猪拉丁,

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

使用格式字符串还有其他原因,例如性能,代码可读性以及在文件或数据库中存储格式字符串的能力。请参阅C# String output: format or concat?Why use String.Format?

答案 1 :(得分:3)

使用格式字符串{}版本时,可以更轻松地重复变量。

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

通常,格式字符串更易于阅读和更改。

答案 2 :(得分:0)

这只是一种不同类型的字符串插值。主要是出于美观的原因,但有些人发现括号更容易使用

答案 3 :(得分:0)

查看Debug.Log方法的签名。第二个版本将具有类似的内容:

string format, params object[] p

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

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

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

答案 4 :(得分:0)

我认为{}方法的优势在于您可以在资源中拥有一个字符串(有很多理由将单个消息作为单个字符串:很容易找到拼写错误,易于翻译)并且只需填写在那之后的空白。

答案 5 :(得分:0)

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

使用串联方法,组合数据元素的确切规则几乎是固定的。使用{}机制,需要组合的组件列表仍然在代码中固定 - 这是好的,因为基准列表通常仅取决于程序的逻辑。但是,该组合的确切性质被隔离在一个字符串中,这意味着它可以根据用户偏好或其他环境因素轻松控制和调整,而不会改变逻辑。

听起来非常模糊和理论,但事实并非如此。到目前为止,这种力量最常见的用途是本地化"。通过为不同的语言或#34; culture"存储不同版本的模式字符串,您可以根据用户选项轻松生成在您选择的任何语言上语法正确的消息。通过连接方法做同样的事情几乎是不可能的,除了最简单的情况(如果没有别的,因为你不能在运行时改变元素的顺序)。

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