Pergunta

Esta questão é inspirado pela resposta de Jon Skeet: Existe ac # equivalente a c ++ 's regiões de acesso modificador

Ele faz um comentário que é possível para a ordem dos campos em um arquivo para a matéria. Eu estou supondo que isso tem a ver com a ordem em que os campos são inicializados, mas eu acho que é uma coisa bastante perigosa para código baseado neste efeito colateral que motivou a sua própria pergunta e discussão.

Existem outros pensamentos em torno de como a ordem dos campos dentro do seu arquivo de código poderia ser manipulados e qual o impacto que pode ter?

Foi útil?

Solução

Aqui está um exemplo clássico da especificação da linguagem C # (Seção 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);
    }
}

Este é um programa completamente válido e como está escrito (a = 1, b = 2). No entanto, se você trocar a ordem dos campos eles vão também valores de swap.

Outras dicas

Sim, não importa quando a interface com código não gerenciado.

Eu estava pensando principalmente sobre a ordem de inicialização, sim - especialmente para campos estáticos. Por exemplo (com campos públicos apenas para simplicidade de demonstração):

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

A ordem de inicialização é definida na especificação para ser a ordem textual em que as variáveis ??são declaradas -. Mas torna-se indefinido quando duas variáveis ??estão em diferentes arquivos que contribuem para uma classe parcial

de Mehrdad é outro bom: qualquer coisa onde layout físico é importante será muito possivelmente ser afetada por ordem de declaração.

Se os campos são inicializados como parte da declaração, eles são adicionados para o construtor (instância ou estático) na ordem em que aparecem no arquivo.

Você pode usar (abuso?) A ordem dos campos como metadados de sua classe que você pode do que ler através de reflexão.

Por exemplo, se você tem uma classe que representa um protocolo de rede com campos ID, PORT, e XOR, nessa ordem, você poderia defini-lo como:

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

Agora, suponha que você usar o reflexo para iterate os campos do protocolo, para enviar sobre o fio. A ordem retornado por GetProperties será tão definida, e você não tem que escrever qualquer extra metadados explicitamente.

Não tenho certeza se é uma boa idéia que para depender disso.

Eu acredito XmlSerializer serializa membros na ordem em que aparecem no arquivo de origem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top