我有以下课程:
class Foo
{
public Foo()
{
Console.WriteLine("Foo");
}
public string A { get; set; } = GetStr("A");
public string B { get; set; } = GetStr("B");
public static string GetStr(string str)
{
Console.WriteLine(str);
return str;
}
}
当我从中创建实例时,输出为:
A
B
富
如果我将我的属性更改为:
public string B { get; set; } = GetStr("B");
public string A { get; set; } = GetStr("A");
输出是:
B
A
富
我的问题是:
班级中的属性顺序是否重要且可能影响我的程序?
注意:我使用C#6.0新功能:属性初始值设定项More
答案 0 :(得分:6)
字段(和属性,因为C#6)初始化器首先按照它们的声明顺序运行,然后执行构造函数。
是的,属性的顺序会影响它们的初始化顺序;但构造函数总是最后执行。
答案 1 :(得分:2)
根据我的经验(在C#中),当使用反射时,字段的顺序将在类中列出时返回(因此可能很重要)。
例如:
public class TestClass
{
// purposely not in alphabetical order and of different types.
public string C { get; set; }
public int A { get; set; }
public string B { get; set; }
}
然后创建一个实例并分配值:
TestClass testObject = new TestClass();
// purposely not in same order as in class
testObject.B = "1";
testObject.C = "2";
testObject.A = 3;
最后遍历属性:
foreach (PropertyInfo prop in typeof(TestClass).GetProperties())
{
Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(testObject, null));
}
打印出以下内容:
C = 2
A = 3
B = 1
结果与类定义中的顺序相同。
答案 2 :(得分:0)
属性顺序无关紧要。构造函数调用GetStr
方法,该方法在控制台中写入字符串。因为这种属性的顺序似乎有所改变。