如何在自己的方法中模仿string.Format()

本文关键字:string Format 自己的 方法 | 更新日期: 2023-09-27 18:08:31

我有一个自定义WriteLine(string)方法的对象。像这样:

public void WriteLine(string text)
{
    this.StringList.Add(text);
}

用这种方法复制string.Format()的功能最简单的方法是什么?例如:我现在经常发现自己在做的是:

myObj.WriteLine(string.Format("Hello, {0}", name));

如果你创建一个新的控制台应用程序,他们的WriteLine()方法版本做的正是我想做的:

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

它们消除了调用string.Format()的需要。让你的方法接受这个是否容易?还是需要创建上千个方法重载?像这样:

public void WriteLine() { ... }
public void WriteLine(string text) { ... }
public void WriteLine(string text, object arg0) { ... }
public void WriteLine(string text, object arg0, object arg1) { ... }
public void WriteLine(string text, object arg0, object arg1, object arg2)
{
    this.StringList.Add(string.Format(text, arg0, arg1, arg2));
}
// etc etc etc

这是唯一合乎逻辑的方法吗?欢迎提出任何建议:)

如何在自己的方法中模仿string.Format()

您需要从string.format复制方法签名。

public void WriteLine(string text,params object[] args) {
  this.StringList.Add(string.Format(text,args));
}

根据ChaosPandion的建议,你也可以通过重载来防止数组的创建

public void WriteLine(string text) {
  this.StringList.Add(text);
}
public void WriteLine(string text,object arg0) {
  this.StringList.Add(string.Format(text, arg0));
}
public void WriteLine(string text,object arg0, object arg1) {
  this.StringList.Add(string.Format(text, arg0, arg1));
}
public void WriteLine(string text,object arg0, object arg1, object arg2) {
  this.StringList.Add(string.Format(text, arg0, arg1, arg2));
}

我不会超过arg2作为字符串。格式没有,所以好处就消失了。

有一种极端情况您可能希望尽量避免。下面的代码将把字符串{0}写入控制台

Console.WriteLine("{0}");

但是,如果您使用了这个答案中其他人建议的WriteLine实现之一,这些实现将抛出异常:

WriteLine("{0}"); //throws exception

最简单的修复方法是重载两次WriteLine,或者稍微修改建议的代码来处理边缘情况:

public void WriteLine(string text,params object[] args) {
  var message=args.Length==0 ? text : string.Format(text, args);
  this.StringList.Add(message);
}

您可以使用params:

 public void WriteLine(string text, params object[] parameters)
 {
     //..
 }