2009-12-15 9 views
10

मैं दो तरीकों कि एक दूसरेक्या विज़ुअल स्टूडियो के सी # इंटेलिजेंस को पहले एक निश्चित विधि अधिभार प्रदर्शित करने के लिए एक संकेत दिया जा सकता है?

public class Car 
{ 
    public int GetPrice(string vinNumber) 
    { 
     string make = Database.GetMake(vinNumber); // expensive operation 
     string model = Database.GetModel(vinNumber); // expensive operation 
     int year = Database.GetYear(vinNumber); // expensive operation 

     return this.GetPrice(make, model, year); 
    } 

    public int GetPrice(string make, string model, int year) 
    { 
     // Calculate value and return 
    } 
} 

के भार के मेरे उदाहरण में हैं, GetPrice (बनाने, मॉडल, साल) अधिभार निष्पादित करने के लिए सस्ता है, लेकिन GetPrice (vinNumber) विधि महंगा है। समस्या यह है कि महंगी विधि में सबसे कम पैरामीटर होते हैं और यह पहले सी # इंटेलिजेंस में दिखाई देता है।

दोनों विधियां मान्य हैं, लेकिन मैं लोगों को सस्ते विधि को कॉल करने के लिए प्रोत्साहित करना चाहता हूं। लेकिन लोग कॉल करने के तरीके को चुनने से पहले इंटेलिसेंस में सभी अधिभारों को नहीं देख पाते हैं, और महंगे को अक्सर मेरी कंपनी के कोडबेस में बुलाया जा रहा है।

क्या विजुअल स्टूडियो को किसी विशेष विधि को "इंटेलिजेंस प्राथमिकता" देने के लिए कहने का कोई तरीका है, तो यह पहले दिखाई देता है?

+1

आपके साधारण प्रश्न के बारे में पता नहीं है, लेकिन इस विशेष मामले शायद जैसे नामकरण के साथ हल किया जा सकता है महंगे संस्करण के लिए सस्ते संस्करण और QueryPrice या FetchPrice के लिए GetPrice (संकेत है कि यह किसी डेटाबेस से बात करने जा रहा है)। सिर्फ एक विचार। – itowlson

+1

और यदि आपको अनुकूलता के लिए महंगे अधिभार को रखने की आवश्यकता है, तो इसे Intellisense से छिपाने के लिए इसे EditorBrowsableAttribute (EditorBrowsableState.Never) के साथ चिह्नित करें। – itowlson

+0

मुझे वहां तीन डेटाबेस कॉल करने के ज्ञान के बारे में आश्चर्य होगा। निश्चित रूप से आप एक प्रश्न लिख सकते हैं जो केवल एक बार डेटाबेस को मारते समय आपको आवश्यक सभी डेटा देता है। –

उत्तर

0

ऐसा मत सोचो।

जब तक आप एक इंटेलिजेंस प्लगइन (जैसे रिशेर्पर) लिखते हैं और डिफ़ॉल्ट इंटेलिजेंस को हाइजैक करते हैं और उपयोगकर्ताओं को प्राथमिकता देने के लिए एक प्रोग्राम बनाते हैं।

+0

खैर, मुझे लगता है कि वह स्रोत फ़ाइल में परिभाषित करने के लिए [संपत्ति] की तरह कुछ प्राप्त कर रहा है, जिसे इंटेलिसेंस "संकेत" के रूप में परिभाषित किया गया है, जिसके लिए अधिभार प्राथमिकता लेता है। –

1

यह क्या होता है:

  • आप सदस्य टाइप करें या इसे सूची में उजागर के रूप में, एक अधिभार आप देख कोड में पहले सूचीबद्ध एक है।
  • सदस्य को स्वीकार करने के बाद और कोष्ठक के अंदर हैं, तो आदेश कम से कम से अधिक पैरामीटर की संख्या के आधार पर प्रतीत होता है।

आप क्या कर रहा है कर रही है, भार के के बजाय, सदस्यों शुरुआत में ही है और अंत में विभिन्न नामकरण (GetMake बनाम GetMakeSlow, लेकिन स्पष्ट रूप से कुछ है कि तुलना में बेहतर) पर विचार हो सकता है ताकि वे Intellisense में एक साथ दिखाई लेकिन यह संचारित है जिसे आप उपयोग करना चाहिए।

अन्यथा, उन्हें सही ओवरलोड करें लेकिन धीमी गति पर स्पष्ट चेतावनी देने के लिए XML दस्तावेज़ का उपयोग करें।

+1

मैंने सोचा कि मुझे भी याद आया लेकिन एक त्वरित परीक्षण कम पैरा = पहले दिखाता है। –

0

केवल समाधान मैं पेशकश कर सकते हैं टिप्पणी है, लेकिन इसका मतलब यह नहीं उपयोगकर्ता उन्हें ध्यान देना होगा:

/// <summary> 
    /// This method should be used as a last resort... 
    /// </summary> 
    /// <param name="vinNumber"></param> 
    /// <returns></returns> 
    public int GetPrice(string vinNumber) 
    { 
     ... 
    } 

    /// <summary> 
    /// This is the preferred method... 
    /// </summary> 
    /// <param name="make"></param> 
    /// <param name="model"></param> 
    /// <param name="year"></param> 
    /// <returns></returns> 
    public int GetPrice(string make, string model, int year) 
    { 
     ... 
    } 

संपादित करें: मैं इस एक यह कोई फर्क नहीं था की कोशिश की:

class Class1 
{ 
    public static void Method(int value1) { } 
    public static void Method(int value1, int value2) { } 
    public static void Method(int value1, int value2, int value3) { } 
} 

class Class2 
{ 
    public static void Method(int value1, int value2, int value3) { } 
    public static void Method(int value1, int value2) { } 
    public static void Method(int value1) { } 
} 
2
  1. एक्सएमएल टिप्पणियों में सारांश टैग इंटेलिजेंस में दिखाई देता है।
  2. आप अप्रचलित टैग के साथ विधि को सजाने के लिए, जो सेटिंग के आधार पर एक चेतावनी या त्रुटि उत्पन्न करेगा।

    [System.Obsolete("use GetPrice(make, model, year)")] 
    
+0

सारांश Intellisense में दिखाया गया है, लेकिन टिप्पणी नहीं है। (दोनों जेनरेट किए गए दस्तावेज में दिखाई देंगे।) इसके अलावा, # चेतावनी चीज एक अच्छा विकल्प नहीं लगती है, क्योंकि यह मूल विधि में एक चेतावनी के रूप में दिखाई देती है, न कि जहां इसे कहा जाता है। –

+0

Kyralessa, मैंने सोचा था कि टिप्पणी टैग Intellisense का हिस्सा था, लेकिन अभी परीक्षण किया और पुष्टि की कि वे नहीं हैं। चेतावनी पर अच्छा बिंदु, अप्रचलित मार्ग उस मार्ग के लिए जाने का तरीका है। इनपुट के लिए धन्यवाद, मैंने अपना जवाब संपादित किया। – phloopy

+0

[अप्रचलित] विशेषता उपयोगकर्ता को चेतावनी देगी, लेकिन इंटेलिसेंस ऑर्डरिंग को प्रभावित नहीं करती है (कम से कम मेरे विजुअल स्टूडियो 2012 में नहीं)। – yoyo