Cur*_*rly 2 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);
}
Run Code Online (Sandbox Code Playgroud)
字段初始值设定项在对象完全构造之前运行,因此它们无法访问同一对象中的其他字段,因为这些字段可能尚未初始化.无法保证字段初始值设定项的运行顺序.
例如,如果你有类似的东西:
public class Foo
{
string someField = "foo";
string someOtherField = someField + "bar";
}
Run Code Online (Sandbox Code Playgroud)
然后在初始化someOtherField之前someField初始化不会发生.
因此someOtherField,一旦构造了对象并且所有字段初始化程序都已运行,您必须在其他地方初始化.一个地方是构造函数:
public class Foo
{
string someField = "foo";
string someOtherField; // can't initialize yet
public Foo()
{
someOtherField = someField + "bar";
}
}
Run Code Online (Sandbox Code Playgroud)
另一个替代方案,特别是如果someOtherField不应该是可写的,将使用属性:
public class Foo
{
string someField = "foo";
)string SomeProperty
{
get { return someField + "bar"; }
}
}
Run Code Online (Sandbox Code Playgroud)
这将延迟确定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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1181 次 |
| 最近记录: |