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

时间:2015-07-30 17:45:37

标签: c# string static parameter-passing formatted

作为C#的新手,我试图找出为什么我必须将CardNumber放在静态以便适合格式化的字符串....

如果我没有添加static string CardNumber但是使用string CardNumber;,则代码会报告上一个CardNumber带下划线的错误。错误如下:字段初始值设定项无法引用非静态字段,方法或属性' 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);
}

4 个答案:

答案 0 :(得分:7)

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

例如,如果您有类似的内容:

public class Foo
{
    string someField = "foo";
    string someOtherField = someField + "bar";
}

然后someOtherField的初始化不会发生,直到someField被初始化。

因此,一旦构造了对象并且所有字段初始化程序都已运行,您必须在其他位置初始化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的内容,直到您真正尝试访问它为止,如果{<1}}在构建后更改,那么{{1} }将自动同步到新值。

例如:

someField

答案 1 :(得分:3)

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

  

实例字段的变量初始值设定项无法引用   正在创建的实例。因此,引用它是编译时错误   在变量初始值设定项中,因为它是a的编译时错误   变量初始值设定项通过a引用任何实例成员   简单名称

在下面的代码中, xmlContent 是一个实例字段,它具有一个变量初始值设定项,而不是引用实例成员 CardNumber,ExpMo,ExpYr,FirstName,LastName 。省略 static 字段修饰符时,它们是实例成员。所以它不符合规范,因而也不符合编译时错误。

l = ['a', '2', 'b', '1', 'c', '4']
d = {k:int(v) for k,v in zip(l[::2], l[1::2])}

请参阅@Matt Burland的答案,如何解决这个问题。

答案 2 :(得分:1)

我不确定你想要实现的目标,但也许这段代码可以帮助你。

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;
    }
}

答案 3 :(得分:1)

我会尝试引用并填写您想要的解释句子:

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