2010-06-30 16 views
7

मैं एक वर्ग को प्रारंभ करने में सक्षम होना चाहता हूं जैसे कि मैं एक स्ट्रिंग शुरू करता हूं:मैं सी # में कक्षा कैसे बना सकता हूं कि मैं एक स्ट्रिंग की तरह आरंभ कर सकता हूं?

string str = "hello"; 
MyClass class = "hello"; 

मुझे वास्तव में पता नहीं है कि वास्तव में string str = "hello"; क्या करता है। मुझे लगता है कि "hello" को new System.String("hello"); में कंपाइलर द्वारा अनुवादित किया जाता है लेकिन मुझे यकीन नहीं है। शायद यह संभव नहीं है या शायद मुझे कुछ बहुत ही मौलिक याद आ रही है; अगर यह मामला मेरी अज्ञानता बहाना है :)। जो मैं बनाने की कोशिश कर रहा हूं वह एक वर्ग है जो एक स्ट्रिंग की तरह काम करता है लेकिन स्ट्रिंग को स्वचालित रूप से फ़ाइल में संग्रहीत करता है।

ठीक है, जवाब देने के बाद मेरा कोड यहां है:

class StringOnFile 
{ 
    private static string Extension = ".htm"; 
    private string _FullPath; 
    public bool Preserve = false; 

    public string FullPath 
    { 
     get 
     { 
      return _FullPath; 
     } 
    } 

    public static implicit operator StringOnFile(string value) 
    { 
     StringOnFile This = new StringOnFile(); 
     int path = 0; 

     do{ 
      path++; 
      This._FullPath = Path.GetFullPath(path.ToString() + Extension); 
     } 
     while(File.Exists(This._FullPath)); 

     using (StreamWriter sw = File.CreateText(This._FullPath)) 
     { 
      sw.Write(value); 
     } 

     return This; 
    } 

    public static implicit operator string(StringOnFile stringOnFile) 
    { 
     using (StreamReader sr = File.OpenText(stringOnFile._FullPath)) 
     { 
      return sr.ReadToEnd(); 
     } 
    } 

    ~StringOnFile() 
    { 
     if(!Preserve) File.Delete(FullPath); 
    } 
} 

आपको क्या लगता है?

+0

ओह, और वैसे, कोड को गैर कोड वाक्य के अंदर कोड बनाने का कोई तरीका है (मैं अब इस मंच के बारे में बात कर रहा हूं) (जैसे कोड "हैलो "वाक्य के अंदर" मुझे लगता है कि "हैलो" अनुवादित हो जाता है ... "मेरे प्रश्न में) मेरे प्रश्न में कोड की दो पंक्तियों की तरह रंग हैं? – Juan

+0

"मुझे लगता है कि" हैलो "का उपयोग नए सिस्टम में कंपाइलर द्वारा किया जाता है। स्ट्रिंग (" हैलो ") '" - नहीं, स्ट्रिंग अक्षर बहुत कम स्तर पर .NET रनटाइम में बनाए जाते हैं। सी # में "हैलो" 'आईएल में एक 'ldstr" हैलो "निर्देश के अनुरूप है। –

+0

तो हम कह सकते हैं कि स्ट्रिंग क्लास में ldstr के लिए एक निहित रूपांतरण है (मुझे लगता है कि एक स्ट्रिंग युक्त एक मेमरी ब्लॉक के लिए एक सूचक है)? मैं बस इस से समझने की कोशिश कर रहा हूं। सामान्य नियम क्या है, यह पता लगाना चाहते हैं, जब तक कि 'string str = "somthing" के लिए कोई सामान्य नियम न हो; "और उस मामले में शिकायतकर्ता क्या करता है, यह केवल उस मामले के लिए करता है। – Juan

उत्तर

8

प्रयास करें निम्नलिखित

class MyClass { 
    public static implicit operator MyClass(string value) { 
     // Custom logic here 
     return new MyClass(); 
    } 
} 

void Example() { 
    MyClass v1 = "data"; 
} 

यह अंत आप देख रहे हैं परिणाम मिल जाएगा। हालांकि मैं इस दृष्टिकोण के खिलाफ सलाह दूंगा। निहित रूपांतरणों के साथ कई नुकसान हैं जो आप अंत में भाग लेंगे। string

+4

या निश्चित रूप से एक स्थैतिक विधि - जो स्ट्रिंग के अपेक्षित अर्थ के रूप में अधिक जानकारीपूर्ण हो सकती है: 'FromName' आदि। यह एक ही पैरामीटर के साथ कई विधियों को भी अनुमति देता है लेकिन अलग-अलग अर्थों के साथ।अंतिम सलाह के लिए –

+0

+1: यह एक सीटीआर रखने के लिए बेहतर और स्पष्ट है जो एक स्ट्रिंग लेता है, लेकिन इसका उपयोग केवल तभी होता है जब यह अर्थपूर्ण रूप से समझ में आता है, यानी, स्ट्रिंग * ऑब्जेक्ट बनाने * में एक महत्वपूर्ण आवश्यक हिस्सा होना चाहिए। – Abel

5

खैर से implicity रूपांतरण लागू करने की आवश्यकता है ... लेकिन मैं व्यक्तिगत रूप से शायद ही कभी ऐसा होता है। एक वर्ग का एक उदाहरण है कि XNamespace LINQ से XML तक है। क्या आपकी कक्षा वास्तव में है बस एक स्ट्रिंग सदस्य है? यदि ऐसा है, तो शायद यह उपयुक्त है। या हो सकता है कि इसमें केवल एक स्ट्रिंग और कुछ अन्य फ़ील्ड हों जिन्हें आमतौर पर डिफॉल्ट किया जा सके ... लेकिन में मामलों में, मुझे उचित होने के लिए string से रूपांतरण की उम्मीद नहीं होगी।

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

और नहीं, संकलक "हैलो" new System.String("hello") में अनुवाद नहीं करता है - कि बस, एक पुनरावर्ती समस्या का कारण होता है, ज़ाहिर है, के साथ-साथ होना शामिल तोड़ने। आईएल स्ट्रिंग स्थिरांक के लिए सीधा समर्थन है, जो सी # कंपाइलर उपयोग करता है।

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