如Microsoft Site所述,String.Format将一些字符串变量排列成单个字符串,这是另一种如何在c#中连接字符串的方法。
string.Format("Name = {0} Surname = {1}",name,surname);
我的问题是这是如何工作的? 这个方法是一个特殊的方法,我可以创建一个类似于这个方法的方法,它在每个{n}只接受一个整数。 或者这个方法是否由编译器以不同的方式解释,如果是,则编译器如何访问此方法。
如果有可能我想看看,编译器如何解释这个方法。
PS:当你可以向方法发送尽可能多的参数时,它是如何工作的?
[编辑] 这是否意味着,String.Format将第一个参数和过滤器带入Regex或Whatever工具(Split等)以获取{Number}所在的位置并从第二个params部分放置一个String标记?
答案 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;
});
}
答案 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。