2010-01-14 12 views
16

मेरे पास कुछ कक्षाएं हैं जिन्हें मैं किसी विशेष विशेषता के साथ टैग करना चाहता हूं। मेरे मन में दो दृष्टिकोण हैं। एक विशेषता-विस्तार वर्ग का उपयोग करना शामिल है। अन्य एक खाली इंटरफ़ेस का उपयोग करता:टैगिंग कक्षाओं के लिए इंटरफ़ेस या विशेषताएँ?

गुण

public class FoodAttribute : Attribute { } 

[Food] 
public class Pizza { /* ... */ } 

[Food] 
public class Pancake { /* ... */ } 

if (obj.IsDefined(typeof(FoodAttribute), false)) { /* ... */ } 

इंटरफ़ेस

public interface IFoodTag { } 

public class Pizza : IFoodTag { /* ... */ } 
public class Pancake : IFoodTag { /* ... */ } 

if (obj is IFoodTag) { /* ... */ } 

मैं विशेषताओं का उपयोग करने में संकोच कर रहा हूँ प्रतिबिंब के अपने उपयोग के कारण। उसी समय, हालांकि, मैं एक खाली इंटरफ़ेस बनाने में संकोच कर रहा हूं जो वास्तव में केवल एक टैग के रूप में कार्यरत है। मैंने दोनों का तनाव परीक्षण किया है और दोनों के बीच का समय अंतर केवल तीन मिलीसेकंड है, इसलिए प्रदर्शन यहां पर नहीं है।

+0

बस सोच, यदि कोई वस्तु भोजन है तो आप क्या करते हैं? यदि IFood इंटरफ़ेस खाली है, तो आप उन्हें किस प्रकार अंतर करते हैं? ... – serhio

+0

यदि ऑब्जेक्ट भोजन है, तो मैं FoodEventArguments वापस कर दूंगा। यदि वस्तु थी, कहो, पेय, मैं DrinkEventArguments वापस आऊंगा। असल में, एक सामान्य बेस क्लास है (मान लें कि रियायतस्टैंड इटिम) जो फ़ंक्शन में पास हो जाती है। – Scott

+0

यह भी देखें: http://blogs.msdn.com/ericlippert/archive/2009/02/02/properties-vs-attributes.aspx –

उत्तर

14

अच्छी तरह से, विशेषताओं के साथ, आप हमेशा इस तरह से विशेषता बना सकते हैं कि इसका कार्य स्वचालित रूप से वंश प्रकारों में प्रचारित नहीं होता है।

इंटरफेस के साथ, यह संभव नहीं है।

मैं विशेषताओं के साथ जाऊंगा।

+0

+1, यह भी बिंदु है कि मैं अपने उत्तर में चूक गया। – Restuta

+1

माइक्रोसॉफ्ट भी इसकी सिफारिश करता है लेकिन वे कई स्थानों पर अपनी सिफारिशों से अलग हो गए हैं। (उदाहरण के लिए ASP.NET में 'IRequiresSessionState' और 'IReadOnlySessionState')। –

+1

ISerializable, मुझे पता है। –

5

आपने शायद अपने आप से सवाल किया है। विशेषताएं यहां अधिक तार्किक हैं, प्रतिबिंब लाल EYES के साथ एक बड़ा मोनस्टर नहीं है =)

बीटीडब्ल्यू, क्या आप कॉलिंग कोड दिखा सकते हैं, जहां आप इंटरफ़ेस प्रकारों के साथ चिह्नित निर्धारित करते हैं? क्या आप वहां प्रतिबिंब का उपयोग नहीं कर रहे हैं?

+3

+1! –

+1

नहीं, मैं सिर्फ यह जांचने के लिए 'is' ऑपरेटर का उपयोग कर रहा हूं कि दिया गया ऑब्जेक्ट इंटरफ़ेस के साथ चिह्नित है ('इंटरफ़ेस' उदाहरण की अंतिम पंक्ति देखें)। – Scott

+0

धन्यवाद, मैं अब देखता हूं। – Restuta

0

इस मामले में, जैसा कि आप कहते हैं, आप एक इंटरफेस का सही ढंग से उपयोग नहीं कर रहे हैं।

प्रतिबिंब का उपयोग करने में क्या गलत है आप गुण प्राप्त करते हैं? सामान्य उत्तर प्रदर्शन होता है लेकिन आमतौर पर लगभग सभी मामलों में यह वास्तविक समस्या नहीं है।

7

मुझे अन्यथा कहना होगा। मुझे लगता है कि, आपके उदाहरण के लिए, एक मार्कर इंटरफ़ेस अधिक समझ में आता है।

ऐसा इसलिए है क्योंकि ऐसा लगता है कि यह बहुत है कि आप एक दिन कुछ सदस्यों को IFood पर जोड़ सकते हैं।

आपका डिजाइन इस तरह शुरू होता है:

interface IFood {} 

लेकिन तब आप कुछ जोड़ने का निर्णय:

interface IFood { 
    int Calories { get; } 
} 

भी other ways इंटरफेस विस्तार करने के लिए कर रहे हैं:

static class FoodExtensions { 
    public static void Lighten(this IFood self) { 
    self.Calories /= 2; 
    } 
} 
संबंधित मुद्दे