班级中的属性顺序是否重要?

时间:2015-01-12 12:41:22

标签: c# properties property-initializer

我有以下课程:

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

3 个答案:

答案 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方法,该方法在控制台中写入字符串。因为这种属性的顺序似乎有所改变。