Имеет ли значение порядок полей в C #? - PullRequest
4 голосов
/ 10 января 2009

Этот вопрос вдохновлен ответом Джона Скита: Существует ли c # эквивалент областей модификатора доступа c ++

Он комментирует, что порядок полей в файле может иметь значение. Я предполагаю, что это связано с порядком инициализации полей, но я думаю, что это достаточно опасная вещь, чтобы кодировать, основываясь на этом побочном эффекте, что это требует своего собственного вопроса и обсуждения.

Есть ли другие мысли о том, как можно управлять порядком полей в вашем файле кода и какое влияние это может оказать?

Ответы [ 6 ]

23 голосов
/ 10 января 2009

Вот классический пример из спецификации языка 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). Однако, если вы поменяете местами порядок полей, они также поменяют значения.

3 голосов
/ 10 января 2009

Да, это важно при взаимодействии с неуправляемым кодом.

2 голосов
/ 10 января 2009

Я прежде всего думал о порядке инициализации, да - особенно для статических полей. Например (с открытыми полями только для простоты демонстрации):

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);
    }
}

Порядок инициализации определен в спецификации как текстовый порядок, в котором объявлены переменные, но он становится неопределенным, когда две переменные находятся в разных файлах, вносящих вклад в частичный класс.

Ответ Мехрдада - еще один хороший ответ: порядок декларирования может повлиять на все, что важно для физического расположения.

1 голос
/ 10 января 2009

Если поля инициализируются как часть объявления, они добавляются в конструктор (экземпляр или статический) в порядке их появления в файле.

0 голосов
/ 10 января 2009

Я считаю, что XmlSerializer сериализует элементы в порядке их появления в исходном файле.

0 голосов
/ 10 января 2009

Вы можете использовать (злоупотреблять?) Порядок полей как метаданные вашего класса, которые вы можете прочитать с помощью отражения.

например, если у вас есть класс, представляющий сетевой протокол с полями ID, PORT и XOR, в таком порядке вы можете определить его как:

class MyProtocol {
    int ID;
    int PORT;
    int XOR;
}

Теперь предположим, что вы используете отражение для итерации полей протокола, для отправки по проводам. Порядок, возвращаемый GetProperties, будет таким, как вы определили, и вам не нужно было явно писать дополнительные метаданные.

Не уверен, если это хорошая идея, хотя зависеть от этого.

...