c#字符串格式

Dar*_*der 22 c# string formatting

我很好奇为什么我会使用字符串格式,而我可以使用连接,如

Console.WriteLine("Hello {0} !", name);

Console.WriteLine("Hello "+ name + " !");
Run Code Online (Sandbox Code Playgroud)

为什么选择第一个超过第二个?

Mar*_*off 61

你选的太简单了.

字符串格式:

  • 允许您多次使用同一个变量: ("{0} + {0} = {1}", x, 2*x)
  • 自动调用ToString其参数:("{0}: {1}", someKeyObj, someValueObj)
  • 允许您指定格式: ("The value will be {0:3N} (or {1:P}) on {2:MMMM yyyy gg}", x, y, theDate)
  • 允许您轻松设置填充: (">{0,3}<", "hi"); // ">hi <"


str*_*ger 12

您可以稍后将字符串换成动态字符串.

例如:

// In a land far, far away
string nameFormat = "{0} {1}";

// In our function
string firstName = "John";
string lastName = "Doe";

Console.WriteLine(nameFormat, firstName, lastName);
Run Code Online (Sandbox Code Playgroud)

在这里,您可以更改nameFormat为eg "{1}, {0}",而无需更改任何其他代码.通过连接,您需要编辑代码或可能复制代码以处理这两种情况.

这在本地化/国际化中很有用.


Jef*_*ang 6

这个问题没有一个单一的正确答案.您想要解决几个问题:

性能

您的示例(以及实际应用程序)中的性能差异很小.如果您开始编写多个连接,您将逐渐看到使用格式化字符串的更好的内存性能.请参阅Ben的回答

可读性

在进行格式化时,使用格式化字符串会更好,或者使用许多不同的变量进行字符串化:

string formatString = "Hello {0}, today is {1:yyyy-MM-dd}";
Console.WriteLine(formatString, userName, Date.Today);
Run Code Online (Sandbox Code Playgroud)

可扩展性

你的情况将决定什么是最好的.您告诉我,当您需要在日志中的用户名时间之间添加项目时哪个更好:

Console.WriteLine(
   @"Error! 
    Username: " + userName + "
    Time: " + time.ToString("HH:mm:ss") + "
    Function: " + functionName + "
    Action: " + actionName + "
    status: " + status + "
   ---");
Run Code Online (Sandbox Code Playgroud)

要么

Console.WriteLine(@"Error! 
    Username: {0}
    Time: {1}
    Function: {2}
    Action: {3}
    status: {4}
   ---",
    username, time.ToString("HH:mm:ss"), functionName, actionName, status);
Run Code Online (Sandbox Code Playgroud)

结论

我会在大多数时候选择格式化的字符串......但是当它更容易时我会毫不犹豫地使用连接.


fab*_*tto 6

我认为这里最主要的是可读性。所以我总是选择适合每种情况的最佳可读性。

笔记:

使用C# 6的字符串插值,您的代码可以简化为:

Console.WriteLine($"Hello {name}!");
Run Code Online (Sandbox Code Playgroud)

我认为这比你建议的两个选择更好。