C#格式化字符串中的静态和非静态字符串变量作为参数

C#格式化字符串中的静态和非静态字符串变量作为参数,c#,string,static,parameter-passing,formatted,C#,String,Static,Parameter Passing,Formatted,作为一名C#的新手,我正在试图弄明白为什么我必须将cardname设置为静态,以适应格式化字符串 如果我没有添加静态字符串cardname,而是使用字符串cardname,代码将报告错误,最后一个卡号带下划线。错误是:字段初始值设定项无法引用非静态字段、方法或属性“WriteXML.CardNumber” 我知道有很多静态和非静态的评论和问题。它们似乎都没有直接解释“如果在格式化字符串中使用非静态,那么将发生,或者没有任何意义”。如果重复,请至少指出资源。我真的很感激 class WriteXM

作为一名C#的新手,我正在试图弄明白为什么我必须将
cardname
设置为静态,以适应格式化字符串

如果我没有添加
静态字符串cardname
,而是使用
字符串cardname,代码将报告错误,最后一个
卡号带下划线。错误是:字段初始值设定项无法引用非静态字段、方法或属性“WriteXML.CardNumber”

我知道有很多静态和非静态的评论和问题。它们似乎都没有直接解释“如果在格式化字符串中使用非静态,那么将发生,或者没有任何意义”。如果重复,请至少指出资源。我真的很感激

class WriteXML
{
    static string CardNumber;
    static string ExpMo;
    static string ExpYr;
    static string FirstName;
    static string LastName;
    string xmlContent =
        string.Format("<CardNumber>{0}</CardNumber>" +
        "<ExpMo>{1}</ExpMo>" +
        "<ExpYr>{2}</ExpYr>" +
        "<FirstName>{3}</FirstName>" +
        "<LastName>{4}</LastName>", 
            CardNumber, ExpMo, ExpYr, FirstName, LastName);
}
类WriteXML
{
静态字符串卡号;
静态字符串ExpMo;
静态字符串表达式;
静态字符串FirstName;
静态字符串LastName;
字符串xmlContent=
string.Format(“{0}”+
"{1}" +
"{2}" +
"{3}" +
"{4}", 
卡号、ExpMo、ExpYr、名字、姓氏);
}

字段初始值设定项在对象完全构造之前运行,因此它们无法访问同一对象中的其他字段,因为这些字段可能尚未初始化。不能保证字段初始值设定项的运行顺序

例如,如果您有以下情况:

public class Foo
{
    string someField = "foo";
    string someOtherField = someField + "bar";
}
然后,在初始化
someField
之前,无法初始化
someOtherField

因此,一旦构建了对象并运行了所有字段初始值设定项,就必须在其他地方初始化
someOtherField
。一个地方是建造商:

public class Foo
{
    string someField = "foo";
    string someOtherField;   // can't initialize yet

    public Foo()
    {
        someOtherField = someField + "bar";
    }
}
另一种选择是使用属性,特别是当
someOtherField
不应该是可写的时:

public class Foo
{
    string someField = "foo";
    )string SomeProperty
    {
        get { return someField + "bar"; }
    }
}
这将推迟确定
SomeProperty
是什么,直到您实际尝试并访问它为止。另外,如果
someField
在构造后发生更改,则
SomeProperty
将自动同步到新值

例如:

var f = new Foo();
Console.WriteLine(f.SomeProperty);   // displays "foobar"
                                     // assuming we'd marked it public
f.someField = "la";                  // assuming we'd made that public  too!
Console.WriteLine(f.SomeProperty);   // displays "labar"

我不确定你想要实现什么,但也许这段代码会帮助你

public class Foo
{
    string CardNumber { get; set;}
    string ExpMo { get; set; }
    string ExpYr { get; set; }
    string FirstName { get; set; }
    string LastName { get; set; }

    public String WriteXml()
    {
        string xmlContent =
        string.Format("<CardNumber>{0}</CardNumber>" +
        "<ExpMo>{1}</ExpMo>" +
        "<ExpYr>{2}</ExpYr>" +
        "<FirstName>{3}</FirstName>" +
        "<LastName>{4}</LastName>",
        CardNumber, ExpMo, ExpYr, FirstName, LastName);

        return xmlContent;
    }
}
公共类Foo
{
字符串卡号{get;set;}
字符串ExpMo{get;set;}
字符串ExpYr{get;set;}
字符串名{get;set;}
字符串LastName{get;set;}
公共字符串WriteXml()
{
字符串xmlContent=
string.Format(“{0}”+
"{1}" +
"{2}" +
"{3}" +
"{4}",
卡号、ExpMo、ExpYr、名字、姓氏);
返回XML内容;
}
}

我将尝试引用并完成您想要的解释语句:


如果在格式化字符串中使用非静态引用(更一般地说,在另一个非静态字段中),则该字符串/字段将无法访问它,因为它在第一个位置需要对初始化对象的引用(非静态意味着它可以根据字段所在的不同对象具有不同的值)。使用静态字段,它可以随时访问,而不需要初始化对象

这个问题的答案可以在C语言规范中找到:

实例字段的变量初始值设定项不能引用 正在创建的实例。因此,引用是编译时错误 这是变量初始值设定项中的错误,因为它是 变量初始值设定项,通过 简单的名字

在下面的代码中,xmlContent是一个实例字段,它的变量初始值设定项不引用实例成员CardNumber、ExpMo、ExpYr、FirstName和LastName。省略“静态字段”修改器时,它们是实例成员。因此它不符合规范,因此存在编译时错误

string xmlContent =
        string.Format("<CardNumber>{0}</CardNumber>" +
        "<ExpMo>{1}</ExpMo>" +
        "<ExpYr>{2}</ExpYr>" +
        "<FirstName>{3}</FirstName>" +
        "<LastName>{4}</LastName>", 
            CardNumber, ExpMo, ExpYr, FirstName, LastName);
字符串xmlContent=
string.Format(“{0}”+
"{1}" +
"{2}" +
"{3}" +
"{4}", 
卡号、ExpMo、ExpYr、名字、姓氏);

请参阅@Matt Burland关于如何解决此问题的回答。

为什么要从静态类生成xml?