String.Format方法如何处理?

时间:2011-09-09 10:57:14

标签: c# syntax string-formatting

如Microsoft Site所述,String.Format将一些字符串变量排列成单个字符串,这是另一种如何在c#中连接字符串的方法。

string.Format("Name = {0} Surname = {1}",name,surname);

我的问题是这是如何工作的? 这个方法是一个特殊的方法,我可以创建一个类似于这个方法的方法,它在每个{n}只接受一个整数。 或者这个方法是否由编译器以不同的方式解释,如果是,则编译器如何访问此方法。

如果有可能我想看看,编译器如何解释这个方法。

PS:当你可以向方法发送尽可能多的参数时,它是如何工作的?

[编辑] 这是否意味着,String.Format将第一个参数和过滤器带入Regex或Whatever工具(Split等)以获取{Number}所在的位置并从第二个params部分放置一个String标记?

6 个答案:

答案 0 :(得分:4)

向方法发送可变数量的参数,如下所示:

public static string MyStringFormat(string formatString, params object [] args)
{

}

您现在可以根据需要传递任意数量的参数:

MyStringFormat("{0}{1}",42,"Hello World")
MyStringFormat("{0}{1}{2}",42,"Hello World",999.9)

在方法中,这些参数只是一个数组(本例中为object)。 params关键字上的here are the docs

至于编写自己的方法来接受像Format这样的数字输入,这将是一种方式(使用正则表达式):

 public static string MyStringFormat(string formatString, params object[] args)
    {
        var regex = new Regex("{([0-9]*)}");
        return regex.Replace(formatString,m =>
                           {
                               int index = int.Parse(m.Groups[1].Value);
                               if(index<args.Length)
                                  return args[index].ToString();
                               return String.Empty;
                           });
    }

实例:http://rextester.com/rundotnet?code=OMZC13551

答案 1 :(得分:1)

这是正常的功能。

它解析字符串并在传入参数上调用ToString(如果需要)以构造新字符串。

您示例中的重载签名是:

public static string Format(
    string format,
    params Object[] args
)

没有什么可以阻止你创建自己的(虽然我可能只会委托内置的string.Format)。

答案 2 :(得分:1)

答案 3 :(得分:1)

Cody没有魔法,看看这个方法:

public static void UseParams(params int[] list) 
    {
        for (int i = 0 ; i < list.Length; i++)
        {
            Console.WriteLine(list[i]);
        }
        Console.WriteLine();
    }

你可以调用它传递尽可能多的int,它是params参数类型:)

修改

params是非常有用的它允许我们,例如,以动态方式将所有方法的参数值传递给我们的日志包装器,而不知道每个方法有多少个,然后记录器将转储所有这些值一个接一个地使用Reflection来查找参数名称。

答案 4 :(得分:1)

字符串中的大括号是占位符,其中的数字表示要替换的参数的索引。

格式属于(string format, params object[] args)类型,它是此object[]中的索引,非常有用。

(我认为它在内部使用StringBuilder.AppendFormat)替换这些值)

答案 5 :(得分:0)

String.Format的签名如下所示:

public static string Format (string format, params Object[] args)

请注意第二个参数,标有params关键字。那个提供了在调用函数时添加多个参数的功能。在函数内部,您可以通过索引访问参数或迭代args数组:

public static string Format (string format, params Object[] args)
{
    foreach (Object o in args)
        Console.WriteLine(o);
}

查看C# Reference