Domanda

Questa domanda è ispirata dalla risposta di Jon Skeet: Esiste ac # equivalente per le regioni modificatore di accesso di c ++

Commenta che è possibile che l'ordine dei campi in un file sia importante. Immagino che ciò abbia a che fare con l'ordine di inizializzazione dei campi, ma penso che sia una cosa abbastanza pericolosa da programmare in base a questo effetto collaterale da giustificare la propria domanda e discussione.

Ci sono altri pensieri su come potrebbe essere manipolato l'ordine dei campi all'interno del tuo file di codice e quale impatto potrebbe avere?

È stato utile?

Soluzione

Ecco un classico esempio delle specifiche del linguaggio C # (Sezione 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);
    }
}

Questo è un programma completamente valido e come scritto (a = 1, b = 2). Tuttavia, se si scambia l'ordine dei campi, cambieranno anche i valori.

Altri suggerimenti

Sì, importa quando si interfaccia con codice non gestito.

Pensavo principalmente all'ordine di inizializzazione, sì, in particolare per i campi statici. Ad esempio (con campi pubblici solo per semplicità di dimostrazione):

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

L'ordine di inizializzazione è definito nella specifica come l'ordine testuale in cui sono dichiarate le variabili - ma diventa indefinito quando due variabili si trovano in file diversi che contribuiscono a una classe parziale.

La risposta di Mehrdad è un'altra buona: qualsiasi cosa in cui il layout fisico sia importante sarà probabilmente influenzata dall'ordine di dichiarazione.

Se i campi vengono inizializzati come parte della dichiarazione, vengono aggiunti al costruttore (istanza o statici) nell'ordine in cui compaiono nel file.

Puoi usare (abuso?) l'ordine dei campi come metadati della tua classe che puoi leggere attraverso la riflessione.

ad esempio, se si dispone di una classe che rappresenta un protocollo di rete con campi ID, PORT e XOR, in questo ordine, è possibile definirlo come:

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

Ora supponiamo di usare la riflessione per iterare i campi del protocollo, per inviare via cavo. L'ordine restituito da GetProperties sarà come definito e non è stato necessario scrivere esplicitamente altri metadati.

Non sono sicuro che sia una buona idea dipendere da questo.

Credo che XmlSerializer serializzi i membri nell'ordine in cui compaiono nel file sorgente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top