2010-12-09 12 views
1

Ich möchte alle expliziten Typen automatisch entfernen und sie mit dem Schlüsselwort var in einer großen Lösung, z. stattAutomatischer Austausch expliziter Typ mit var-Schlüsselwort

int a = 1; 

Ich möchte haben:

var a = 1; 

Dies ist nur Kosmetik ist, wird der Code in der Lösung arbeitet völlig in Ordnung, ich will nur Dinge konsistent haben, als ich anfing explizite Typen mit , aber später verwendete var-keywords.

Ich schätze, ich müsste eine Art Code-Parser schreiben - klingt ein wenig umständlich. Kennt jemand eine einfache Lösung dafür?

Cheers, Chris

+4

Ich benutze nur var, wenn der Typ etwas ist wie 'Dictionary >>'. Ich würde es nie anstelle von int verwenden, da sie die gleiche Länge haben. Aber das sind nur meine 2 Cent. – juharr

+3

Achten Sie zum Beispiel auf: 'float a = 3;' umgewandelt in 'var a = 3;' würde es zu einem int machen. –

+2

Ich würde es so lassen wie es ist. var eignet sich hervorragend für lange Klassennamen und Dinge, die Sie lokal verwenden, aber wenn Sie zwischen int und var wählen können, ist var einfach nicht so klar und lesbar (es ist lesbar, nur nicht * als * lesbar). – Kendrick

Antwort

6

Dies ist keine Antwort per se, aber es ist zu lang für einen Kommentar.

Sie sollten stark nicht dies tun. Es gibt keine stilistischen Bedenken beim Mischen von expliziten und inferenziellen Typisierungen (Sie sollten Typen bei Bedarf ableiten, entweder bei der Verwendung anonymer Typen oder wenn der Code leserlicher wird), und es gibt viele mögliche Probleme, die Ihnen dabei begegnen:

  • Erklärungen ohne Zuordnung sind untauglich
  • Deklarationen, die zu null sind untauglich
  • Erklärungen zugeordnet sind, die aus einer Supertyp sind, aber auf eine Instanz eines Subtyps initialisiert (oder kompatibel, aber unterschiedlichen Typ) würde ihre Bedeutung verändern .

I.E.

object foo = "test"; 

... 

foo = 2; 

Offensichtlich ist dies ein einfaches (und unwahrscheinlich) Beispiel, aber in foo getippt als string statt object würde fooobject-var ändern und würde die Semantik des Codes ändern (es würde nicht Kompilieren Sie in diesem Fall nicht, aber Sie könnten leicht in schwierigere Szenarios geraten, in denen sich die Überladungsauflösung ändert, aber nicht einen Kompilierungsfehler erzeugt.

Mit anderen Worten, tun Sie dies bitte nicht.

+0

Danke, das klingt für mich vollkommen vernünftig. Ich nehme deinen Ratschlag. – Christopher

-2

Was suchen ist/Ersetzen in Visual Studio IDE Zum Beispiel suchen vor 'int' und ersetzen Sie es mit 'var'.

+1

-1 aus den gleichen Gründen, wie ich StingyJack die Antwort kommentierte. – cdhowie

+0

@cdhowie - niemand sagt, eine globale ersetzen zu tun. Vielleicht sollten Sie aufhören, diese "nicht hilfreich" zu akzeptieren und zu deklarieren, wenn es sich um legitime Lösungen handelt. – StingyJack

+2

@StingyJack: Vielleicht müssen Sie die ursprüngliche Frage trotzdem noch einmal lesen, da dies im Grunde einen C# Parser erfordert. Finden/ersetzen auf eine ganze Lösung mit wahrscheinlich über 100 verschiedenen Arten ist einfach nicht machbar. Es sei denn, Sie möchten mturk für Sie machen ... – cdhowie

0

Schauen Sie in Lex & Yacc. Sie können das mit einem Perl- oder Awk-Skript kombinieren, um Ihre Quelle mechanisch zu bearbeiten.

Sie können dies auch in Emacs mit CEDET tun. Es analysiert Codemodule und erstellt eine Tabelle seiner Codeanalyse.

In beiden Fällen müssen Sie eine Analyse des Codes erstellen, der ... Klassendeklarationen (Klassenname, Elterntypen, Start- und Endpunkte), Methodendeklarationen (ähnlich), Variablendeklarationen usw. beschreibt auf.Dann schreiben Sie etwas Code (perl, awk, powershell, elisp, was auch immer), der die Tabelle durchläuft, und ersetzt die entsprechende Variablendeklaration.

+0

Oder Sie könnten einfach gmcs und/oder die gmcs-Grammatik aus dem Mono-Projekt ausleihen und den Compiler optimieren, um source zu erzeugen. Lokale Variablendeklarationstypen werden durch 'var' ersetzt, wenn (1) syntaktisch zulässig ist und (2) wenn möglich Es muss bewiesen werden, dass die Verwendung von 'var' den Typ der Variablen nicht ändert. – cdhowie

+0

Ja, das ist die Idee. Für das Lexer/Analyzer-Stück gibt es mehrere Möglichkeiten. – Cheeso

0

Ich würde vorsichtig sein, dies in einer automatisierten Art und Weise zu tun. Es gibt Orte, wo dies die Semantik des Programms tatsächlich verändern oder Fehler einführen kann. Zum Beispiel

IEnumerable<string> list = MethodThatReturnsListType(); 

oder

string foo = null; 
if (!dict.TryGetValue("bar", out foo)) 
{ 
     foo = "default"; 
} 

Da es sich um keine Fehler, ich würde sie einfach ersetzen, wie Sie den Code aus anderen Gründen berühren. Auf diese Weise können Sie den umgebenden Code überprüfen und sicherstellen, dass Sie die Semantik nicht ändern und Fehler vermeiden, die behoben werden müssen.

1

Erstens ist dies wahrscheinlich keine so gute Idee. Es gibt keinen Vorteil zu var über int; Viele Erklärungen werden fast so einfach sein.

Aber wenn Sie müssen ...

Eine teilweise manuelle Lösung ist ReSharper des „Use var“ Hinweis in eine Warnung zu machen und bekommen es, sie alle zu beheben. Ich weiß nicht, ob es ReSharper en masse tun, aber ich oft Gewehr durch ein schlecht gemachtes Stück Code von Drittanbietern mit einer schnellen Folge von Alt + PgDn, Alt + Gebe Sie .

Dies hat den wesentlichen Vorteil, dass ReSharper die Semantik Ihres Codes respektiert. Es wird nicht willkürlich Typen ersetzen, und ich bin ziemlich sicher, dass es nur Änderungen vornehmen wird, die die Bedeutung Ihres Programms nicht betreffen. ZB: Es wird nicht ersetzt object o = "hello"; (ich denke; ich bin nicht vor VS, um dies zu überprüfen).

Verwandte Themen