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}",而无需更改任何其他代码.通过连接,您需要编辑代码或可能复制代码以处理这两种情况.
这在本地化/国际化中很有用.
这个问题没有一个单一的正确答案.您想要解决几个问题:
性能
您的示例(以及实际应用程序)中的性能差异很小.如果您开始编写多个连接,您将逐渐看到使用格式化字符串的更好的内存性能.请参阅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)
结论
我会在大多数时候选择格式化的字符串......但是当它更容易时我会毫不犹豫地使用连接.
我认为这里最主要的是可读性。所以我总是选择适合每种情况的最佳可读性。
使用C# 6的字符串插值,您的代码可以简化为:
Console.WriteLine($"Hello {name}!");
Run Code Online (Sandbox Code Playgroud)
我认为这比你建议的两个选择更好。