Frage

Welche andere Einschränkungen gibt es auf Namen (neben der offensichtlichen Einzigartigkeit innerhalb eines Bereichs)?

Wo sind diejenigen, die?

War es hilfreich?

Lösung

Aus dem PDF von ECMA-335 , Partition II , Abschnitt 22 „, bewahrt Metadaten Namen Strings, wie durch einen Compiler oder Code-Generator erstellt, unverändert. Im Wesentlichen ist es behandelt Jeder String als opaker Blob. Insbesondere bewahrt Fall. Die CLI erlegt keine Begrenzung für die Länge der Namen in den Metadaten gespeichert und anschließend von der CLI“verarbeitet werden.

Wenn ich das richtig gelesen habe, und der Kontext korrekt ist, dann ist es keine wirkliche Grenze für die Länge eines Bezeichners in der CLR.

Andere Tipps

Zusätzlich zu den anderen Antworten, die maximalen Bezeichnerlänge, die von der Microsoft Visual C # Compiler akzeptiert wird, sind 511 Zeichen . Dies kann mit dem folgenden Code getestet werden:

class Program
{
    private static void Main(string[] args)
    {
        int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 5;
    }
}

Die Länge der Variablennamen gibt es 511 Zeichen. Dieser Code kompiliert, aber wenn ein Zeichen nach dem Namen hinzugefügt wird, der Compiler gibt error CS0645: Identifier too long.

Die Sprache C # Spezifikation definiert Identifikatoren in Abschnitt 2.4.2 der Unified C # 3.0-Spezifikation. Im Grunde ist es „Brief oder Unterstrich“, gefolgt von einer beliebigen Anzahl von „Brief, Nachkommastelle, Charakter verbinden, die Kombination von Zeichen, die Formatierung Zeichen“. Um ein Schlüsselwort als Bezeichner zu verwenden, müssen Sie setzen @ vor, z.B. int @int = 5;

Ich habe nicht in die CLI-Spezifikation sieht, aber ich weiß, es ist etwas weniger restriktiv als der C # spec, weil der C # -Compiler „unsäglicher“ Namen für Dinge wie anonyme Methoden verwendet - diese in der Regel spitzer Klammern enthalten, die in gültig sind die CLI aber nicht gültig in C #.

EDIT: Es gibt keine expliziten Namen Längenbeschränkungen in der # spec C, aber Abschnitt 2.4.2 hat eine Reservierung hat:

  

Identifiers zwei aufeinanderfolgende Unterstreichungszeichen (U + 005F) enthalten, sind für die Verwendung durch die Anwendung reserviert. Zum Beispiel könnte eine Implementierung erweiterter Schlüsselwörter liefern, die mit zwei Unterstrichen beginnen.

Mit anderen Worten, es ist implementierungsspezifisch, ob eine bestimmte Kennung mit __ beginnen zu arbeiten. (Einige Compiler __foo als erweiterte Schlüsselwort haben, und einige können nicht.)

Nach verschiedenen Orten in "Expert NET 2.0 IL Assembler" (Serge Lidin, Apress), die funktionelle CIL / CLR Grenze 1.023 Bytes, wie in UTF-8 codiert. Zitate:

Seite 122:

  

Die Länge jeder Art von Namen in ILAsm ist syntaktisch nicht beschränkt, sondern Metadatenregeln bestimmte Beschränkungen der Namenslänge verhängen.

Seite 126:

  

Die Common Language Runtime erlegt eine Beschränkung auf der vollen Länge Klassennamen, anzugeben, daß es nicht 1.023 Bytes in UTF-8-Codierung nicht überschreiten sollte. Der ILAsm Compiler jedoch erzwingt diese Einschränkung nicht. Apostrophe, sollte sie für einfache Namen in ILAsm verwendet werden, um ein rein lexikalisches Werkzeug ist und es nicht auf die Metadaten machen; damit sie nicht auf die Gesamtlänge des vollständigen Klassennamen tragen.

Seite 143:

  

[TypeDef Tabelle] Die kombinierte Länge der Saiten durch den Namen und Namespace-Einträge verwiesen wird, müssen nicht 1023 Byte nicht überschreiten.

Seite 144:

  

[TypeRef Tabelle] [Laufzeit] Die kombinierte Länge der Saiten durch den Namen und Namespace-Einträge verwiesen wird, müssen nicht 1023 Byte nicht überschreiten.

Seite 186:

  

[Methode Tabelle] Name (Offset im #STRINGS stream). Der Name der Methode (ohne den Namen der Klasse, zu der die Methode gehört). Dieser Eintrag muss Index eine Reihe von Nicht-Null-Länge nicht mehr als 1023 Bytes in UTF-8-Codierung.

Suchen Sie in der Partition II Metadaten-Dokumentation heißt es, dass eine Kennung entweder eine ID oder ein SQSTRING

Eine ID wird als

beschrieben
  

eine zusammenhängende Folge von Zeichen   die beginnt, entweder mit einer alphabetischen   Zeichen oder einer der „_“, „$“, „@“ oder   „?“ Und wird von einer beliebigen Anzahl gefolgt von   alphanumerische Zeichen oder einem „_“,   „$“, „@“ Oder „?“

Was bedeuten würde, es gibt keine Längenbegrenzung.

Visual Studio 2015 (Update 3) - C # 6

Die maximale Klassenname Länge = 993 Zeichen

    public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{            
}

Wenn Sie noch 1 Zeichen, um es hinzuzufügen wären, doest es nicht kompilieren und überraschend die Fehlerliste ist zu leer!

Edit: Für meine Kollegen mit VS2013 Update 3 der Klassenname limit = 1012 . weiß nicht den Grund, warum.

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