2016-08-24 2 views
5

Ich suche einen Fehler Raise haben einen Build zu verhindern, wenn es doppelte Schlüssel in meinem statischen Wörterbuch.Compiler zu überprüfen, ob Schlüssel im Wörterbuch sind einzigartig

Mein aktueller Wörterbuch unter

public static readonly Dictionary<string, string> Fruits = new Dictionary<string, string> 
{ 
    {"Sobeys", "Apples"}, 
    {"NoFrills", "Oranges"} 
} 

Aber sagen wir mal jemand versehentlich ändert Sobeys Nofrills zu sein, ich einen Compiler-Fehler möchte angehoben werden, damit nichts zu tun, bis dieser doppelten Schlüssel behoben ist. Darf ich fragen, ist das möglich? Wenn ja, wie würde ich das machen?

public static readonly Dictionary<string, string> Fruits = new Dictionary<string, string> 
{ 
    {"NoFrills", "Apples"}, 
    {"NoFrills", "Oranges"} 
} 
+4

Sie werden Ihren eigenen Compiler schreiben, wenn Sie es ein anderes Verhalten als die Regeln von C# haben wollen. – Servy

+3

Verwenden Sie Visual Studio 2015 oder neuer? Wenn ja, ist es möglich mit einem benutzerdefinierten [Live-Code-Analysator] (https://msdn.microsoft.com/en-us/magazine/dn879356.aspx), aber es wird eine nicht dreifache Menge an Arbeit sein, um es zu machen robust. –

+0

@Servy Da C# Open Source ist, sollte stattdessen ein Patch an die Community gesendet werden. https://github.com/dotnet/roslyn –

Antwort

6

Sie können auch den folgenden Hack verwenden (ich es nicht empfehlen): anonym Typ Wörterbuch konvertieren. Anonyme Typen erlauben keine doppelten Eigenschaftsnamen.

Beispiel:

Dictionary<string, string> Fruits = ToDictionary(
    new 
    { 
     Sobeys = "Apples", 
     NoFrills = "Oranges" 
    } 
); 

Aber dieser Ansatz hat die folgende Einschränkung: Sie können nur gültige Bezeichner als Schlüssel in Ihrem Wörterbuch haben.

Wie ToDictionary implementieren dort beschriebenen Verfahren wird: In c# convert anonymous type into key/value array?

+0

Interessant, ich gebe dir einen schnellen Versuch! – Master

+2

Das ist eine sehr clevere Idee. – sstan

+0

Hallo, definitiv ein Hack, aber das ist im Wesentlichen, was ich wollte. Vielen Dank @ just.ru – Master

8

Nein, das ist eine Laufzeit Sache. Sobald die Klasse in den Speicher geladen wird, wird eine Ausnahme ausgelöst (die von Natur aus Laufzeit ist).

Sie können eine individuelle Überprüfung durch einen Diagnose-Analysator hinzufügen, aber das wäre für sehr wenig Gewinn vieler Schmerzen. Ich schlage vor, Sie behalten es so wie es ist und behalten Sie Ausnahmen bei einer neuen Bereitstellung im Auge. Sie können immer einen Kommentar hinzufügen, um anderen Entwicklern klar zu machen, dass Schlüssel eindeutig sein müssen, aber wo hören Sie auf? Ein Entwickler sollte Grundregeln wie diese kennen.

Sie können auch verwenden, beispielsweise eine Enumeration als Schlüssel, die deutlich an devtime machen würde, wenn Sie versuchen, etwas hinzuzufügen, das bereits vorhanden ist. Eine andere Option ist, sich auf const string Felder zu beziehen, obwohl es etwas brüchig bleibt.

+1

ich ziemlich viel würde die gleiche Sache wie Sie sagen wollen, aber das einzige, was ich ihm hinzufügen würde, ist dies ein guter Job für Unit Tests –

+0

@ScottChamberlain Unit Tests fangen würde helfen, wenn das durch ein Verfahren durchgeführt wurde, aber Zugabe Sie können den Einheitentest nicht durchführen, wenn er bereits in der Initialisierung des Kurses –

+0

@JeroenVannevel dupliziert wurde? Zugriff auf diese Eigenschaft wird mit Ausnahme fehlschlagen - so Test fehlschlagen wird ... nicht sicher, warum Sie Test schreiben würden, die erfolgreich ist, wenn Ausnahme ausgelöst wird ... –

1

C# Compiler verfügt nicht über diese Möglichkeit. Sie erhalten eine Ausnahme zur Laufzeit.

Um dies zu lösen, haben Sie Ihre eigene Vorbearbeitung Kontrollen zu implementieren oder Runtime-Ausnahmen zu behandeln.

1

Ich würde einen Compiler-Fehler gerne

Es ist nicht ein Fehler ausgelöst werden. Deshalb sollte der Compiler keinen Kompilierfehler ausgeben. Sammelinitialisierer sind syntaktischer Zucker und werden in entsprechende Add()-Methoden (oder Indexer im Fall der alternativen Syntax) -Aufrufe übersetzt.

Ihre beste Option ist, sich auf einige 3rd-Party-Code-Analyse-Tool zu verlassen, die solche potenziellen Fehler erkennen können.

Verwandte Themen