Console.WriteLine不同的写法

6

在一个非常基本的问题中存在混淆: 我看过很多书,它们使用Console.WriteLine的方式为:

int i = 12;
Console.WriteLine("MyVariable value is {0}", i);

取代

int i = 12;
Console.WriteLine("MyVariable value is" + i);

它们之间有什么区别吗?

你可能想要研究不同的字符串格式化方式。对于你的问题,两者之间没有区别,只是其中一个更加简洁,更易于阅读。 - Security Hound
1
可能是C#字符串输出:格式化还是连接?的重复问题。 - BrokenGlass
5个回答

8
在您的例子中,实际上并没有。但是,第一个情况可以很容易地扩展以执行。
Console.WriteLine("MyVariable value is {0} and myothervar is {1}", i, j);

第二种方法可能会有点繁琐。

但总的来说,它们在速度和性能方面是相同的,对吧? - Sandy
@rapsalands - 你不必担心String的性能问题。即使你能指责String,也无法解决任何性能损失问题。除非你确实遇到了性能问题,否则不要担心使用会带来0.0001%更好性能的东西。 - Security Hound
3
这样想:你正在向控制台写入内容,用户会阅读控制台。屏幕更新速度最快也只能达到每10毫秒一次,而用户的反应时间远比这慢。你觉得对于用户来说,把字符串渲染出来需要0.0001毫秒还是0.0002毫秒真的很重要吗?花点宝贵的时间优化用户可能会注意到的东西。 - Eric Lippert
@Eric:我们也在向控制台(和文件)写入内容。每秒钟输出许多行调试信息,这会对性能造成影响,但在开发过程中我们愿意承受这种影响。但当产品部署到生产环境并关闭调试日志记录时,我们不愿意再承受这种影响。不幸的是,即使我们没有将调试日志条目打印到控制台/文件中,我们仍然在使用string.Format格式化调试日志条目,这导致了巨大的性能损失。幸运的是,在QA负载测试期间发现了这个问题。我认为牢记字符串操作确实会有代价是很重要的。 - Allon Guralnek
1
@AllonGuralnek:很好的观点!这也说明了在发布之前进行性能测试以及使用工具发现真正影响性能的代码的重要性。 - Eric Lippert

3

请查看这个线程的答案。在简单情况下并不重要,但如果你在大循环或其他场景中使用它,就需要考虑性能问题。


3

也许这对未来的某个人有所帮助。现在有第三种方法(插值法),它是最干净的!它们都只是写同一件事的不同方式。

int i = 12;

// Interpolation Method- Req. C# 6 or later [Cleanest]
Console.WriteLine($"MyVariable value is {i}");

// Concatenation Method (from VB days)
Console.WriteLine("MyVariable value is " + i); 

// Format Method (from C days)
Console.WriteLine("MyVariable value is {0}", i);

1

我相信你在初学者的书籍中看到了字符串拼接,因为它很简单。在这样的简单示例中使用字符串格式化需要进行解释。字符串拼接要简单得多,可能已经在书中的某个时候被教授过(即使没有,通过示例学习也足够简单)。

我可以理解C程序员第一次遇到格式语法时可能会感到困惑。当尝试将其扩展到两个变量时,他们可能认为需要编写如下代码:

int numA = 3;
int numB = 5;
Console.WriteLine("numA is {0} and numB is {0}", numA, numB);

我以为它会类似于C语言的printf函数,其中{0}相当于%d

printf("numA is %d and numB is %d", numA, numB);

他们当然会感到惊讶,如果varA被打印两次。或者他们可能会因为不知道在尝试 Console.WriteLine 一个字符串时,%s 的等效物而感到沮丧。另一方面,字符串连接少有陷阱,并且初学者可以更容易地扩展它。当然,它更加混乱,但也更加强大,这种力量可能会在一本介绍C#的书籍中令人困惑,因为字符串格式语法可能变得相当复杂:

Console.WriteLine("numA is {0,17:$00.00####}", numA);

以上示例还说明了连接和字符串格式化之间的区别。它们是不同的,但对于像您所做的这样简单的用法,它们的差异很小。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接