2012-04-22 2 views
15

Mit Visual Studio 2010 (möglicherweise auch 2008) merke ich, dass Intellisense den vollständig qualifizierten Namespace für Enums vorschlägt.Visual Studio empfiehlt vollständig qualifizierte Namespaces, wenn sie nicht benötigt werden

Zum Beispiel kann ich Code wie folgt schreiben:

element.HorizontalAlignment = HorizontalAlignment.Right; 
element.VerticalAlignment = VerticalAlignment.Bottom; 

Aber wenn ich versuche, es zu schreiben, es schlägt vor, ich es so schreiben:

element.HorizontalAlignment = System.Windows.HorizontalAlignment.Right; 
element.VerticalAlignment = System.Windows.VerticalAlignment.Bottom; 

Dieser unnötige zusätzliche Code kann wirklich summieren sich und macht es weniger lesbar, und ich muss im Grunde mit Intellisense kämpfen, um es zu vermeiden.

Gibt es einen Grund dafür? Kann ich es einfach ausschalten? Ich nehme an, der Grund ist, dass der Name der Enumeration mit dem Namen der Eigenschaft identisch ist. Aber das ist wirklich kein guter Grund.

EDIT:

Hier ist ein weiteres Beispiel, das vollständig qualifizierte Namensgebung nicht notwendig ist, zeigt, warum.

using SomeOtherNamespace; 

namespace SomeNamespace 
{ 
    public class Class1 
    { 
     public Class2 Class2 { get; set; } 

     public Class1() 
     { 
      // These all compile fine and none require fully qualified naming. The usage is context specific. 
      // Intellisense lists static and instance members and you choose what you wanted from the list. 

      Class2 = Class2.Default; 
      Class2.Name = "Name"; 
      Class2.Name = Class2.Default.Name; 
      Class2 = Class2; 
     } 
    } 
} 

namespace SomeOtherNamespace 
{ 
    public class Class2 
    { 
     public static Class2 Default { get; set; } 

     // public static Class2 Class2; (This throws an error as it would create ambiguity and require fully qualified names.) 

     // public static string Name { get; set; } (This also throws an error because it would create ambiguity and require fully qualified names. 

     public string Name { get; set; } 
    } 
} 
+0

Inestresting; VS hat niemals völlig qualifizierte Namen vorgeschlagen, wenn es nicht erforderlich ist, zu meiner Erinnerung. –

+0

Ich hatte das gleiche Problem zuvor in einer Windows Forms-Anwendung. Es wurde vorgeschlagen, dass ich System.Windows.Forms.DialogResult.OK statt nur DialogResult.OK schreibe. Ich bin mir ziemlich sicher, dass es eine lokale Eigenschaft namens "DialogResult" in diesem Bereich (ein Formular) gibt. –

+0

rechts. Ich würde es in einer solchen Situation für erforderlich halten. –

Antwort

5

Dies scheint tatsächlich die same name for property & the type zu sein.
Hier ist die smallest reproducible example dass ahmen Dinge (auch kleiner sein könnten, aber dies zeigt mehr) ...

namespace Company.Project.SubProject.Area.Test.AndSomeMore 
{ 
    public class TestClass 
    { 
     public TestEnum MyEnum { get; set; } 
     public TestEnum TestEnum { get; set; } 
     public SndTestEnum NewEnum { get; set; } 
    } 
    public enum TestEnum 
    { 
     None, 
     One, 
     Two 
    } 
    public enum SndTestEnum 
    { 
     None, 
     One, 
     Two 
    } 
} 
namespace MyCallerNS 
{ 
    public class MyTestClass : TestClass 
    { 
     public MyTestClass() 
     { 
      this.TestEnum = Company.Project.SubProject.Area.Test.AndSomeMore.TestEnum.One; 
      this.MyEnum = Company.Project.SubProject.Area.Test.AndSomeMore.TestEnum.Two; 
      this.NewEnum = SndTestEnum.None; 
     } 
    } 
} 

Both MyEnum und TestEnum Eigenschaften (Targeting TestEnum Enum) Angebot "voll qualifizierte Namen (andere andere Namen hat als sein Eigenschaftstyp, aber der Typ stimmt mit dem Namen der anderen Eigenschaft überein, so dass beide "verdorben" sind - während SndTestEnum eine andere Benennung (für Typ, Eigenschaft) hat und in beiden Fällen gut funktioniert.

... lustige Sache ist, dass selbst wenn Sie namespace MyCallerNS entfernen und alle unter dem "langen Namensraum" - es würde immer noch hinzufügen AndSomeMore. vor.

Es gibt keine Lösung, wie ich es (kurz von Re # und 3rd-Party-Tool) zu sehen,
dies scheint die Intellisense nicht as smart as the compiler Fall zu sein zu sein, wie @Rick vorgeschlagen.

Oder eher - Compiler braucht seine Zeit, um Dinge zu lösen (mit allen Informationen zur Hand), während Intellisense nicht diese 'Tiefe' und Einblick in Dinge (Ich vermute, vereinfacht wirklich - wir brauchen @Eric on dies :) und macht schnelle/einfachste Entscheidungen.

EDIT: Eigentlich auf meinem früheren Gedanken,
es ist mehr über die ‚Arbeit‘, die jeder durchführen - und Intellisense (als Abschluss ‚Service‘) hat Sie mit allen Möglichkeiten zu präsentieren (sowohl die Eigenschaft Name und der Typ) in der Liste (ich sehe nicht, dass sie beide anwesend sind, aber eine Vermutung. Und eine Wahl zu haben, würde beide ein Schmerz sein, zu behandeln)
So unterscheidet es die voll qualifizierten Namen.
Und wo es "fehlschlägt" (sozusagen) ist, am Ende die "kurze Version" zu "pasten" - was in der Tat sollte ich denke.

6

ich nehme an, Sie arbeiten in WPF Umgebung (ich sehe Element), und Sie haben irgendwie der Verweis auf System.Windows.Forms dll.

ist mein Abzug auf Tatsache, dass HorizontalAlignment in beiden Namensräumen zu finden:

in System.Windows.Forms.HorizontalAlignment

und

in System.Windows.FrameworkElement.HorizontalAlignment

Mit zwei Verweisen auf die gleiche Art zeigen, VS fragt nach, welcher Namespace genau Sie meinen.

+0

Ich habe keinen Verweis auf System.Windows.Forms. –

+0

@Moozhe: irgendwelche 'Office' dlls, stattdessen? – Tigran

+0

Es ist ein leeres Projekt mit System, WindowsBase, PresentationFramework und PresentationCore. –

2

Ich finde, wenn ich element.HorizontalAlignment = tippe, schlägt VS2010 automatisch System.Windows.HorizontalAlignment vor, das ausgewählt wird, wenn Sie die Tab-Taste drücken. Wenn Sie anstelle der Tabulatortaste "Ho" eingeben, um die Liste einzuschränken, und dann die Tabulatortaste drücken, erhalten Sie nur HorizontalAlignment.

Wenn Sie in der Lage sind Resharper zu verwenden, dann nach Eingabe ‚=‘ Sie werden mit der offensichtlichsten Auswahl von präsentiert:

HorizontalAlignment.Center 
HorizontalAlignment.Left 
HorizontalAlignment.Stretch 
HorizontalAlignment.Right 
+0

Dies könnte die richtige Antwort sein. Ich habe dieses Problem recherchiert und festgestellt, dass andere Leute sagen, dass Resharper das Problem nicht behoben hat, aber das könnte eine ältere Version oder eine schlechte Information gewesen sein. Ich werde das heute Abend versuchen. –

+0

Ich benutze R # 6.1 und 7. Ich kann mich nicht erinnern, wie das Verhalten in der vorherigen Version war. – Phil

+0

Ich versuchte R # 6.1 und 7. Interessanterweise bricht es die Standard Intellisense Vorauswahl. Unter Resharper Options -> Environment -> Intellisense -> Autopopup -> C# wird die Option Vorselektion als eine Option erwähnt, aber es wird nicht vorausgewählt, tatsächlich erscheint das Verhalten identisch, auch wenn Sie "Anzeigen und nicht vorauswählen" wählen. –

1

Dies ist ein Fall, in dem der Compiler schlauer als Intellisense ist.

Wenn Sie auf eine Eigenschaft mit demselben Namen wie dem Typ zugreifen, z. "public TextAlignment TextAlignment {get; set;}", Sie müssen den Namespace des ihm zugewiesenen enum-Werts nicht vollständig qualifizieren. Aber Intellisense scheint nicht schlau genug, das zu wissen. Der Code wird ohne die Qualifikation gut funktionieren, Sie müssen einfach gut darin sein, Intellisense zu bemerken und auszuweichen.

+0

Wollen Sie sagen, dass Intellisense in Visual Studio 2005 schlauer ist als Intellisense in VS 11? Ich benutze VS2005 bei der Arbeit und ich hatte dieses Problem nie, nicht einmal. –

+0

Ich weiß es nicht? Ich habe das Jahr 2005 seit 2008 nicht mehr genutzt. –

0

Zusätzlich zu den obigen Antworten hatte ich einige Projekte, bei denen Microsoft Office Automation beteiligt war.Meine Klassen strukturiert wurden als

  • CustomNameSpace.Library.Microsoft.Word.CustomClass1
  • CustomNameSpace.Library.Microsoft.Excel.AnotherCustomClass

Beim Versuch, etwas in dem Microsoft-Namespace von .NET Framework für den Zugriff selbst, Intellisense Sie voll Namen zu qualifizieren zwingen würde. In Fällen eines Wurzelkonflikts würde es auch das globale Schlüsselwort wie folgt vorgeben: global::Windows.Forms.etc....

Verwandte Themen