Pregunta

Esta pregunta está inspirada en la respuesta de Jon Skeet: ¿Hay un ac # equivalente a las regiones modificadoras de acceso de c ++

Hace un comentario de que es posible que el orden de los campos en un archivo importe. Supongo que esto tiene que ver con el orden en que se inicializan los campos, pero creo que es bastante peligroso codificar en función de este efecto secundario que justifica su propia pregunta y discusión.

¿Hay otras ideas sobre cómo se podría manipular el orden de los campos dentro de su archivo de código y qué impacto podría tener?

¿Fue útil?

Solución

Aquí hay un ejemplo clásico de la especificación del lenguaje C # (Sección 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 es un programa completamente válido y como está escrito (a = 1, b = 2). Sin embargo, si cambia el orden de los campos, también intercambiarán valores.

Otros consejos

Sí, sí importa al interactuar con código no administrado.

Estaba pensando principalmente en el orden de inicialización, sí, particularmente para los campos estáticos. Por ejemplo (con campos públicos solo por simplicidad de demostración):

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

El orden de inicialización se define en la especificación como el orden textual en el que se declaran las variables, pero queda indefinido cuando dos variables están en archivos diferentes que contribuyen a una clase parcial.

La respuesta de Mehrdad es otra buena: cualquier cosa en la que el diseño físico sea importante posiblemente se verá afectado por el orden de la declaración.

Si los campos se inicializan como parte de la declaración, se agregan al constructor (instancia o estático) en el orden en que aparecen en el archivo.

Puede usar (¿abuso?) el orden de los campos como metadatos de su clase que puede leer a través de la reflexión.

por ejemplo, si tiene una clase que representa un protocolo de red con los campos ID, PORT y XOR, en ese orden, podría definirlo como:

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

Ahora suponga que usa la reflexión para iterar los campos del protocolo, para enviar a través del cable. El pedido devuelto por GetProperties será el que usted definió y no tuvo que escribir metadatos adicionales explícitamente.

No estoy seguro si es una buena idea depender de esto.

Creo que XmlSerializer serializa a los miembros en el orden en que aparecen en el archivo fuente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top