我在C#代码中使用String.Format可能比if
语句更重要。
string ask = String.Format("Continue using [{0}]?", value);
我只想到我经常使用它。
接下来,我开始考虑为它创建Extension Method会有多棒。
ask.Format("Continue using [{0}]?", value);
所以,我要看String.Format,它有很多重载,因为有很多方法可以调用它。
System.String
命名空间中已存在的重载上?以下是我希望看到的内容:
public static class Extensions
{
public static String Format(this String str, String formatText, /* What goes here? */)
{
return str.Format(formatText, /* Magic */);
}
}
我想我可以写一个重载来匹配每个String.Format重载,但这可能没有必要。
答案 0 :(得分:16)
ask.Format("Continue using [{0}]?", value);
不是我会如何使用它。这就是我要做的事情:
var ask = "Continue using [{0}]?".FormatWith(value);
这是我的扩展方法:
public static string FormatWith(this string value, params object[] args)
{
return String.Format(value, args);
}
答案 1 :(得分:2)
你很接近,只缺少params object[] args
参数:
public static class Extensions
{
public static String Format(this String str,
String formatText,
params object[] args)
{
return str.Format(formatText, args);
}
}
答案 2 :(得分:2)
您想要修改调用字符串。你不能这样做。 .Net中的字符串不会更改(它们是不可变的),因此您仍然必须返回一个新字符串。你可以从C#得到的最接近的代码如下:
string ask = ask.Format("Continue using [{0}]?", value);
如果可以通过引用传递扩展对象,则可以修改原始字符串。不幸的是,C#不支持这一点。
有趣的是IL 支持它,你可以使用VB.Net编写你想要的方法:
<Extension()> _
Public Shared Sub Format(ByRef str As String, ByVal formatText As String, ByVal ParamArray args As Object())
str = String.Format(formatText, args);
End Sub
不幸的是,即使你在VB.Net类库项目中填充它,你也无法从C#中调用它,因为C#要求你在调用时在调用站点使用ref
关键字通过引用使用参数的函数,并且没有使用扩展方法的语法。
对于与你想要的语法不完全匹配的解决方法,但仍会给你一些相当不错的东西,请参阅Mike Cole's answer。
答案 3 :(得分:1)
使用字符串插值(在C#6.0和VS 2015+中)。你的代码看起来像这样:
var ask = $"Continue using [{value}]?";
我一直在使用String.Format或字符串连接,直到我发现字符串插值,现在我已经迷上了。
这样做的一个潜在缺点是,您无法将格式字符串分解为常量或资源。在这里查看更多详细信息:
https://msdn.microsoft.com/en-us/library/dn961160.aspx
本文详细介绍了其他一些不错的宝石。 Definitley值得一读: