Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将结构传递给String.Format作为args_C#_String_Struct - Fatal编程技术网

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-很高兴听到:)这只能在编译时工作。我需要字符串能够在运行时更改。很好,我正试图做到这一点,但在移动设备上使用在线编译器太困难了。)