C# 将结构传递给String.Format作为args
是否可以使用结构作为C# 将结构传递给String.Format作为args,c#,string,struct,C#,String,Struct,是否可以使用结构作为字符串的参数。格式如下: struct kid { public string name; public int age; }; kid.name = alice; kid.age = 2; Console.WriteLine(String.Format("Her name is {0} and she's {1} years old", kid)); Console.WriteLine($"Her name is {kid.name} and she'
字符串的参数。格式如下:
struct kid
{
public string name;
public int age;
};
kid.name = alice;
kid.age = 2;
Console.WriteLine(String.Format("Her name is {0} and she's {1} years old", kid));
Console.WriteLine($"Her name is {kid.name} and she's {kid.age} years old");
与此相反:
Console.WriteLine(String.Format("Her name is {0} and she's {1} years old", kid.name ,kid.age));
编辑:
字符串将在运行时从配置文件中读取。否。它如何知道将哪个属性放在哪里
您可以使用c#6.0字符串插值来代替以这种方式键入字符串.Format
,并按如下方式编写:
struct kid
{
public string name;
public int age;
};
kid.name = alice;
kid.age = 2;
Console.WriteLine(String.Format("Her name is {0} and she's {1} years old", kid));
Console.WriteLine($"Her name is {kid.name} and she's {kid.age} years old");
并可能重写ToString()
以返回它:
struct kid
{
public override string ToString()
{
return $"Her name is {name} and she's {age} years old";
}
}
然后调用Console.WriteLine(kid.ToString())代码>可以将结构作为数组进行访问,以便:
如果kid是一个结构kidStr,那么kid[0]和kid[1]可以定义为name和age.ToString(),并用作WriteLine中的两个参数。。。这对你有意义吗
public string this[int i] {
get { return i == 0 ? name : age. ToString(); }
}
或者更简单地说
public string[] ToArray() {
return new string[2]{ name, age.ToString()};
}
在结构kidStr中有上述索引器和一个实例kid
Console.WriteLine("name is {0}, age is {1}", kid[0], kid[1]); // or kid.ToArray()
由于.Format
的签名为String.Format(String-Format,params-object[]args)
您可以将结构转换为对象数组
struct Kid
{
public string name;
public int age;
public object[] ToObjectArray()
{
return new object[] {
name, age };
}
public static implicit operator object[](Kid kid)
{
return kid.ToObjectArray();
}
};
class Program
{
static void Main(string[] args)
{
Kid kid=new Kid() { name="alice", age=2 };
Console.WriteLine("Her name is {0} and she's {1} years old", kid);
// Same as
// Console.WriteLine(string.Format("Her name is {0} and she's {1} years old", kid));
}
}
您还可以利用协方差,将字符串[]
隐式转换为对象[]
public string[] ToStringArray()
{
return new string[] {
name, age.ToString() };
}
public static implicit operator object[](Kid kid)
{
return kid.ToStringArray();
}
您可以通过您的结构实现IFormattable
接口,并通过格式字符串提供对不同属性的访问,而不是ToObjectArray()
struct kid : IFormattable {
public string name;
public int age;
public override string ToString() => ToString(null, null);
public string ToString(string format, IFormatProvider provider) {
switch(format) {
case null:
case "":
return string.Format(provider, "({0:name}, {0:age})", this);
case "name":
return name.ToString(provider);
case "age":
return age.ToString(provider);
default:
throw new ArgumentOutOfRangeException(nameof(format));
}
}
}
然后您可以按如下方式编写:
Console.WriteLine("Her name is {0:name} and she's {0:age} years old", kid);
不。{0}和{1}是两个不同的属性,您无法从一个对象“kid”获得。作为补充说明,对于Console.WriteLine,您不需要使用string.Format,因为WriteLine方法执行相同的操作并以相同的方式接受参数。理论上,可以在结构和类中创建索引器(如果我没记错的话)然后也许它应该相当于一个字符串数组…现在我没有一个编译器来验证这个答案你能在结构中重写ToString()
?嘿,去回答Linq问题。把字符串插值留给我:)@uteist-hahah:)好吧。。他正在洗碗,突然发现了那个问题。无法抗拒的代码清晰的事情,我会去这个想法thanks@ArnonHadas-很高兴听到:)这只能在编译时工作。我需要字符串能够在运行时更改。很好,我正试图做到这一点,但在移动设备上使用在线编译器太困难了。)