2012-03-26 19 views
8

मैं सामान्य शब्दों में अपना उदाहरण phrasing कर रहा हूं क्योंकि यह मेरे विशिष्ट समस्या विवरण में बिना किसी बिंदु के पूरे बिंदु को प्राप्त करता है।स्ट्रिंग्स या अन्य सीलबंद कक्षाओं के लिए स्ट्रॉन्ग-टाइपिंग

मान लीजिए कि आपके पास पैरामीटर के रूप में तारों को लेने के तरीकों का एक समूह था। मान लीजिए कि एक स्ट्रिंग एक व्यक्ति का "पहला नाम" था और दूसरा व्यक्ति का "अंतिम नाम" था। "पसंदीदा भोजन" जैसे अन्य तार हो सकते हैं।

अब, आपके कोड में, आप रनटाइम बग ढूंढते रहते हैं क्योंकि आप पैरामीटर को मिश्रित कर रहे हैं। आप "पहला नाम" और "अंतिम नाम" का ऑर्डर स्विच कर सकते हैं या जब आप दूसरे का उपयोग करना चाहते हैं तो इसका उपयोग कर सकते हैं। दृढ़ता से टाइप की गई भाषाओं का मूल्य यह है कि यह इन बग को रनटाइम के बजाए बिल्ड समय पर मिलेगा।

तो, एक संभावित समाधान केवल स्ट्रिंग से कक्षाएं प्राप्त करना होगा।

public class FirstName : String 
{ 
} 

public class LastName : String 
{ 
} 

अब, यदि आप गलत प्रकार की स्ट्रिंग पारित करते हैं तो संकलक शिकायत करेगा। उपरोक्त संभव नहीं है क्योंकि स्ट्रिंग को सील कर दिया गया है। इसके अलावा, "उपयोग" कथन काम नहीं करेगा (मुझे लगता है) क्योंकि जब मैं उन्हें मिश्रण करता हूं तो संकलक शिकायत नहीं करेगा।

using LastName = String; 

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

+2

कृपया अपने शीर्षक "सी #" और इस तरह से उपसर्ग न करें। टैग के लिए यही है। –

+0

क्यों अधिक मजबूत टाइपिंग के साथ जीवन को कठिन बनाने के बजाय, पैरामीटर समस्याओं के चारों ओर स्विचिंग या ऑर्डर करने के लिए नामित तर्कों (सी # के वीएस -2010 संस्करण में पेश किया गया) का उपयोग क्यों नहीं करें? http://msdn.microsoft.com/en-us/library/dd264739.aspx –

उत्तर

1

वैसे ही जैसे

A-FileStreamReader : StreamReader 
B-FileStreamReader : StreamReader 
Age : int 
Phone : long 
... 
... 
SLaksPhoneNumer : string // added under pressure...  

समाधान एक और वर्गों बनाने के लिए किया जाता है, सही मापदंडों के साथ तरीकों कहते हैं, जब विधि firstName के लिए पूछना यह देने के लिए और नहीं LastName मत भूलना ...

वैसे, क्या आप (संकलन समय में या कार्याविधि में) कर रोका जा सके:

new FirstName("Skeet"); 
new LastName("Jon"); 
+2

_Phone संख्या तार हैं, longs_ – SLaks

+1

@Slaks नहीं। संपादित। हास्य ++ – gdoron

+1

"बस गलती न करें"। अब मैं इसके बारे में क्यों नहीं सोचा था: ^) – ChuckZ

0

यह बताने के लिए वास्तव में क्या आपके सवाल यह है कि मुश्किल है।

यदि आपके पास कोई विधि है, उदाहरण के लिए, इसमें 6 स्ट्रिंग पैरामीटर लगते हैं, और भविष्य में 7 ले सकते हैं, शायद आपको केवल दृढ़ता से टाइप की गई वस्तु बनाना चाहिए जिसमें प्रासंगिक 6 गुण हैं (जो भविष्य में आप कर सकते हैं 7 वें जोड़ने के लिए विस्तार - विधि पर हस्ताक्षर को संशोधित करने की आवश्यकता को रोकना)। फिर आपकी विधि केवल एक पैरामीटर को स्वीकार कर सकती है, जो आपकी दृढ़ता से टाइप की गई वस्तु है जिसमें आपकी विधि के लिए प्रासंगिक पैरामीटर शामिल हैं।

2

अब, आपके कोड में, आप रनटाइम बग ढूंढते रहते हैं क्योंकि आप पैरामीटर मिश्रित कर रहे हैं। आप "पहला नाम" और "अंतिम नाम" का ऑर्डर स्विच कर सकते हैं या जब आप दूसरे का उपयोग करना चाहते हैं तो इसका उपयोग कर सकते हैं। दृढ़ता से टाइप की गई भाषाओं का मूल्य यह है कि यह इन बग को रनटाइम के बजाए बिल्ड समय पर मिलेगा।

यह बताने के लिए कि आपका प्रश्न वास्तव में है मुश्किल है। यह देखते हुए, डेवलपर की तरफ कुछ जिम्मेदारी होनी चाहिए। वास्तव में हम यहां कितने पैरामीटर बोल रहे हैं? यदि आपके पास कुछ पैरामीटर से अधिक हैं, तो आम तौर पर इसका मतलब है कि आपको अपने कोड को दोबारा करने की आवश्यकता है। उदाहरण के लिए:

void MyMethod(string firstName, stringMiddleName, string lastName, 
string phoneNumber, string email, string country, string city, 
string state, string zipcode, string countryISO, 
string pseudonym, string title, string addressLine1, string addressLine2) 

स्पष्ट रूप से यह संकलित है।एक वस्तु ContactInfo रैपिंग बनाएं सबसे अगर उन मापदंडों के सभी नहीं, और फिर आप लिख सकते हैं:

void MyMethod(ContactInfo contact) 

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

आप, यदि VS2010 उपयोग कर रहे हैं, नामित पैरामीटर सुविधा का उपयोग कर सकते हैं। यह आपको उन्हें एक अलग क्रम में पारित करने की अनुमति देता है।

string ConcatName(string firstName, string lastName) 
{ 
    return (firstName + " " + lastName); 
} 

string myName = ConcatName(lastName: "Crosby", firstName: "Bryan") 

आउटपुट:

ब्रायन Crosby

मैं अभी भी एक नज़र अपने कोड को बारीकी से लेने के लिए और आप विधि (रों) और वर्गों refactor कर सकते हैं, तो देखना होगा

2

मुझे नहीं पता कि आपका लक्ष्य क्या है, लेकिन आप इसके बारे में गंभीर हैं :) तो एक सामान्य समाधान एक सामान्य कंटेनर वर्ग का उपयोग करना होगा। यह वास्तव में मुहरबंद वर्गों के उत्तराधिकारी से कम आरामदायक होगा।

public class Container<T> 
{ 
    public T Value { get; protected set; } 

    public Container(T value) 
    { 
     Value = value; 
    } 
} 

public class FirstName : Container<string> 
{ 
    public FirstName(string firstName) : base(firstName) { } 
} 

public class LastName : Container<string> 
{ 
    public LastName(string lastName) : base(lastName) { } 
} 

public class Age : Container<int> 
{ 
    public Age(int age) : base(age) { } 
} 

public class Program 
{ 
    public void Process(FirstName firstName, LastName lastName, Age age) 
    { 

    } 
} 
+0

आपको यह मिला। यह वही है जिसे मैं देख रहा था। – ChuckZ

+0

@ChuckZ। तो आपके पास हर उपयोग के लिए हजारों कक्षाएं होंगी? – gdoron

+0

मुझे यकीन है कि इसका उपयोग करने का एक अच्छा कारण है :) – MatthiasG