String.Format方法如何处理?

3
如微软网站所述,String.Format可以将一些字符串变量排列成一个字符串,是C#中连接字符串的另一种方式。
string.Format("Name = {0} Surname = {1}",name,surname);

我的问题是这个方法是如何工作的? 这个方法是否是一种特殊的方法?能否创建一个类似于这个方法的方法,只接受每个{n}处的整数参数? 或者这个方法在编译器中被解释成不同的方式,如果是这样,编译器如何访问这个方法。
如果可能的话,我想看看编译器是如何解释这个方法的。
补充说明:当你可以向一个方法发送任意数量的参数时,它是如何工作的?
编辑: 这是否意味着String.Format将第一个参数过滤并使用正则表达式或其他工具(Split等)来获取{Number}的位置,并将第二个参数部分中的字符串令牌放在那里?
6个回答

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关键字的文档。

至于编写自己的方法以接受像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

这是一个普通的函数。

它解析字符串并调用ToString来构造新的字符串(如果需要)。

你的示例中重载的签名是:

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

没有什么能阻止你创建自己的格式化方法(不过我可能会建议你委托给内置的 string.Format 方法)。


是的,但编译器如何将这些字符串放入{0}中,这是一种特殊语法,我从未在其他地方看到过它? - Rosmarine Popcorn
1
@Cody - 编译器并不会这样做。_.Format_ 方法会这样做。它会解析字符串,将其分解为标记,并从标记和传入的参数重建一个新的字符串。这不是编译器的事情。 - Oded

1

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

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

你可以随意传递任意数量的整数,这就是params参数类型 :)

编辑:

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


太好了,我从未发现过也从未听说过params! - Rosmarine Popcorn
1
关于{x}解析,例如在.NET中的ToString重载中,默认方式是可以指定舍入和数字格式选项的数字。 - Davide Piras


1

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

格式类型为(string format, params object[] args),在这个object[]中的索引是有用的。

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


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#参考文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接