Soru Tür takma adlarını tanımlama


Pascal'ın bir özelliği, çok kullanışlı bulduğu bir veri tipinin isimlendirilmesiydi.

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

var
 me: person;
 you: person;

etc

C # 'de benzer bir şey yapabilir misin? Gibi bir şey yapabilmek istiyorum

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

complexList peopleList;
anotherList otherList;

Böylece, veri türünün tanımını değiştirmek zorunda kalırsam, bunu tek bir yerde yapabilirim.

C # bunu başarmak için bir yolu destekliyor mu?


44
2018-02-13 09:17


Menşei


bir "using takma ad "c # sadece dosya başına - Marc Gravell♦
İşte bununla ilgili başka bir soru: stackoverflow.com/questions/161477/... - Candide


Cevaplar:


Pascal'da yaptığınız şey tam olarak değil, ama using-direktif. Burada bir göz atın bu nasıl kullanılır

Örnek:

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



minör nokta: using bir dosyanın üstünde direktifler, değil ifadeleri; "kullanarak ifadesi" içeren şey IDisposable. Özellikle, bu "takma ad kullanıyor". - Marc Gravell♦
Not: Ayrıca, sadece "MyList" sınıfını isimlendirirseniz, kullanım yönergesi elbette artık gerekli değildir (ve bu da orijinal sorunu çözer). - BrainSlugs83
Bağlantı eski bir belge sayfasına işaret eder. Hala aktif ve doğru (ve aşağıdaki linke sahip), eski sayfanın kaldırılması gerektiğinde daha yeni sayfanın linkidir. docs.microsoft.com/en-us/dotnet/csharp/language-reference/... - MadCityDev


Evet mümkün. Yazabilirsin:

using System;
using System.Collections.Generic;

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

veya ad alanı dışında bildirilmişse:

using System;
using System.Collections.Generic;

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

namespace ConsoleApplication12
{
}

sonra tür olarak kullanın:

MyAlias test = new MyAlias();

52
2018-02-13 09:22



Bunu denedin mi? derleme değil List<T>tipik olanıdır); bir using diğer ad her zaman belirtilecek tam ad alanını gerektirir. - Marc Gravell♦
@MarcGravell Elbette bunu test ettim, kesinlikle derler ve iyi çalışır. - ken2k
@MarcGravell Precision: içeride bildirilmişse iyi çalışır namespace kapsamı. Cevabın güncellenmesi. - ken2k
ilginç ayrım - açıklık için teşekkürler - Marc Gravell♦
@Jodrell Çok nadiren görüyorum using içindeki direktifler namespaceEsas olarak, çoğu aracın onları koyduğu yer olmadığı için. - Marc Gravell♦


Bir tür oluşturabilirsiniz:

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

Bu, bir takma adla tamamen aynı değildir, ancak çoğu durumda, herhangi bir farklılık görmemelisiniz.


15
2018-02-13 09:25



İlginç bir yaklaşım. Teşekkürler - haughtonomous
Cevabımı geri almak o zaman iyi bir fikir olurdu ;-) - Serge Wautier
@ Serge-appTranslator benim cevabımla aynı olmasaydı ama 2 dakika sonra. - Jodrell
@jodrell: ouch! Sanırım aynı zamanda yazıyorduk. Sadece yarış koşulunu kazandın. BTW, cevabınız mükemmel: Ben onu ;-) - Serge Wautier
Bununla birlikte, bu işlev işe yaramazsa, tür mühürlenmişse (ör. "Diğer ad" için çalışıyorsunuz) KeyValuePair<K,V>) - Liam Dawson


Mirastan ne haber?

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

var complexList = new ComplexList();

Bu benzer bir kavram gibi görünüyor ama C #, sadece bir tür tabanlı takma direk eşdeğer yoktur ad alanı takma adları.

Kodunuzda tür adı çakışması yapmak istemiyorsanız, ad alanı takma adımıdır.

Başka türde bir "örnek" olan yeni bir tür yapmak istiyorsanız, devralma bir seçenektir.


13
2018-02-13 09:23



Miras kullanımı haricinde, takma adın kullanıldığı türün tüm durumlarda başarısız olur. - Alexander Morou
Ancak, bunu böyle yapar ve bildirirseniz void Foo(ComplexList a) yöntem olarak çağırmak Foo(new List<Tuple<int,string,int>>(); izomorfik olmalarına rağmen tip hatası olur. - cemper93
Kalıtım aslında bir yararı olmadıkça FAR'tır istemek alt sınıflamanın özellikleri. Başka bir durumda, bu ek yük, dolaylılık, yavaşlık ve güvenilmezlik ekler. Ayrıca, sınıfı belirli bir türe dayanan kütüphanelerle kullanamazsınız. Aslında, "takma" kelimesinin anlamı, türün hala aynı olmasını GEREKTİRİR. Kalıtım, başka bir deyişle, takas DEĞİLDİR. Aliasing, nesneyi, herhangi bir döküm biçimi olmadan takma adı paylaşmayan bir yönteme aktarmanıza izin verir. - Zane Claes
@ZaneClaes, "(Faydaları ile)" bölümünü kaldırdım. Genel olarak, kelime takma isminin anlamının, tip sistemler için belirli bir anlamı taşıdığına katılmıyorum. Ancak C # devralma, Pascal takma adı için güçlü bir eşdeğer değildir, ancak güçlü bir eşdeğer yoktur. Hindsight'ta, kabul edilen cevaba daha çok çekilirdim. - Jodrell
@Jodrell, "bilgisayar" içindeki "takma ad" sözlük tanımına göre: "bir öğeye [...] başvuran alternatif bir ad veya etiket ve onu bulmak için kullanılabilir." Bu nedenle, tanım gereği, bir alt sınıf, bir üst sınıf olamaz; Tamamen yeni bir varlıktır. Derleyici düzeyinde, ikisi eşdeğer değildir veya alternatif birbirinin versiyonları. - Zane Claes


İlk soruda gösterilen sözdiziminden, gerçekten C # 'da nasıl bir sınıf yapılacağını soruyorsunuz ve bir türün nasıl taklit edileceğini değil.

Yazmak için daha basit bir ad istiyorsanız List<Tuple<int,string,int>>ve "global" (yani dosya başına değil) olmasını istiyorsanız, söz konusu sınıfı devralan ve ek üyeler ilan etmeyen yeni bir sınıf oluşturacağım. Bunun gibi:

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

Bu, yönetimin tek bir yerini verir ve ek kullanma ifadelerine gerek yoktur.

Bununla birlikte, bunu bir adım daha ileriye götüreceğim ve muhtemelen bir Tuple istemediğine, daha ziyade başka bir sınıfa gireceğime inanıyorum:

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; 
    }
}

Ve sonra liste türünüz için aşağıdakileri yapabilirsiniz:

public class PersonList: List<Person> { }

Ayrıca, başka listeye özgü yardımcı özellikler veya yöntemlere ihtiyacınız varsa, bunları PersonList sınıfına da ekleyebilirsiniz.


5
2017-10-20 23:32





Evet, bunu yapabilirsiniz, ancak tam türlerini belirtmeniz gerekir, yani tanım şöyle olur:

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

Bu, dosya alanlarına yönelik kullanım yönergeleri gibi, dosya başına belirtilir.

nitpick: Geleneksel olarak, .NET'te bir tür PascalCased'dir.


3
2018-02-13 09:23



"Tam türleri" gerekli değildir. Eğer diğer using (gibi using System.Collections.Generic; mevcut), sonra "tam türleri" gerekli değildir. - ken2k
@ ken2k yanlış; bir using takma ad, her zaman açıkça ad alanı bakımından nitelikli olmasını gerektirir. Bile var olan using direktifler kapsam içine getirirdi; anlamı: using var list = List<int>; olduğu değil geçerli, sonra bile using System.Collections.Generic; - Marc Gravell♦
Diğer adın aslında bir ad alanının kapsamı içinde tanımlanması gerekli değildir. - ken2k
Her zaman öğrenme... - flq


Sadece basit bir kullanım yapardı:

using Foo = System.UInt16;

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

0
2017-09-25 08:26