这个问题的灵感来自Jon Skeet的回答: Is there a c# equivalent to c++'s access-modifier regions
他发表评论说文件中字段的顺序可能很重要。我猜这与字段初始化的顺序有关,但我认为基于这种副作用进行编码是一件危险的事情,它保证了自己的问题和讨论。
是否有其他想法可以处理代码文件中的字段顺序以及可能产生的影响?
答案 0 :(得分:22)
以下是C#语言规范(第10.5.5节)
中的典型示例class Test
{
static int a = b + 1;
static int b = a + 1;
static void Main() {
Console.WriteLine("a = {0}, b = {1}", a, b);
}
}
这是一个完全有效的程序并且是书面的(a = 1,b = 2)。但是,如果您交换字段的顺序,它们也会交换值。
答案 1 :(得分:3)
是的,在与非托管代码连接时确实很重要。
答案 2 :(得分:2)
我主要是考虑初始化的顺序,是的 - 特别是对于静态字段。例如(公共字段只是为了简化演示):
using System;
class First
{
static int a = 10;
public static int b = CalculateB();
static int c = 5;
static int CalculateB()
{
return a*c;
}
}
class Second
{
static int a = 10;
static int c = 5;
public static int b = CalculateB();
static int CalculateB()
{
return a*c;
}
}
class Test
{
static void Main()
{
Console.WriteLine("First.b: {0}, Second.b: {1}",
First.b, Second.b);
}
}
初始化的顺序在规范中定义为声明变量的文本顺序 - 但是当两个变量位于不同的文件中时,它会变成未定义的。
Mehrdad's answer是另一个好的:物理布局很重要的任何事情很可能会受到声明顺序的影响。
答案 3 :(得分:1)
如果字段作为声明的一部分进行初始化,则它们将按照它们在文件中出现的顺序添加到构造函数(实例或静态)中。
答案 4 :(得分:0)
你可以使用(滥用?)字段的顺序作为你的课程的元数据,你可以通过反思阅读。
例如,如果您有一个表示具有字段ID,PORT和XOR的网络协议的类,则可以按以下顺序将其定义为:
class MyProtocol {
int ID;
int PORT;
int XOR;
}
现在假设你使用反射来迭代协议的字段,通过网络发送。 GetProperties返回的顺序将按照您的定义,并且您不必显式编写任何额外的元数据。
不确定是否依赖于此是一个好主意。
答案 5 :(得分:0)
我相信XmlSerializer按照它们在源文件中出现的顺序序列化成员。