मैं अपनी सी # .NET परियोजनाओं में से किसी एक के साथ कुछ नैदानिक लॉगिंग कर रहा हूं और मैं एक पहचानकर्ता को लॉग इन करने में सक्षम होना चाहता हूं जो कक्षा के विशिष्ट उदाहरण को दर्शाता है। मुझे पता है कि मैं इसे एक स्थैतिक चर के साथ कर सकता हूं जो क्लास इंस्टेंस बनने पर हर बार बढ़ता जा रहा है, लेकिन मैं सोच रहा हूं कि ऐसा करने के लिए .NET ढांचे में कोई अंतर्निहित तरीका है या नहीं। शायद प्रतिबिंब या कुछ का उपयोग कर।क्या कक्षा के उदाहरणों की पहचान करने के लिए कोई अंतर्निहित तरीका है?
उत्तर
बस क्या Henk said in his answer के बारे में GetHashCode
, और नकारात्मक टिप्पणी वह उस जवाब पर प्राप्त हुई कुछ कम करने के लिए में जोड़ने के लिए इस पर ध्यान दिए बिना कि इसके प्रकार GetHashCode
पर ओवरराइड किया गया है या नहीं।
System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode
पर एक नज़र डालें।
यह मान निश्चित रूप से अद्वितीय होने की गारंटी नहीं है। न तो Guid
है (हालांकि उस के लिए अद्वितीय होने के लिए अनजान रूप से सूक्ष्मदर्शी हैं)।
मैं कहूंगा कि आपका आंत स्थिर काउंटर वैरिएबल के बारे में सही था। मुझे उल्लेख करना चाहिए, हालांकि, प्रत्येक ऑब्जेक्ट के कन्स्ट्रक्टर में ++
ऑपरेटर का उपयोग करके इसे आसानी से बढ़ाना थ्रेड-सुरक्षित नहीं है। यदि यह संभव है तो आप कई धागे से कक्षा के उदाहरणों को तत्काल कर सकते हैं, आप इसके बजाय Interlocked.Increment
का उपयोग करना चाहते हैं।
दिलचस्प लिंक। –
सबसे नज़दीकी बात GetHashCode()
है, लेकिन यह अद्वितीय होने की गारंटी नहीं है। यह आमतौर पर निदान के लिए पर्याप्त होगा।
मैंने अभी इस similar question के उत्तरों को पढ़ा है। जेएस के मुताबिक गेथैशकोड को पहली कॉल के लिए सिंकब्लॉक आवंटित करने का ओवरहेड है। यह एक समस्या हो सकती है।
क्या उदाहरण से उदाहरण के लिए GetHashcode बदल जाता है? यदि वस्तुओं एक-दूसरे के बराबर होती हैं तो इसे बदलना नहीं चाहिए। – Zebi
एक ही मूल्य के साथ शुरू की गई एक ही कक्षा के दो उदाहरणों को उसी हैश कोड को वापस करना होगा, इसलिए यह वास्तव में बिल्कुल काम नहीं करेगा। –
@ जोन बी: यह केवल कुछ कक्षाओं (जैसे स्ट्रिंग) के लिए सच है जो गेथैशकोड() को ओवरराइड करते हैं। डिफ़ॉल्ट संस्करण System.Object का हिस्सा है और आपके सदस्यों को नहीं देख सकता है। कोशिश करो। –
शायद Object.ReferenceEquals
आपकी समस्या हल करता है। कम से कम यह आपको बता सकता है कि कोई वस्तु किसी अन्य के समान है या नहीं।
आप स्थिर चर का उपयोग नहीं कर सकते क्योंकि यह प्रत्येक उदाहरण में समान होगा। यह सिर्फ बनाई गई वस्तुओं की गिनती होगी।
आपके पास जॉन बी के समाधान का उपयोग करने की संभावना है या यदि आप संख्यात्मक पहचानकर्ता एक स्थिर काउंटर का उपयोग करते हैं और किसी आईडी को आईडी निर्दिष्ट करते हैं।
public class Foo
{
static int counter;
public int InstanceId;
public Foo()
{
InstanceId = counter++;
}
}
मुझे यकीन है कि आप अपने आखिरी हिस्से में जो वर्णन करते हैं वह वही है जो ओपी का मतलब है "स्थिर चर" (जो 'काउंटर' होगा)। –
आप अपने वर्ग के लिए एक Guid
संपत्ति जोड़ने के एक निर्माता (प्रत्येक उदाहरण के लिए अद्वितीय गारंटी) में यह प्रारंभ कर सकते हैं।
एक तरह से पर GetHashCode
कॉल करने के लिए किसी भी उद्देश्य यह है कि वस्तु के मूल्य से स्वतंत्र है कि नहीं है:
इस तकनीक को कुछ बार इस्तेमाल किया। आप अपने कन्स्ट्रक्टर को डिबगिंग सामग्री को साफ रखने के लिए सीधे 'फ़ील्ड' सार्वजनिक ग्रिड इंस्टेंस आईडी = GUID.NewGuid(); 'को सीधे शुरू कर सकते हैं। – Zebi
यह एक स्थिर काउंटर का उपयोग करने से कहीं ज्यादा आसान या सुविधाजनक नहीं है। यह आंखों पर बहुत कठिन है। –
आप एक स्थिर काउंटर का उपयोग कैसे करेंगे? यह प्रत्येक उदाहरण में समान होगा क्योंकि यह स्थैतिक है। क्या मैं गलत हूँ? – Zebi
- 1. कक्षा के उदाहरणों की गणना?
- 2. क्या अजगर में एक पुनरावृत्त की लंबाई प्राप्त करने के लिए कोई अंतर्निहित तरीका है?
- 3. क्या XAML तत्व की सटीक प्रति (क्लोन) प्राप्त करने के लिए कोई आसान/अंतर्निहित तरीका है?
- 4. पायथन: अंतर्निहित कक्षा उदाहरणों में __dict__ विशेषता क्यों नहीं है
- 5. जावास्क्रिप्ट में ब्राउज़र टैब की पहचान करने का कोई तरीका?
- 6. क्या BufferedImage उदाहरणों की तुलना करने का कोई आसान तरीका है?
- 7. सूची में लगातार डुप्लिकेट की पहचान करने के लिए सबसे महत्वपूर्ण तरीका क्या है?
- 8. क्या file_get_contents() करने के लिए कोई जावास्क्रिप्ट तरीका है?
- 9. हास्केल - 'व्युत्पन्न' उदाहरणों के मामले के लिए पुनर्निर्मित वाक्यविन्यास को बंद करने का कोई भी तरीका?
- 10. क्या रनटाइम पर कक्षा के लिए बाइटकोड प्राप्त करने का कोई तरीका है?
- 11. क्या सी # आरक्षित शब्दों की पहचान करने के लिए कोई प्रोग्रामेटिक तरीका है? मैं जानता हूँ कि
- 12. क्या कोई कथन की स्थिति का उपयोग करने के लिए कोई तरीका है?
- 13. क्या अप्रयुक्त या पुरानी FxCop संदेश दमन की पहचान करने का कोई तरीका है?
- 14. क्या SQL सर्वर में विशिष्ट रूप से डेटाबेस की पहचान करने का कोई तरीका है?
- 15. आईफोन: क्या अप्रयुक्त संसाधनों की पहचान करने का कोई स्वचालित तरीका है?
- 16. सी # में स्थापित करने के लिए कक्षा की आवश्यकता है?
- 17. क्या अंतर्निहित कक्षाओं से उत्तराधिकारी के लिए यह सही है?
- 18. प्रदर्शित करने की पहचान
- 19. क्या कक्षा में "विकल्प" जोड़ने के लिए कोई पैटर्न है?
- 20. ईमेल के लिए अद्वितीय पहचान क्या है?
- 21. क्या एकाधिक CLLocationManager उदाहरणों का उपयोग करने के लिए कोई प्रदर्शन जुर्माना है
- 22. बुनियादी संख्या पहचान करने का सबसे अच्छा तरीका क्या है?
- 23. (रेल) क्या फ़ील्ड के डाटाटाइप की जांच करने का कोई तरीका है?
- 24. अपरिभाषित सीएसएस/एचटीएमएल कक्षाओं की पहचान करने के लिए कोई उपकरण?
- 25. क्या कक्षा के लिए कोड क्लीनअप अक्षम करने के लिए कोई पुनर्विक्रेता टिप्पणी निर्देश है?
- 26. क्या पाइथन के लिए कोई मॉड्यूल है जो चेहरे की पहचान करता है?
- 27. क्या इंस्ट्रूमेंट्स (एक्सकोड) के कमांड लाइन उदाहरणों से प्राधिकरण संकेत को हटाने का कोई तरीका है?
- 28. क्या आईएनएसईआरटी स्टेटमेंट द्वारा फ़िल्टर करने के लिए एसक्यूएल प्रोफाइलर में कोई तरीका है?
- 29. मार्कोव उत्पन्न सामग्री की पहचान करने के लिए एल्गोरिदम?
- 30. क्या सी ++ में कक्षा के बाहर बेस फ़ंक्शन कॉल करने का कोई तरीका है?
इस प्रश्न पर चर्चा आपकी मदद कर सकती है। http://stackoverflow.com/questions/750947/net-unique-object-identifier –