2012-04-22 4 views
15

विजुअल स्टूडियो 2010 (संभवतः 2008 के साथ) के साथ मैं व्यवहार को देख रहा हूं जहां इंटेलिसेंस एनम्स के लिए पूरी तरह से योग्य नामस्थान का सुझाव देगा।विजुअल स्टूडियो पूरी तरह से योग्य नामस्थानों का सुझाव देता है जब आवश्यक नहीं

उदाहरण के लिए, मैं इस तरह कोड लिख सकते हैं:

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

लेकिन जब मैंने उसे लिखने की कोशिश, यह पता चलता है मैं इस तरह इसे लिखने: वास्तव में

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

यह अनावश्यक अतिरिक्त कोड कर सकते हैं जोड़ो और इसे कम पठनीय बनाता है, और मुझे इससे बचने के लिए इंटेलिजेंस के साथ मूल रूप से लड़ना होगा।

क्या इसका कोई कारण है? क्या मैं इसे बंद कर सकता हूं? मुझे लगता है कि कारण यह है कि enum का नाम संपत्ति के नाम के समान है। लेकिन यह वास्तव में एक अच्छा कारण नहीं है।

संपादित करें:

यहाँ एक और उदाहरण यह दर्शाता है कि क्यों पूरी तरह से योग्य नामकरण आवश्यक नहीं है है।

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

घुसपैठ; वीएस ने मेरी याद दिलाने के लिए पूरी तरह से योग्य नामों का सुझाव नहीं दिया है। –

+0

मेरे पास विंडोज फॉर्म एप्लिकेशन में पहले एक ही समस्या थी। यह सुझाव दे रहा था कि मैं सिर्फ DialogResult.OK की बजाय System.Windows.Forms.DialogResult.OK लिखता हूं। दोबारा, मुझे पूरा यकीन है कि यह तथ्य है कि उस क्षेत्र में "डायलॉग रिसेट" नामक एक स्थानीय संपत्ति है (एक फॉर्म)। –

+0

सही। मैं इस तरह की स्थिति में इसकी आवश्यकता होगी। –

उत्तर

5

यह वास्तव में same name for property & the type लगता है।
यहाँ smallest reproducible example कि नकल करता है बातें है (छोटे हो सकता है, लेकिन यह अधिक से पता चलता है) ...

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

दोनों MyEnum और TestEnum गुण (लक्ष्यीकरण TestEnum enum) प्रस्ताव 'पूरी तरह से योग्य के नाम (अन्य की तुलना में अलग नाम है इसकी संपत्ति का प्रकार लेकिन प्रकार अन्य संपत्ति के नाम से मेल खाता है, इसलिए दोनों 'दांतेदार' हैं) - जबकि SndTestEnum के पास अलग-अलग नामकरण (प्रकार, संपत्ति के लिए) है और किसी भी मामले में ठीक काम करता है।

... मजाकिया बात यह है कि अगर आप namespace MyCallerNS हटाते हैं और सभी को 'लंबे नामस्थान' के नीचे डाल दिया जाता है - तो यह अभी भी AndSomeMore. आगे बढ़ जाएगा।

वहाँ नहीं समाधान के रूप में मैं इसे (पुन # और 3 पार्टी उपकरण की कमी) देखते हैं,
इस IntelliSense as smart as the compiler मामला नहीं किया जा रहा है, के रूप में @Rick सुझाव हो रहा है है।

या इसके बजाए - कंपाइलर चीजों को हल करने के लिए अपना समय लेता है (हाथों की सारी जानकारी के साथ), जबकि इंटेलिजेंस में 'गहराई' और चीजों में अंतर्दृष्टि नहीं है (मुझे लगता है कि वास्तव में सरलीकृत करना - हमें @Eric ऑन यह :) और तेजी से/सबसे आसान विकल्प प्रकार बनाता है।

संपादित करें: वास्तव में, मेरे पिछले सोचा पर,
यह काम 'कि प्रत्येक प्रदर्शन के बारे में अधिक है - और IntelliSense (एक पूरा होने' सेवा 'के रूप में) सभी विकल्पों के साथ आप को पेश करने के दोनों संपत्ति है (नाम और प्रकार) सूची में (मैं उन्हें दोनों मौजूद नहीं देख रहा हूं, लेकिन एक अनुमान है। और दोनों को कवर करने के लिए एक विकल्प होने पर शायद संभालने का दर्द होगा)
तो इसे अलग करने के लिए पूरी तरह से योग्य नाम जोड़ते हैं।
और जहां यह 'विफल रहता है' (प्रकार) अंत में 'लघु संस्करण' पेस्ट करना है - जो वास्तव में मुझे लगता है।

6

मैं लगता आप WPF वातावरण में काम कर रहे हैं (मैं तत्व देखें) और आप किसी भी तरहSystem.Windows.Forms dll के संदर्भ में है। , VS

System.Windows.Forms.HorizontalAlignment में

और

System.Windows.FrameworkElement.HorizontalAlignment

एक ही प्रकार की ओर इशारा करते दो संदर्भों होने में

:

मेरे कटौती तथ्य यह है कि HorizontalAlignment दोनों नामस्थान में पाया जा सकता है पर आधारित है यह निर्दिष्ट करने के लिए पूछता है कि नामस्थान बिल्कुल का मतलब है।

+0

मेरे पास System.Windows.Forms का संदर्भ नहीं है। –

+0

@Moozhe: इसके बजाय किसी भी 'कार्यालय' dlls? – Tigran

+0

यह सिस्टम, विंडोजबेस, प्रेजेंटेशन फ्रेमवर्क, और प्रेजेंटेशनकोर के साथ एक खाली परियोजना है। –

2

मुझे लगता है कि अगर मैं element.HorizontalAlignment = टाइप करता हूं तो VS2010 स्वचालित रूप से System.Windows.HorizontalAlignment का सुझाव देगा, यदि आप टैब कुंजी दबाएंगे तो चुना जाएगा। यदि टैब कुंजी दबाए जाने के बजाय आप सूची को संकीर्ण करने के लिए 'हो' टाइप करते हैं, और तब टैब दबाएं, तो आपको क्षैतिज असाइनमेंट मिलेगा।

आप Resharper उपयोग करने के लिए है, तो टाइपिंग के बाद सक्षम हैं, तो '=' आप का सबसे स्पष्ट विकल्पों के साथ प्रस्तुत किया जाएगा:

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

यह सही जवाब हो सकता है। मैंने वास्तव में इस समस्या का शोध किया और अन्य लोगों को यह कहते हुए पाया कि रिशेर्पर ने इस मुद्दे को ठीक नहीं किया है, लेकिन यह एक पुराना संस्करण या खराब जानकारी हो सकती थी। मैं आज रात कोशिश करूंगा। –

+0

मैं आर # 6.1 और 7 का उपयोग कर रहा हूं। मुझे याद नहीं है कि व्यवहार पिछले संस्करण में क्या होता था। – Phil

+0

मैंने आर # 6.1 को 7 की कोशिश की। दिलचस्प बात यह है कि यह डिफ़ॉल्ट इंटेलिजेंस प्रीइलेक्लिंग को तोड़ देती है। Resharper विकल्प के तहत -> पर्यावरण -> Intellisense -> Autopopup -> C# यह एक विकल्प के रूप में पूर्व निर्धारित करने का उल्लेख करता है, लेकिन यह पूर्व निर्धारित नहीं करता है, वास्तव में व्यवहार समान दिखता है भले ही आप "प्रदर्शन और चयन न करें" चुनते हैं। –

1

यह एक मामले में जहां संकलक Intellisense अधिक चालाक है।

यदि आप एक ही नाम के साथ एक संपत्ति का उपयोग कर रहे हैं, उदाहरण के लिए "सार्वजनिक टेक्स्ट एलाइनमेंट टेक्स्ट एलाइनमेंट {get; set;}", आपको इसे निर्दिष्ट किए गए एनम वैल्यू के नेमस्पेस को पूरी तरह अर्हता प्राप्त करने की आवश्यकता नहीं है। लेकिन, Intellisense यह जानने के लिए पर्याप्त स्मार्ट प्रतीत नहीं होता है। कोड योग्यता के बिना ठीक काम करेगा, आपको इंटेलिजेंस को ध्यान में रखते हुए और ध्यान में अच्छा होना होगा।

+0

क्या आप कह रहे हैं कि विजुअल स्टूडियो 2005 में इंटेलिजेंस वीएस 11 में इंटेलिजेंस से ज्यादा स्मार्ट है? मैं काम पर वीएस2005 का उपयोग करता हूं और मुझे कभी भी यह समस्या नहीं मिली है, एक बार नहीं। –

+0

मुझे नहीं पता? मैंने 2008 से 2005 का उपयोग नहीं किया है। –

0

उपरोक्त उत्तरों के अतिरिक्त, मेरे पास कुछ परियोजनाएं थीं जहां माइक्रोसॉफ्ट ऑफिस ऑटोमेशन शामिल था।मेरे वर्गों संरचित कर रहे थे के रूप में

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

जब नेट ढांचे के ही माइक्रोसॉफ्ट नाम स्थान के अंदर कुछ भी पहुंचने का प्रयास कर, Intellisense पूरी तरह से नाम अर्हता प्राप्त करने के आप मजबूर होना पड़ा। रूट विवाद के मामलों में यह वैश्विक कीवर्ड को पूर्व-प्रस्तुत भी करेगा: global::Windows.Forms.etc...

संबंधित मुद्दे