2016-10-11 12 views
14

के लिए वैकल्पिक ऐरे पैरामीटर मुझे पता है कि यह null का उपयोग करके किया जा सकता है, इसलिए मेरे पास इसके लिए एक कामकाज है, लेकिन मैं सोच रहा था कि क्या एक बेहतर तरीका है कि मेरे पास कक्षा के लिए वैकल्पिक int[] पैरामीटर हो सकता है?सी # कक्षा

class PriceLevels 
{ 
    public int[] priceLevels { get; } 
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 }; 

    public PriceLevels(int[] newPriceLevels = defaultPriceLevels) 
    { 
     priceLevels = newPriceLevels; 
    } 
} 

यह मैं हूँ हुए कहा कि यह गलत अभिव्यक्ति defaultPriceLevels निरंतर होना चाहिए है एक त्रुटि देता है। मैं इसे कैसे ठीक करूं?

एक वैकल्पिक हल है कि मैं यह कर सकते हैं बात यह है, लेकिन मैं वास्तव में समाधान

class PriceLevels 
{ 
    public int[] priceLevels { get; } 
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 }; 

    public PriceLevels(int[] newPriceLevels = null) 
    { 
     if(newPriceLevels == null) 
      priceLevels = defaultPriceLevels; 
     else 
      priceLevels = newPriceLevels; 
    } 
} 
+2

(http [एक वैकल्पिक पैरामीटर का डिफ़ॉल्ट मान के रूप में एक खाली सरणी पासिंग] की – kurakura88

+0

संभावित डुप्लिकेट ओवरलोडिंग उपयोग के सबसे करीब है: // stackoverflow .com/प्रश्न/3480382/गुजरने-एक-खाली-सरणी-डिफ़ॉल्ट-मान-के-वैकल्पिक-पैरामीटर के रूप में) –

+0

आपकी 'मूल्य सीमा' संपत्ति का कोई सेटटर क्यों नहीं है? –

उत्तर

16

पसंद नहीं का एक बेहतर डिजाइन सब एक साथ 2 कंस्ट्रक्टर्स (constructor overload) एक है कि एक हो जाता है के लिए किया जाएगा int[] और दूसरा जो नहीं करता है:

class PriceLevels 
{ 
    public int[] priceLevels { get; set; } 
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 }; 

    public PriceLevels() 
    { 
     priceLevels = defaultPriceLevels; 
    } 

    public PriceLevels(int[] newPriceLevels) 
    { 
     priceLevels = newPriceLevels; 
    } 
} 

यदि नहीं, तो पता नहीं है अगर मैं फोन करता हूँ इस "बेहतर" लेकिन आप params keyword उपयोग कर सकते हैं:

class PriceLevels 
{ 
    public int[] priceLevels { get; set; } 
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 }; 

    public PriceLevels(params int[] newPriceLevels) 
    { 
     priceLevels = newPriceLevels.Length == 0 ? defaultPriceLevels : newPriceLevels; 
    } 
} 

इसके अलावा, डिजाइन के आधार पर, मैं नहीं आश्वस्त हूँ कि यह तय करने के लिए क्या डिफ़ॉल्ट मान PriceLevels जिम्मेदारी है और शायद यह किसी भी मामले में एक निर्भरता के रूप में मिलना चाहिए - SOLID और Dependency Injection देखें। फिर आपके पास केवल 1 कन्स्ट्रक्टर होगा:

class PriceLevels 
{ 
    public int[] priceLevels { get; set; } 

    public PriceLevels(int[] newPriceLevels) 
    { 
     priceLevels = newPriceLevels; 
    } 
} 
+0

इसके अलावा ' कीमत लेवल की संपत्ति में सेटटर होना चाहिए। –

+0

अपने आप पर नल-कोलेसिंग ऑपरेटर इसे 'बेहतर' बनाता है! –

+0

धन्यवाद, मुझे लगता है कि मैं शायद आपके अंतिम सुझाव के साथ जाऊंगा और अपनी संरचना को फिर से सोचूंगा। इसके अलावा, इस सेटर चीज के बारे में उत्सुक ... यह क्यों जरूरी है कि मेरे पास एक सेटर है (भले ही यह निजी है) यदि मैं कर रहा हूं तो कक्षा के आरंभिक होने पर वह मूल्य निर्धारित कर रहा है? – Adjit

9

आप अपने कन्स्ट्रक्टर को अधिभारित कर सकते हैं।

class PriceLevels 
{ 
    public int[] priceLevels { get; private set; } 
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 }; 

    public PriceLevels() 
    { 
     priceLevels = defaultPriceLevels; 
    } 

    public PriceLevels(int[] newPriceLevels) 
    { 
     priceLevels = newPriceLevels; 
    } 
} 
+1

इसके अलावा कीमत लेवल संपत्ति में सेटर होना चाहिए। –

+0

एक निजी सेटर जोड़ा गया। धन्यवाद। –

+2

यदि सी # 6.0 निजी सेट अनावश्यक है तो मूल्य केवल कन्स्ट्रक्टर में सेट किया गया है। –

7

आप कोई पैरामीटर है कि सिर्फ अपने defaultPriceLevels निर्माता आपके पास पहले से चर से होकर गुजरेगा के साथ एक और निर्माता बना सकते हैं? आपको चर को स्थिर भी बदलना होगा।

उदा

class PriceLevels 
{ 
    public int[] priceLevels { get; } 
    private static int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 }; 

    public PriceLevels(int[] newPriceLevels = null) 
    { 
     if (newPriceLevels == null) priceLevels = defaultPriceLevels; 
     else priceLevels = newPriceLevels; 
    } 

    public PriceLevels() : this(defaultPriceLevels) 
    { } 
} 
+0

@ डोंडवेई आप निश्चित रूप से ऐसा कर सकते हैं। इसे linqpad में आज़माएं। – Mathew

+0

: क्षमा करें मुझे आपके बदले ओपी को जो पेस्ट करना चाहिए उसे पेस्ट करना चाहिए :) – xqMogvKW

+1

इस समाधान को पसंद किया गया है लेकिन आपको कन्स्ट्रक्टर्स में से एक में 'newPriceLevels' वैकल्पिक नहीं बनाना चाहिए, जो कि मेरे विचार में कोई लाभ नहीं है +1 –

4

बस निर्माता की एक अधिभार बनाने! यह कोड की एक पंक्ति के साथ वास्तव में आसानी से किया जा सकता है!

public PriceLevels() : this(defaultPriceLevels) { } 

फिर, मूल निर्माता से डिफ़ॉल्ट पैरामीटर मान निकालें:

public PriceLevels(int[] newPriceLevels) 

असल में, आप भी static रूप defaultPriceLevels घोषित करने के लिए की जरूरत है। उम्मीद है कि आपको यह बुरा नहीं लगेगा।

3

सी # में वैकल्पिक सरणी पैरामीटर संभव नहीं हैं। MSDN

प्रत्येक वैकल्पिक पैरामीटर की परिभाषा के हिस्से के रूप में एक डिफ़ॉल्ट मान है। यदि उस पैरामीटर के लिए कोई तर्क नहीं भेजा गया है, तो डिफ़ॉल्ट मान का उपयोग किया जाता है। एक डिफ़ॉल्ट मान निम्न प्रकार के अभिव्यक्तियों में से एक होना चाहिए:

  • निरंतर अभिव्यक्ति;
  • नए वैलटाइप() के रूप में एक अभिव्यक्ति की अभिव्यक्ति, जहां वैलटाइप एक मान प्रकार है, जैसे कि एनम या स्ट्रक्चर;
  • फॉर्म डिफ़ॉल्ट (वैलटाइप) की अभिव्यक्ति, जहां वैलटाइप एक मान प्रकार है।

इसलिए एक "वैकल्पिक हल" का इस्तेमाल किया जाना है। या तो शून्य के लिए जांचें (जैसा कि आपने सुझाव दिया है) या आप एक डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग कर सकते हैं।

7

भीड़ :) में एक अन्य विकल्प है, जो अपने मूल कोड

class PriceLevels 
{ 
    public int[] priceLevels { get; set; } 

    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 }; 

    public PriceLevels(int[] newPriceLevels = null) 
    { 
    priceLevels = newPriceLevels ?? defaultPriceLevels; 
    } 
} 
संबंधित मुद्दे