2013-03-27 5 views
7

क्या यह सुनिश्चित करने का एक और शानदार तरीका है कि कन्स्ट्रक्टर को हमेशा कम से कम एक मूल्य के साथ बुलाया जाता है जो मुझे मिला है? मैंने इसे इस तरह से किया है क्योंकि यदि कोई मान प्रदान नहीं किया जाता है तो मैं एक कंपाइलर त्रुटि चाहता हूं।सी # पैराम्स आवश्यक न्यूनतम मूल्य के साथ

public class MyClass 
{ 
    private readonly List<string> _things = new List<string>(); 
    public string[] Things { get { return _things.ToArray(); } } 

    public MyClass(string thing, params string[] things) 
    { 
     _things.Add(thing); 
     _things.AddRange(things); 
    } 
} 

संपादित

टिप्पणियों के आधार पर, मैं इस के लिए कोड बदल गए हैं ... कोड संपादित करने से पहले करने की कोशिश में के लिए

public class Hypermedia : Attribute 
{ 
    private readonly Rel[] _relations; 
    public IEnumerable<Rel> Relations { get { return _relations; } } 

    public Hypermedia(Rel relation, params Rel[] relations) 
    { 
     var list = new List<Rel> {relation}; 
     list.AddRange(relations); 
     _relations = list.ToArray(); 
    } 
} 

क्षमा याचना छुपाएं जो मैं करने की कोशिश कर रहा था। सीधे मेरे कोड संपादक से पेस्ट करना आसान है!

+0

कार्यान्वयन विस्तार के रूप में करने के लिए एकमात्र अन्य _tiny_ बिट संभावित आकार बदलने से बचने के लिए कुल लंबाई के लिए '_things List ' को तुरंत चालू करना है: '_things = new list (चीजें। लम्बाई + 1);' लेकिन यह सिर्फ एक मामूली अनुकूलन है (संभवतः कोई अंतर नहीं)। हस्ताक्षर परिवर्तन के लिए, मुझे ऐसा नहीं लगता है। (लेकिन ध्यान दें कि यह हस्ताक्षर इसे दर्दनाक बनाता है अगर सरणी को रन-टाइम पर उत्पन्न करना और संकलन-समय पर 'पैराम्स' का उपयोग न करना चाहते हैं; आपको पहले सरणी तत्व को अलग करना होगा और एक संपूर्ण निर्माण करना होगा शेष पैरामीटर के लिए दूसरी सरणी) –

+3

कॉलर अभी भी 'null' को' thing' –

+0

@Tim के रूप में पास कर सकता है - मुझे नहीं लगता कि मेरे पास सिर्फ पैरा हैं, मैं बल देने के लिए "चीज़" पैरामीटर जोड़ रहा हूं संकलक त्रुटि जब कोई पैरामीटर प्रदान नहीं किया जाता है। –

उत्तर

-3

मेरा मानना ​​है कि आप RequiredAttribute (.NET 3.5 के बाद से उपलब्ध है)

अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx देखें के लिए देख रहे हैं।

+2

क्या यह फॉर्म/इनपुट/डेटाबेस सत्यापन के लिए नहीं है? कोड अनुबंधों के लिए –

13

Code Contracts के बारे में क्या?

public MyClass(params string[] things) 
{ 
    Contract.Requires(things != null && things.Any()); 
    _things.AddRange(things); 
} 

कोड ठेके अपने कोड, संकलन समय विश्लेषण के लिए एक स्थिर विश्लेषक, और एक क्रम विश्लेषक अंकन के लिए कक्षाओं में शामिल हैं।

कम से कम आपको स्थिर विश्लेषक से चेतावनी मिल जाएगी। और आप प्रदर्शन हिट से बचने के लिए रिलीज मोड में रनटाइम विश्लेषण बंद कर सकते हैं।

+1

+1 .. !! –

+0

जानना उपयोगी है, लेकिन काफी कुछ नहीं जो मैं बाद में था। –

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