2016-12-20 9 views
9

मैं समझता हूं कि अज्ञात प्रकारों का अपना पूर्व परिभाषित प्रकार नहीं है। संकलन प्रकार पर कंपाइलर द्वारा टाइप असाइन किया गया है और संकलन समय पर निर्दिष्ट प्रकार के विवरण को कोड स्तर पर नहीं जाना जा सकता है; इन विवरणों को सीएलआर के लिए ही जाना जाता है। मैंने सुना है कि सीएलआर में इन अज्ञात प्रकारों का इलाज किया जाता है जैसे कि यह केवल संदर्भ प्रकार है। तो मेरा सवाल यह है कि क्या संकलित समय पर कक्षा या संरचना जैसे नए प्रकार को अज्ञात प्रकार में परिभाषित केवल पढ़ने योग्य गुणों के अनुरूप बनाया गया है?बेनामी प्रकार सी #

उत्तर

6

बेनामी प्रकार वर्ग प्रकार उस वस्तु से सीधे निकाले जाते हैं, और उस वस्तु को छोड़कर किसी भी प्रकार में ढाला नहीं जा सकता है। कंपाइलर प्रत्येक अनाम प्रकार के लिए एक नाम प्रदान करता है, हालांकि आपका एप्लिकेशन इसका उपयोग नहीं कर सकता है। सामान्य भाषा रनटाइम के परिप्रेक्ष्य से, किसी अज्ञात प्रकार किसी अन्य संदर्भ प्रकार से अलग नहीं है।

स्रोत: https://msdn.microsoft.com/en-us/library/bb397696.aspx

1

ये गुमनाम वर्गों वस्तु से सीधे प्राप्त कर रहे हैं। आम तौर पर उन्हें केवल एक ही ऑब्जेक्ट में केवल गुणों को पढ़ने के लिए चुनिंदा LINQ क्वेरीज़ में उपयोग किया जाता है।

LINQ उदाहरण (प्रथम नाम और अंतिम नाम FullName के रूप में):

public class Person { 
    public int Id {get;set;} 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 

IEnumerable<int> personIds = persons 
    .Select(p => new { Id = p.Id, FullName = p.FirstName + " " + p.LastName}) 
    .Where(a => a.FullName == "John Smith") 
    .Select(a => a.Id); 
3

कोई प्रोग्रामर-सुलभ नाम होने के अलावा, गुमनाम प्रकार बिल्कुल स्पष्ट हैं: संकलक है कि आप बनाने के कार्य के आधार पर उन्हें उत्पन्न करता है, और ख्याल रखता है एक ही विधि से एक ही रन-टाइम प्रकार में समान अनाम प्रकारों को सही ढंग से विलय करने का।

सी # भाषा विनिर्देश के अनुसार, धारा 7.6.10.6, अज्ञात प्रकार हमेशा कक्षाएं हैं, struct एस नहीं। प्रपत्र

new { p1 = e1 , p2 = e2 , ... pn = en } 

की एक अनाम ऑब्जेक्ट प्रारंभकर्ता रूप

class __Anonymous1 { 
    private readonly T1 f1 ; 
    private readonly T2 f2 ; 
    ... 
    private readonly Tn fn ; 
    public __Anonymous1(T1 a1, T2 a2,…, Tn an) { 
     f1 = a1 ; 
     f2 = a2 ; 
     ... 
     fn = an ; 
    } 
    public T1 p1 { get { return f1 ; } } 
    public T2 p2 { get { return f2 ; } } 
    ... 
    public Tn pn { get { return fn ; } } 
    public override bool Equals(object __o) { … } 
    public override int GetHashCode() { … } 
} 
+0

हालांकि * तर्कसंगत * वह कोड उत्पन्न होता है, जो वास्तव में एक काफी सरलीकरण है। मेरा जवाब देखें कि यह क्यों है। –

10

मैं समझता हूँ कि गुमनाम प्रकार का अपना कोई पूर्व निर्धारित प्रकार की एक अनाम प्रकार की घोषणा की।

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

प्रकार संकलन प्रकार पर संकलक द्वारा इसे करने के लिए असाइन किया गया है और संकलन समय पर सौंपा प्रकार के विवरण कोड स्तर

यह सही है पर जाना जाता है नहीं किया जा सकता।

ये विवरण स्वयं सीएलआर के लिए जाने जाते हैं।

मुझे नहीं पता कि आप किस "विवरण" के बारे में बात कर रहे हैं या "सीएलआर के लिए जाना जाता है" का क्या अर्थ है।

मैंने सुना है कि सीएलआर में इन अज्ञात प्रकारों का इलाज किया जाता है जैसे कि यह केवल संदर्भ प्रकार है।

आपने सही ढंग से सुना है।

तो मेरा सवाल यह है कि संकलित समय पर कक्षा या संरचना जैसे नए प्रकार को अज्ञात प्रकार में परिभाषित केवल पढ़ने योग्य गुणों के अनुरूप बनाया गया है?

हां। एक नई कक्षा बनाई गई है।

ध्यान दें कि एक असेंबली के भीतर यदि एक ही संपत्ति नाम, समान संपत्ति प्रकार के साथ दो अज्ञात प्रकार हैं, तो उसी क्रम में, केवल एक ही प्रकार बनाया गया है। यह भाषा विनिर्देश द्वारा गारंटीकृत है।

व्यायाम:

// Code in Assembly B: 
public class B { protected class P {} } 

// Code in Assembly D (references assembly B) 
class D1 : B { 
    public static object M() { return new { X = new B.P() }; } 
} 
class D2 : B { 
    public static object M() { return new { X = new B.P() }; } 
} 

आप विधानसभा डी में एक एकल वर्ग घोषणा प्रकार रक्तचाप की संपत्ति एक्स ऐसी है कि D1.M().GetType()D2.M().GetType() के बराबर है है उत्पन्न करने के लिए आवश्यक हैं। वर्णन करें कि ऐसा कैसे करें।

+0

"उसी प्रोग्राम के भीतर, दो अज्ञात ऑब्जेक्ट प्रारंभकर्ता जो समान नामों के गुणों का अनुक्रम निर्दिष्ट करते हैं और उसी क्रम में संकलन-समय प्रकार समान अनाम प्रकार के उदाहरण उत्पन्न करेंगे।" - (सी # 4.0 विनिर्देश, 7.6.10.6) – Xiaoy312

+0

@ Xiaoy312: यह सही है। अब, यदि आपको असेंबली डी में उपरोक्त अज्ञात प्रकारों के लिए ऐसा प्रकार उत्पन्न करना था, तो उस प्रकार का क्या लगता है जैसे आपको स्रोत कोड लिखना पड़ा? –

+0

अभी तक 'संरक्षित' कीवर्ड को भी नोटिस नहीं किया था। मुझे लगता है कि यह कुछ ऐसा होगा: 'सार्वजनिक अमूर्त वर्ग कंपाइलर मैजिक: बी {पब्लिक क्लास बेनामी टाइप {बीपी एक्स; सार्वजनिक बीपी एक्स {प्राप्त {वापसी एक्स; }}}} '? – Xiaoy312

1

बेनामी प्रकार एक सीए सुविधा है जो सीएलआई पर बराबर नहीं है। वे संकलक द्वारा चुने गए बहुत लंबे और बहुत जटिल नाम के साथ, सामान्य प्रकारों के लिए संकलित किए जाते हैं। ध्यान दें कि spec गारंटी देता है कि एक ही संरचना के साथ दो अज्ञात प्रकार (एक ही असेंबली के भीतर) वास्तव में एक ही प्रकार के होते हैं, इसलिए संकलक को इसे भी ध्यान में रखना होगा, और केवल एक प्रकार उत्पन्न करना होगा (और दोनों के लिए समान नाम उत्पन्न करना होगा उपयोग साइटों)।

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