2

除了语句之外,我在 C# 代码中使用String.Format可能比其他任何东西都多。if

string ask = String.Format("Continue using [{0}]?", value);

我刚开始考虑我使用它的频率。

接下来,我开始思考为它创建一个扩展方法会有多棒。

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重载,但这可能不是必需的。

4

4 回答 4

20
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);
}
于 2013-05-17T15:05:32.603 回答
2

您想修改调用字符串。你不能那样做。.Net 中的字符串不会改变(它们是不可变的),因此您仍然必须返回一个新字符串。您可以从 C# 获得的最接近的代码是这样的:

string ask = $"Continue using [{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 的回答

于 2013-05-17T14:58:58.067 回答
1

你很接近,只缺少params object[] args参数:

public static class Extensions
{
  public static String Format(this String str, 
                              String formatText, 
                              params object[] args)
  {
    return str.Format(formatText, args);
  }
}
于 2013-05-17T14:56:31.000 回答
1

使用字符串插值(在 C# 6.0 和 VS 2015+ 中)。您的代码如下所示:

var ask = $"Continue using [{value}]?";

在我发现字符串插值之前,我一直在使用 String.Format 或字符串连接,现在我被迷住了。

这样做的一个潜在缺点是您无法将格式字符串分解为常量或资源。在这里查看更多详细信息:

https://msdn.microsoft.com/en-us/library/dn961160.aspx

本文介绍了更多细节,并包含了其他一些不错的宝石。Definitley 值得一读:

https://msdn.microsoft.com/en-us/magazine/dn879355.aspx

于 2017-04-26T00:50:27.760 回答