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