2010-08-25 14 views
8

मैं अपनी सी # .NET परियोजनाओं में से किसी एक के साथ कुछ नैदानिक ​​लॉगिंग कर रहा हूं और मैं एक पहचानकर्ता को लॉग इन करने में सक्षम होना चाहता हूं जो कक्षा के विशिष्ट उदाहरण को दर्शाता है। मुझे पता है कि मैं इसे एक स्थैतिक चर के साथ कर सकता हूं जो क्लास इंस्टेंस बनने पर हर बार बढ़ता जा रहा है, लेकिन मैं सोच रहा हूं कि ऐसा करने के लिए .NET ढांचे में कोई अंतर्निहित तरीका है या नहीं। शायद प्रतिबिंब या कुछ का उपयोग कर।क्या कक्षा के उदाहरणों की पहचान करने के लिए कोई अंतर्निहित तरीका है?

+0

इस प्रश्न पर चर्चा आपकी मदद कर सकती है। http://stackoverflow.com/questions/750947/net-unique-object-identifier –

उत्तर

5

बस क्या Henk said in his answer के बारे में GetHashCode, और नकारात्मक टिप्पणी वह उस जवाब पर प्राप्त हुई कुछ कम करने के लिए में जोड़ने के लिए इस पर ध्यान दिए बिना कि इसके प्रकार GetHashCode पर ओवरराइड किया गया है या नहीं।

System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode पर एक नज़र डालें।

यह मान निश्चित रूप से अद्वितीय होने की गारंटी नहीं है। न तो Guid है (हालांकि उस के लिए अद्वितीय होने के लिए अनजान रूप से सूक्ष्मदर्शी हैं)।

मैं कहूंगा कि आपका आंत स्थिर काउंटर वैरिएबल के बारे में सही था। मुझे उल्लेख करना चाहिए, हालांकि, प्रत्येक ऑब्जेक्ट के कन्स्ट्रक्टर में ++ ऑपरेटर का उपयोग करके इसे आसानी से बढ़ाना थ्रेड-सुरक्षित नहीं है। यदि यह संभव है तो आप कई धागे से कक्षा के उदाहरणों को तत्काल कर सकते हैं, आप इसके बजाय Interlocked.Increment का उपयोग करना चाहते हैं।

+0

दिलचस्प लिंक। –

3

सबसे नज़दीकी बात GetHashCode() है, लेकिन यह अद्वितीय होने की गारंटी नहीं है। यह आमतौर पर निदान के लिए पर्याप्त होगा।

मैंने अभी इस similar question के उत्तरों को पढ़ा है। जेएस के मुताबिक गेथैशकोड को पहली कॉल के लिए सिंकब्लॉक आवंटित करने का ओवरहेड है। यह एक समस्या हो सकती है।

+0

क्या उदाहरण से उदाहरण के लिए GetHashcode बदल जाता है? यदि वस्तुओं एक-दूसरे के बराबर होती हैं तो इसे बदलना नहीं चाहिए। – Zebi

+2

एक ही मूल्य के साथ शुरू की गई एक ही कक्षा के दो उदाहरणों को उसी हैश कोड को वापस करना होगा, इसलिए यह वास्तव में बिल्कुल काम नहीं करेगा। –

+1

@ जोन बी: ​​यह केवल कुछ कक्षाओं (जैसे स्ट्रिंग) के लिए सच है जो गेथैशकोड() को ओवरराइड करते हैं। डिफ़ॉल्ट संस्करण System.Object का हिस्सा है और आपके सदस्यों को नहीं देख सकता है। कोशिश करो। –

0

शायद Object.ReferenceEquals आपकी समस्या हल करता है। कम से कम यह आपको बता सकता है कि कोई वस्तु किसी अन्य के समान है या नहीं।

आप स्थिर चर का उपयोग नहीं कर सकते क्योंकि यह प्रत्येक उदाहरण में समान होगा। यह सिर्फ बनाई गई वस्तुओं की गिनती होगी।

आपके पास जॉन बी के समाधान का उपयोग करने की संभावना है या यदि आप संख्यात्मक पहचानकर्ता एक स्थिर काउंटर का उपयोग करते हैं और किसी आईडी को आईडी निर्दिष्ट करते हैं।

public class Foo 
{ 
    static int counter; 
    public int InstanceId; 

    public Foo() 
    { 
     InstanceId = counter++; 
    } 
} 
+0

मुझे यकीन है कि आप अपने आखिरी हिस्से में जो वर्णन करते हैं वह वही है जो ओपी का मतलब है "स्थिर चर" (जो 'काउंटर' होगा)। –

7

आप अपने वर्ग के लिए एक Guid संपत्ति जोड़ने के एक निर्माता (प्रत्येक उदाहरण के लिए अद्वितीय गारंटी) में यह प्रारंभ कर सकते हैं।

एक तरह से पर GetHashCode कॉल करने के लिए किसी भी उद्देश्य यह है कि वस्तु के मूल्य से स्वतंत्र है कि नहीं है:

+2

इस तकनीक को कुछ बार इस्तेमाल किया। आप अपने कन्स्ट्रक्टर को डिबगिंग सामग्री को साफ रखने के लिए सीधे 'फ़ील्ड' सार्वजनिक ग्रिड इंस्टेंस आईडी = GUID.NewGuid(); 'को सीधे शुरू कर सकते हैं। – Zebi

+0

यह एक स्थिर काउंटर का उपयोग करने से कहीं ज्यादा आसान या सुविधाजनक नहीं है। यह आंखों पर बहुत कठिन है। –

+0

आप एक स्थिर काउंटर का उपयोग कैसे करेंगे? यह प्रत्येक उदाहरण में समान होगा क्योंकि यह स्थैतिक है। क्या मैं गलत हूँ? – Zebi

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

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