2010-07-15 11 views
14

तो सी ++ में, मैं ऐसा करने में सक्षम होने के लिए इस्तेमाल किया है:सी # में अंतर्निर्मित प्रकार का उपनाम कैसे करें?

typedef int PeerId; 

यह मैं एक प्रकार अधिक आत्म दस्तावेज़ीकृत करने की अनुमति देता है, लेकिन इसके साथ ही यह भी मुझे PEERID किसी भी समय एक अलग प्रकार का प्रतिनिधित्व करने की अनुमति देता सभी कोड बदलने के बिना। अगर मैं चाहता था तो मैं पीरियड को कक्षा में भी बदल सकता था। इस तरह की एक्स्टेंसिबिलिटी मैं सी # में रखना चाहता हूं, हालांकि मुझे सी # में 'int' के लिए उपनाम बनाने का तरीका समझने में परेशानी हो रही है।

मुझे लगता है कि मैं उपयोग कथन का उपयोग कर सकता हूं, लेकिन यह केवल उस मौजूदा फ़ाइल में गुंजाइश है जिसका मैं विश्वास करता हूं, ताकि यह काम न करे (उपनाम को बिना किसी परिभाषित किए बिना एकाधिक फ़ाइलों के बीच पहुंच योग्य होना चाहिए)। मैं अंतर्निर्मित प्रकारों से कक्षा प्राप्त नहीं कर सकता (लेकिन आम तौर पर यह वही है जो मैं उपनाम प्रकार, जैसे सूची या शब्दकोश) के साथ करता हूं। मुझे यकीन नहीं है कि मैं क्या कर सकता हूं। कोई विचार?

using DWORD = System.Int32; 
+0

आप अंतर्निर्मित प्रकारों से क्यों नहीं प्राप्त कर सकते हैं? – arootbeer

+1

मैं सिर्फ उत्सुक हूँ? कोई स्थिति या कारण क्या होगा जो कोई ऐसा करना चाहेगा? क्षमा करें अगर यह अजीब लगता है, तो मैं सिर्फ अनजान हूं कि आप int का उपयोग क्यों नहीं करना चाहते हैं। ऐसा लगता है कि यह आपके कोड को पढ़ने के लिए किसी अन्य डेवलपर के लिए भ्रमित होगा। –

+0

सहमत हैं, इसे पढ़ने में रुचि रखते हैं, लेकिन यह खराब अभ्यास होना चाहिए –

उत्तर

6

आप सकता है (ab) अंतर्निहित रूपांतरण का उपयोग:

+0

मैं कभी-कभी थोड़ा अधिक जटिल मूल्य प्रकारों के लिए ऐसा करता हूं लेकिन मैं सिर्फ नाम रखने के लिए ऐसा नहीं करता हूं। – ChaosPandion

16

आप इस तरह पूर्ण प्रकार का नाम उपयोग करने की आवश्यकता

struct PeerId 
{ 
    private int peer; 

    public static implicit operator PeerId(int i) 
    { 
     return new PeerId {peer=i}; 
    } 

    public static implicit operator int(PeerId p) 
    { 
     return p.peer; 
    } 
} 

यह एक पूर्णांक के रूप में एक ही स्थान लेता है, और आप कर सकते हैं करें:

PeerId p = 3; 
int i = p; 

लेकिन मैं मानता हूं कि आपको शायद इसकी आवश्यकता नहीं है।

+12

यह समाधान अपने प्रश्न के इस हिस्से को संभाल नहीं करता है: 'मुझे लगता है कि मैं उपयोग कथन का उपयोग कर सकता हूं, लेकिन मेरे पास केवल उस मौजूदा फ़ाइल में गुंजाइश है जिसका मैं विश्वास करता हूं, इसलिए यह काम नहीं करेगा (उपनाम को एकाधिक के बीच सुलभ होना आवश्यक है फ़ाइलों को फिर से परिभाषित किए बिना) ' –

11

सारांश

यहाँ संक्षिप्त उत्तर है:

  • typedefs वास्तव में संकलन समय कोड जनरेटर द्वारा इस्तेमाल किया एक चर रहे हैं।
  • सी # कोड जनरेशन भाषा संरचनाओं को जोड़ने से बचने के लिए डिज़ाइन किया जा रहा है।

इसलिए, टाइपपीफ की अवधारणा सी # भाषा के साथ अच्छी तरह से फिट नहीं होती है। सी ++ एक precompiler कि सी कोड है, जो तब संकलित किया गया था थूक से बाहर के रूप में शुरू कर दिया:

लांग उत्तर

सी ++ में, यह अधिक समझ में आता है। यह "कोड जनरेटर" अभी भी आधुनिक सी ++ सुविधाओं में प्रभाव डालता है (यानी, टेम्पलेट अनिवार्य रूप से संकलन समय पर कक्षाओं और कार्यों को उत्पन्न करने के लिए एक ट्यूरिंग-पूर्ण भाषा है)। इस संदर्भ में, एक टाइपिफ़ाफ़ समझ में आता है क्योंकि यह एक संकलन-समय प्रकार फैक्ट्री या "एल्गोरिदम" का "परिणाम" प्राप्त करने का एक तरीका है जो एक प्रकार "रिटर्न" देता है।

इस अजीब मेटा-भाषा (जो बूस्ट के बाहर कुछ महारत हासिल कर चुके हैं) में, एक टाइपिफ़ वास्तव में एक चर है।

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

सी ++ और उत्पादक प्रोग्रामिंग

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

सी # और उत्पादक प्रोग्रामिंग

हमारे उपकरण धीरे-धीरे एक ही दिशा में विकसित हो रहे। बेशक, प्रतिबिंब उत्सर्जन का उपयोग "मैनुअल" जेनरेटिव प्रोग्रामिंग के लिए किया जा सकता है, लेकिन यह काफी दर्दनाक है। जिस तरह LINQ प्रदाता अभिव्यक्ति पेड़ का उपयोग करते हैं वह प्रकृति में बहुत ही रचनात्मक है। टी 4 टेम्पलेट्स वास्तव में करीब आते हैं लेकिन फिर भी कम हो जाते हैं। "एक सेवा के रूप में कंपाइलर" जो उम्मीदपूर्वक सी # vNext का हिस्सा होगा, सभी का सबसे अधिक आशाजनक प्रतीत होता है, अगर इसे किसी प्रकार के प्रकार परिवर्तनीय (जैसे टाइपिफ़) के साथ जोड़ा जा सकता है।

पहेली का यह एक टुकड़ा still missing है: उत्पादक कार्यक्रमों स्वचालित ट्रिगर तंत्र के कुछ प्रकार की जरूरत है (सी ++ में, इस अंतर्निहित टेम्पलेट इन्स्टेन्शियशन द्वारा नियंत्रित किया जाता है)।

हालांकि, यह स्पष्ट रूप से नहीं सी # का लक्ष्य सी ++ टेम्पलेट्स की तरह सी # भाषा में "कोड जनरेटर" के किसी भी प्रकार है (शायद understandability की खातिर; बहुत कुछ सी ++ प्रोग्रामर सी ++ टेम्पलेट्स समझते हैं)। यह शायद सी # के बजाय टी 4 द्वारा संतुष्ट हो जाएगा।

निष्कर्ष (सारांश दोहरा)

ऊपर की

सभी यह कहना है:

  • typedefs कोड जनरेटर द्वारा इस्तेमाल किया एक चर रहे हैं।
  • सी # कोड जनरेशन भाषा संरचनाओं को जोड़ने से बचने के लिए डिज़ाइन किया जा रहा है।

इसलिए, टाइपपीफ की अवधारणा सी # भाषा के साथ अच्छी तरह से फिट नहीं होती है।

+3

अत्यधिक जानकारीपूर्ण प्रतिक्रिया, हालांकि यह किसी भी जानकारी को शामिल नहीं करता है जिसे मैं पहले से नहीं जानता था, और न ही यह वास्तव में मेरे प्रारंभिक प्रश्न का उत्तर देता है। मैं बस टाइपिंगफ्स का जिक्र कर रहा था ताकि मैं हर किसी को जो सोच रहा/उम्मीद कर रहा हूं उसका एक उदाहरण दे। उपनामों को जरूरी समय संकलित करने की आवश्यकता नहीं होती है और व्युत्पन्न जैसे कई रूप ले सकते हैं। अगर मैं ऐसा कर सकता हूं: "पब्लिक क्लास पीरियड: int {}", जो मेरी समस्या को पूरी तरह से हल और हल करेगा। –

+0

दिलचस्प और उपयोगी जानकारी के लिए उत्तर भी +1 करें –

1

नाम बदलने के लिए मौलिक प्रकारों को फिर से परिभाषित करना सी ++ सोचता है और अधिक शुद्ध ऑब्जेक्ट ओरिएंटेड सी # के साथ अच्छी तरह से नहीं बैठता है। जब भी आपको एक भाषा से दूसरी भाषा में एक अवधारणा को झुकाव करने का आग्रह होता है, तो आपको रोकना चाहिए और सोचना चाहिए कि क्या यह समझ में आता है या मंच पर मूल रहने की कोशिश करता है।

अंतर्निहित प्रकार को बदलने में सक्षम होने की आवश्यकता आसानी से अपने मूल्य प्रकार को परिभाषित करके संतुष्ट हो सकती है। निहित रूपांतरण ऑपरेटर और अंकगणितीय ऑपरेटरों के साथ मिलकर, आपके पास बहुत शक्तिशाली प्रकार परिभाषित करने की शक्ति है। यदि आप सरल प्रकार के शीर्ष पर परत जोड़ने के प्रदर्शन के बारे में चिंतित हैं, तो नहीं। 99% मौका यह नहीं होगा, और 1% मौका यह है कि यदि ऐसा होता है, तो यह प्रदर्शन अनुकूलन के "कम लटकते फल" नहीं होगा।

3

मुझे कभी-कभी लगता है कि ओपी के समान उद्देश्यों के लिए मुझे (पूर्णांक) टाइपपीफ की आवश्यकता है।

आप कोई आपत्ति नहीं है डाले स्पष्ट किया जा रहा है (मैं वास्तव में उन्हें रखना चाहते हैं) आप यह कर सकते हैं:

enum PeerId : int {};

भी byte, sbyte, short, ushort, uint, long, या ulong (जाहिर है) के लिए काम करेगा।

बिल्कुल enum का इच्छित उपयोग नहीं है, लेकिन यह काम करता है।

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