Frage

Diese Frage von Jon Skeet Antwort inspiriert: Gibt es eine c # entspricht c ++ 's access-Modifikator Regionen

Er macht einen Kommentar, der es möglich ist, die Reihenfolge der Felder in einer Datei Materie. Ich vermute, dass dies mit der Bestellung zu tun hat, dass die Felder initialisiert werden, aber ich denke, es ist gefährlich genug, was zu auf der Grundlage dieser Nebenwirkung codiert, dass sie ihre eigene Frage und Diskussion gerechtfertigt.

Gibt es andere Gedanken um, wie die Reihenfolge der Felder in Ihrer Codedatei manipuliert werden könnte und welche Auswirkungen das haben könnte?

War es hilfreich?

Lösung

Hier ist ein klassisches Beispiel aus der Sprache C # spec (Abschnitt 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);
    }
}

Dies ist ein vollständig gültiges Programm und wie geschrieben (a = 1, b = 2). Allerdings, wenn Sie die Reihenfolge der Felder tauschen sie auch Werte tauschen.

Andere Tipps

Ja, es ist egal, wenn sie mit nicht verwalteten Code Schnittstelle.

Ich dachte in erster Linie über die Reihenfolge der Initialisierung, ja - vor allem für statische Felder. Zum Beispiel (mit dem öffentlichen Bereichen nur zur Vereinfachung der Demonstration):

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

Die Reihenfolge der Initialisierung wird in der Spezifikation definiert die Text Ordnung zu sein, in der die Variablen deklariert werden -. Aber es wird nicht definiert, wenn zwei Variablen in verschiedenen Dateien einen Beitrag zu einer partiellen Klasse sind

Mehrdad Antwort ist eine weitere gute: alles, wo physisches Layout ist wichtig, wird möglicherweise von der Reihenfolge der Deklaration beeinflusst werden.

Wenn Felder im Rahmen der Deklaration initialisiert werden, werden sie an den Konstruktor (Instanz oder statisch) hinzugefügt in der Reihenfolge, wie sie in der Datei angezeigt.

Sie können (Missbrauch?) Verwenden, um die Reihenfolge der Felder als Metadaten Ihrer Klasse, die Sie als durch Reflexion lesen kann.

zum Beispiel, wenn Sie eine Klasse, die ein Netzwerkprotokoll mit Feldern ID, PORT darstellt und XOR, in dieser Reihenfolge, können Sie es wie definieren könnten:

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

Nehmen wir nun an Sie Reflexion verwenden, um die Felder des Protokolls zu durchlaufen, um den Draht zu senden über. Der Auftrag von GetProperties zurückgegeben wird, wie Sie definiert sind, und Sie haben nicht explizit keine zusätzlichen Metadaten zu schreiben.

Nicht sicher, ob es eine gute Idee, wenn auf diesem abhängig zu sein.

Ich glaube, XmlSerializer Mitglieder in der Reihenfolge serialisiert sie in der Quelldatei angezeigt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top