作为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);
}
答案 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(非静态意味着它可以根据字段所在的不同对象具有不同的值)。使用静态字段,它可以随时访问而无需初始化对象。