सवाल परिभाषित प्रकार उपनाम


पास्कल I की एक विशेषता बहुत उपयोगी पाया गया था, डेटा प्रकार का नाम देने की क्षमता, उदाहरण के लिए

type
 person: record
             name: string;
             age: int;
         end;

var
 me: person;
 you: person;

etc

क्या आप सी # में कुछ ऐसा कर सकते हैं? मैं कुछ ऐसा करने में सक्षम होना चाहता हूँ

using complexList = List<Tuple<int,string,int>>;

complexList peopleList;
anotherList otherList;

इसलिए यदि मुझे डेटाटाइप की परिभाषा को बदलना है, तो मैं इसे एक ही स्थान पर कर सकता हूं।

क्या सी # इसे प्राप्त करने का एक तरीका है?


44
2018-02-13 09:17


मूल


ए "using उपनाम "सी # में केवल प्रति फ़ाइल है - Marc Gravell♦
यहां से एक और सवाल है: stackoverflow.com/questions/161477/... - Candide


जवाब:


पास्कल में आप जो भी करते हैं, वह उत्साहजनक नहीं है, लेकिन आप इसका उपयोग कर सकते हैं using-directive। यहाँ एक नज़र डालें इसका इस्तेमाल कैसे करें

उदाहरण:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyList = Dummy2.CompleXList;

namespace Dummy2
{
    public class Person 
    {
    }

    public class CompleXList : List<Person> 
    { 
    }


    class Program
    {
        static void Main(string[] args)
        {
            MyList l1 = new MyList();
        }
    }
}

38
2018-02-13 09:26



मामूली बिंदु: द using एक फाइल के शीर्ष पर हैं निर्देशों, नहीं बयान; "कथन का उपयोग" शामिल चीज है IDisposable। विशेष रूप से, यह "उपनाम का उपयोग" है। - Marc Gravell♦
ध्यान दें: यदि आप सिर्फ "माईलिस्ट" श्रेणी का नाम देते हैं, तो उपयोग निर्देश अब निश्चित रूप से आवश्यक नहीं है (और यह मूल समस्या को भी हल करता है)। - BrainSlugs83
लिंक पुराने दस्तावेज़ पृष्ठ पर इंगित करता है। अभी भी सक्रिय और सटीक (और इसमें निम्न लिंक है) यहां नए पृष्ठ का लिंक पुराना पृष्ठ हटा दिया जाना चाहिए। docs.microsoft.com/en-us/dotnet/csharp/language-reference/... - MadCityDev


हाँ, यह मुमकिन है। तुम लिख सकते हो:

using System;
using System.Collections.Generic;

namespace ConsoleApplication12
{
    using MyAlias = List<Tuple<int, string, int>>;
}

या, यदि नामस्थान के बाहर घोषित किया गया है:

using System;
using System.Collections.Generic;

using MyAlias = System.Collections.Generic.List<System.Tuple<int, string, int>>;

namespace ConsoleApplication12
{
}

फिर इसे एक प्रकार के रूप में उपयोग करें:

MyAlias test = new MyAlias();

52
2018-02-13 09:22



क्या आपने यह कोशिश की है? यह संकलित नहीं होगा (मानते हैं List<T>ठेठ एक है); ए using उपनाम हमेशा पूर्ण नामस्थान निर्दिष्ट करने की आवश्यकता है। - Marc Gravell♦
@MarcGravell बेशक मैंने इसका परीक्षण किया, यह निश्चित रूप से संकलित करता है और ठीक काम करता है। - ken2k
@MarcGravell प्रेसिजन: अगर यह अंदर घोषित किया गया है तो यह ठीक काम करता है namespace गुंजाइश। उत्तर अपडेट कर रहा है। - ken2k
दिलचस्प भेद - स्पष्टीकरण के लिए धन्यवाद - Marc Gravell♦
@ जोडरेल मैं बहुत ही कम देखता हूं using अंदर निर्देश namespace, मुख्य रूप से क्योंकि ऐसा नहीं है जहां अधिकांश उपकरण उन्हें डालते हैं। - Marc Gravell♦


आप एक प्रकार बना सकते हैं:

class ComplexList : List<Tuple<int,string,int>> { }

यह सख्ती से उपनाम के समान नहीं है लेकिन ज्यादातर मामलों में, आपको कोई अंतर नहीं दिखना चाहिए।


15
2018-02-13 09:25



दिलचस्प दृष्टिकोण। धन्यवाद - haughtonomous
मेरा जवाब ऊपर उठाना एक अच्छा विचार होगा ;-) - Serge Wautier
@ सर्ज-एपट्रांसलेटर अगर यह मेरे उत्तर के समान नहीं था लेकिन 2 मिनट बाद। - Jodrell
@jodrell: आउच! मुझे लगता है कि हम इसे एक ही समय में टाइप कर रहे थे। आपने बस दौड़ की स्थिति जीती है। बीटीडब्ल्यू, आपका जवाब उत्कृष्ट है: मैं इसे ऊपर उठाता हूं ;-) - Serge Wautier
यह काम नहीं करता है, हालांकि, अगर प्रकार सील कर दिया गया है (उदा। आप "उपनाम" की कोशिश कर रहे हैं KeyValuePair<K,V>) - Liam Dawson


विरासत के बारे में क्या?

class ComplexList : List<Tuple<int, string, int>> {}

var complexList = new ComplexList();

यह एक समान अवधारणा की तरह प्रतीत होता है लेकिन सी # में केवल एक प्रकार आधारित उपनाम के प्रत्यक्ष समकक्ष नहीं है नामस्थान उपनाम

यदि आप अपने कोड में टाइप नाम टकराव से बचना चाहते हैं, तो नेमस्पेस एलियासिंग जाने का तरीका है।

यदि आप एक नया प्रकार बनाना चाहते हैं जो किसी अन्य प्रकार का उदाहरण है, तो विरासत एक विकल्प है।


13
2018-02-13 09:23



विरासत का उपयोग करने के अलावा सभी मामलों में असफल हो जाएगा जहां उपनाम का अर्थ है, मुहरबंद है। - Alexander Morou
हालांकि, अगर आप ऐसा करते हैं और घोषणा करते हैं void Foo(ComplexList a) विधि, इसे कॉल करने के रूप में Foo(new List<Tuple<int,string,int>>(); आइसोमोर्फिक होने के बावजूद, एक प्रकार की त्रुटि होगी। - cemper93
विरासत लाभ से एफएआर है जब तक आप वास्तव में नहीं चाहते हैं subclassing की विशेषताएं। किसी भी अन्य मामले में, यह ओवरहेड, संकेत, धीमा, और अविश्वसनीयता जोड़ता है। आप आगे दिए गए पुस्तकालयों के साथ कक्षा का उपयोग करने में सक्षम नहीं होने के लिए प्रतिबंधित हैं जो किसी दिए गए प्रकार पर निर्भर हैं। वास्तव में, शब्द "उपनाम" का अर्थ आवश्यक है कि प्रकार अभी भी वही हो। विरासत, दूसरे शब्दों में, अलियासिंग नहीं है। एलिसिंग आपको ऑब्जेक्ट को ऐसी विधि में पारित करने की अनुमति देगी जो बिना किसी प्रकार के कास्टिंग के उपनाम साझा नहीं करता है। - Zane Claes
@ZaneClaes, मैंने अपने जवाब से "(लाभ के साथ)" भाग हटा दिया है। मैं असहमत हूं कि उपनाम शब्द का अर्थ सामान्य रूप से टाइप सिस्टम के लिए कोई विशिष्ट अर्थ रखता है। हालांकि सी # विरासत पास्कल ऊर्फ के लिए मजबूत समकक्ष नहीं है लेकिन कोई मजबूत समतुल्य नहीं है। हिंदसाइट में, मैं स्वीकार्य उत्तर के लिए और अधिक आकर्षित किया था। - Jodrell
@Jodrell "कंप्यूटिंग" में "उपनाम" की परिभाषा के अनुसार: "एक वैकल्पिक नाम या लेबल जो [...] एक आइटम को संदर्भित करता है और इसे ढूंढने के लिए उपयोग किया जा सकता है।" परिभाषा के अनुसार, इसलिए, सबक्लास एक उपनाम नहीं हो सकता है क्योंकि यह सुपरक्लास का संदर्भ या पता नहीं लगाता है; यह पूरी तरह से एक नई इकाई है। एक कंपाइलर स्तर पर, दोनों बराबर नहीं हैं या विकल्प एक दूसरे के संस्करण। - Zane Claes


प्रारंभिक प्रश्न में दिखाए गए वाक्यविन्यास से, ऐसा लगता है कि आप वास्तव में केवल पूछ रहे हैं कि सी # में कक्षा कैसे बनाएं, और किसी प्रकार को उपनाम कैसे न करें।

यदि आप एक सरल नाम से टाइप करना चाहते हैं List<Tuple<int,string,int>>, और आप इसे "वैश्विक" (यानि प्रति फ़ाइल नहीं) चाहते हैं, तो मैं एक नई कक्षा तैयार करूंगा जो विरासत में वर्ग कहता है और कोई अतिरिक्त सदस्य घोषित नहीं करता है। इस कदर:

public class MyTrinaryTupleList: List<Tuple<int,string,int>> { }

यह प्रबंधन का एक ही स्थान देता है, और बयानों का उपयोग करके अतिरिक्त आवश्यकता नहीं है।

हालांकि, मैं इसे एक कदम आगे भी ले जाऊंगा, और उद्यम करता हूं कि आप शायद टुपल नहीं चाहते हैं, बल्कि एक और वर्ग, जैसे कि:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int FavoriteNumber { get; set; }

    public Person() { }

    public Person(string name, int age, int favoriteNumber) 
    { 
        this.Name = name; 
        this.Age = age; 
        this.FavoriteNumber = favoriteNumber; 
    }
}

और फिर अपनी सूची प्रकार के लिए आप निम्न कार्य कर सकते हैं:

public class PersonList: List<Person> { }

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


5
2017-10-20 23:32





हां आप ऐसा कर सकते हैं, हालांकि आपको पूर्ण प्रकार निर्दिष्ट करने की आवश्यकता है, यानी परिभाषा बन जाती है:

using ComplexList = System.Collections.Generic.List<System.Tuple<int,string,int>>;

यह प्रति फ़ाइल निर्दिष्ट है, नामस्थानों के लिए उपयोग निर्देशों की तरह।

नाइटपिक: परंपरागत रूप से, .NET में एक प्रकार पास्कल कैस है।


3
2018-02-13 09:23



"पूर्ण प्रकार" की आवश्यकता नहीं है। अगर कोई और using (जैसे कि using System.Collections.Generic; मौजूद हैं), फिर "पूर्ण प्रकार" आवश्यक नहीं हैं। - ken2k
@ केएन 2 के गलत; ए using उपनाम हमेशा इसे नेमस्पेस-योग्यता के योग्य होने की आवश्यकता होती है, भले ही वर्तमान using निर्देश इसे दायरे में लाएंगे; अर्थ: using var list = List<int>; है नहीं वैध, यहां तक ​​कि बाद में using System.Collections.Generic; - Marc Gravell♦
यदि उपनाम को नेमस्पेस के दायरे में वास्तव में परिभाषित किया गया है, तो इसकी आवश्यकता नहीं है। - ken2k
हमेशा सीखते रहना... - flq


बस एक साधारण उपयोग करेंगे:

using Foo = System.UInt16;

public class Test {
  public Foo Bar { get;set; }
}

0
2017-09-25 08:26