【问题标题】:How to imitate string.Format() in my own method?如何在我自己的方法中模仿 string.Format()?
【发布时间】:2011-11-17 08:06:19
【问题描述】:

我有一个带有自定义 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?你真的要写分词器吗?
  • C#有一个你不知道的特性,你需要知道。 msdn.microsoft.com/en-us/library/w5zay9db(v=VS.100).aspx
  • @Oded 这是我的问题...我不知道params 关键字,也不知道我什至可以委派给@ 987654332@.
  • 很公平,亚历克斯 - 我没有意识到这是问题所在 :)
  • 注意参数;如果“params”方法适用于其普通形式,则不会以其扩展形式调用。例如,"WriteLine("", null)" 使用空数组调用 WriteLine。 "WriteLine("", (object)null)" 使用包含单个 null 的数组调用 WriteLine。

标签: c# .net asp.net string methods


【解决方案1】:

您需要从 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,因为 string.format 不会,所以好处就消失了。

【讨论】:

  • 完美!当我在浪费时间做一些乏味的事情之前花时间发布一个适当的问题时,我总是很高兴。几乎总是有更好的方法。谢谢!
  • 我会添加重载以避免在简单情况下创建数组。最多可能有 4 个参数。
  • @ChaosPandion 好建议。我接受了你的建议。
  • 为什么要使用StringList?为什么不直接写入字符串呢?
【解决方案2】:

您可能需要努力避免一种极端情况。以下代码会将字符串 {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);
}

【讨论】:

  • 我已经为字符串过载了,所以这对我来说不是问题。感谢您对此的关注:)
【解决方案3】:

你可以使用params:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多