Имеет ли значение порядок полей в C #?
-
08-07-2019 - |
Решение
Вот классический пример из спецификации языка 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). Однако, если вы поменяете местами порядок полей, они также поменяют значения.
Другие советы
Да, это важно при взаимодействии с неуправляемым кодом.
Я прежде всего думал о порядке инициализации, да - особенно для статических полей. Например (с открытыми полями только для простоты демонстрации):
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);
}
}
Порядок инициализации определен в спецификации как текстовый порядок, в котором объявлены переменные, но он становится неопределенным, когда две переменные находятся в разных файлах, внося вклад в частичный класс.
ответ Мехрдада - еще один хороший ответ: все, где важна физическая схема, вполне может зависеть от порядка объявления.
Если поля инициализируются как часть объявления, они добавляются в конструктор (экземпляр или статический) в порядке их появления в файле. Р>
Вы можете использовать (злоупотреблять?) порядок полей в качестве метаданных вашего класса, которые вы можете прочитать с помощью отражения.
например, если у вас есть класс, представляющий сетевой протокол с полями ID, PORT и XOR, в таком порядке, вы можете определить его как:
class MyProtocol {
int ID;
int PORT;
int XOR;
}
Теперь предположим, что вы используете отражение для итерации полей протокола, для отправки по проводам. Порядок, возвращаемый GetProperties, будет таким, как вы определили, и вам не нужно было явно писать дополнительные метаданные. Р>
Не уверен, если это хорошая идея, хотя зависеть от этого.
Я полагаю, что XmlSerializer сериализует элементы в порядке их появления в исходном файле.