2011-06-21 9 views
9

String कक्षा में IsInterned() एक विधि है। मैं इस विधि का कभी भी उपयोग नहीं करता हूं। कृपया इस विधि के सर्वोत्तम उपयोगों को समझने में मेरी सहायता करें।स्ट्रिंग का उद्देश्य क्या है। अंतर्निहित?

+2

msft पर आधिकारिक दस्तावेज़ से संतुष्ट नहीं है? http://msdn.microsoft.com/en-us/library/system.string.isinterned.aspx – tzup

+5

@tzup: दस्तावेज़ कहते हैं कि फ़ंक्शन क्या करता है, न कि जब आप इसका उपयोग करेंगे। – Gabe

उत्तर

3

यदि आप स्ट्रिंग मान को लॉक करना चाहते हैं तो एक संभावित उपयोग होगा।

निम्नलिखित में:

string s = //get it from somewhere, e.g. a web request 
lock (s){ 
//do something 
} 

वहाँ एक समस्या है, क्योंकि वहाँ एक ही स्ट्रिंग के लिए दो अलग-अलग अनुरोध हो सकता है, लेकिन वे दोनों संरक्षित कोड दर्ज करें। ऐसा इसलिए है क्योंकि दो अलग-अलग स्ट्रिंग ऑब्जेक्ट्स हो सकती हैं जिनके समान मूल्य हैं।

हालांकि इंटर्न पूल नामक कुछ है, जो एक सारणी है जिसमें कुछ तारों का एक उदाहरण होता है (सभी शब्द उदाहरण के लिए हैं)।

आप ताला काम करने के लिए उपयोग कर सकते हैं:

string s = //get it from somewhere, e.g. a web request 
lock (string.Intern(s)){ 
//do something 
} 

इस समारोह जो रों जितना समान मान है प्रशिक्षु पूल, में एक स्ट्रिंग के लिए एक संदर्भ वापसी होगी, तो लॉक करने के लिए सुरक्षित है।

IsIntern फ़ंक्शन बस यह जांचता है कि आपके द्वारा धारित संदर्भ आंतरिक पूल पर एक स्ट्रिंग का संदर्भ है या नहीं।

+6

स्ट्रिंग पर कभी भी लॉक न करें। स्ट्रिंग्स डोमेन चुस्त हैं, यानी एक ही स्ट्रिंग इंस्टेंस कई एपडोमेन से एक्सेस किया जा सकता है, खासकर जब इंटर्न किया जाता है। नतीजा यह होगा कि एक थ्रेड एक असंबद्ध एपडोमेन में लॉक जारी होने की प्रतीक्षा कर रहा है ... बहुत बुरा प्रभाव। – MaLio

+0

स्ट्रिंग पर लॉकिंग। अंत में ताले गठबंधन होंगे! – usr

1

सी # में स्ट्रिंग अक्षर आंतरिक हैं (यानी, वे एक इंटर्न पूल में संग्रहीत हैं) ताकि शाब्दिक प्रत्येक घटना के लिए केवल एक उदाहरण हो। यदि आप अपनी खुद की भाषा (उदाहरण के लिए कुछ स्क्रिप्ट सिस्टम) बना रहे हैं, तो आप समान चीज़ उत्पन्न करने के लिए IsInterned और Intern का उपयोग कर सकते हैं।

2

Eric के पद का संदर्भ लें, मुझे लगता है कि यह सबसे अच्छा जहां प्रशिक्षु से समझाया गया है

+3

स्ट्रिंग "IsInterned" उस आलेख में प्रकट नहीं होती है। – usr

0

this पर एक नज़र डालें है। उस धागे में वास्तव में एक उपयोग मामला है।

7

ध्यान दें कि इंटर्निंग एक अनुकूलन है; यह दूसरों में वृद्धि के लिए कुछ वांछनीय गुणों में कमी का कारोबार करता है। विशेष रूप से इंटर्निंग में निम्नलिखित अच्छे गुण होते हैं:

  1. डुप्लिकेट स्ट्रिंग पर मेमोरी बर्बाद नहीं होती है।
  2. दोनों के लिए ज्ञात तारों के बीच समानता तुलना बेहद तेज़ है।
  3. इंटर्न किए जाने वाले तारों के बीच समानता तुलना अभी भी बहुत तेज है, अगर वे इंटर्न नहीं कर रहे हैं।
  4. अन्य तुलना कुछ मामलों में प्रदर्शन लाभ प्राप्त करते हैं।

यह है निम्नलिखित बुरे गुण:

  1. स्ट्रिंग्स (यदि सभी) अक्सर के रूप में एकत्र नहीं कर रहे हैं कचरा है, तो याद है कि पुन: दावा किया जा सकता है तार कि फिर से, या के लिए कभी नहीं देखा जाता है पर प्रयोग किया जाता है बहुत ज्यादा समय। (अपने सभी तारों को आंतरिक करें और आप वास्तव में गंदा स्मृति उपयोग के साथ समाप्त हो सकते हैं)।

अनुकूलन के रूप में, हम इसका उपयोग करते हैं, जहां अच्छे गुण होते हैं-बुरे वजन का वजन होता है या जहां बुरे गुण नहीं होते हैं (यदि हमें पता है कि स्ट्रिंग एप्लिकेशन के जीवनकाल के आसपास हो रही है वैसे भी, या पता है कि यह कई बार इस्तेमाल किया जाएगा, तो बुरा हिस्सा पकड़ नहीं है)।

और उसी टोकन द्वारा हम इसका उपयोग नहीं करते हैं जहां बुरे गुण बाहर होंगे-अच्छे वजन का वजन लें। (सर्वाधिक समय)।

IsInterned() का उपयोग पार्ट-वे पॉइंट खोजने के लिए किया जा सकता है।

पर विचार करें मैं एक स्ट्रिंग संपत्ति Name है:

public string Name { get; set; } 

चलो कहते हैं कि मुझे पता है कि यह एक दिया Name के साथ वस्तुओं को देखने के लिए, या एक ही Name के साथ वस्तुओं को खोजने के लिए या एक बहुत कुछ कर कोशिश अन्यथा आम है चलो इस पर समानता तुलना की। या मान लें कि मुझे पता है कि Name के साथ कई अन्य ऑब्जेक्ट्स होंगे। अथवा दोनों।

इन मामलों मैं होना शामिल पर विचार हो सकता है:

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set { _name = string.Intern(value); } 
} 
बेशक

, कि क्या यह एक अच्छा विचार था या नहीं जैसा कि ऊपर उल्लेख होना शामिल की अच्छे और बुरे गुण पर निर्भर करता है।

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set { _name = string.IsInterned(value) ?? value; } 
} 

यहाँ अगर स्ट्रिंग value पहले से ही तो प्रशिक्षु है होना शामिल की हम नीचे पक्षों को पहले से ही काम पर हैं और हम किसी भी अधिक ग्रस्त नहीं है:

के बीच का उपयोग करने और उपयोग नहीं कर संभावना है , इसलिए हम इसका लाभ उठाते हैं। लेकिन अगर value पहले से ही इंटर्न नहीं किया गया है तो हम इसका उपयोग केवल इस तरह करते हैं।

यह एक अनुकूलन भी है, जो एक अलग मामले के लिए अनुकूलित करता है। यह केवल तभी फायदेमंद होता है जब किसी अन्य कोड द्वारा देखे गए मूल्यों की उचित संख्या को इंटर्न किया जा सकता है (या क्योंकि वे असेंबली में अक्षर से मेल खाते हैं), अन्यथा यह सिर्फ लुकअप करने में समय बर्बाद कर देता है। यह शायद Intern() से कम अक्सर उपयोगी होता है जो बदले में स्ट्रिंग का उपयोग करने और इंटर्निंग को अनदेखा करने से कम उपयोगी होता है, लेकिन यह एक समय दिखाता है जब यह उपयोगी हो सकता है।

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