Genel sınıflar ve yöntemler

Generics, .NET'e tür parametreleri kavramını tanıtır. Genel değerler, siz kodunuzda sınıf veya yöntemi kullanana kadar bir veya daha fazla tür parametresinin belirtimini erteleyebilen sınıflar ve yöntemler tasarlamayı mümkün hale getirir. Örneğin, genel tür parametresini Tkullanarak, burada gösterildiği gibi çalışma zamanı atamalarının veya kutulama işlemlerinin maliyetine veya riskine neden olmadan diğer istemci kodunun kullanabileceği tek bir sınıf yazabilirsiniz:

// Declare the generic class.
public class GenericList<T>
{
    public void Add(T input) { }
}
class TestGenericList
{
    private class ExampleClass { }
    static void Main()
    {
        // Declare a list of type int.
        GenericList<int> list1 = new GenericList<int>();
        list1.Add(1);

        // Declare a list of type string.
        GenericList<string> list2 = new GenericList<string>();
        list2.Add("");

        // Declare a list of type ExampleClass.
        GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
        list3.Add(new ExampleClass());
    }
}

Genel sınıflar ve yöntemler, yeniden kullanılabilirlik, tür güvenliği ve verimliliği, kendi üretilmeyen karşılıklarının kullanamaması gibi bir şekilde birleştirir. Genel tür parametreleri, derleme sırasında tür bağımsız değişkenleriyle değiştirilir. Yukarıdaki örnekte, derleyici ile değiştirilir Tint. Genel öğeler en sık koleksiyonlar ve bunlar üzerinde çalışan yöntemlerle kullanılır. Ad System.Collections.Generic alanı birkaç genel tabanlı koleksiyon sınıfı içerir. Gibi ArrayList genel olmayan koleksiyonlar önerilmez ve yalnızca uyumluluk amacıyla korunur. Daha fazla bilgi için bkz . .NET'te genel değerler.

Ayrıca, tür açısından güvenli ve verimli olan kendi genelleştirilmiş çözümlerinizi ve tasarım desenlerinizi sağlamak için özel genel türler ve yöntemler oluşturabilirsiniz. Aşağıdaki kod örneği, gösterim amacıyla basit bir genel bağlantılı liste sınıfını gösterir. (Çoğu durumda, kendi sınıfınızı oluşturmak yerine .NET tarafından sağlanan sınıfı kullanmalısınız List<T> .) tür parametresi T , listede depolanan öğenin türünü belirtmek için normalde somut bir türün kullanıldığı çeşitli konumlarda kullanılır:

  • yöntemindeki bir yöntem parametresinin AddHead türü olarak.
  • İç içe Node geçmiş sınıfta özelliğinin dönüş türü Data olarak.
  • İç içe geçmiş sınıftaki özel üyenin data türü olarak.

T iç içe geçmiş Node sınıfı tarafından kullanılabilir. Örneğin, GenericList<int>somut bir türle örneklendiğindeGenericList<T>, her oluşumu T ile intdeğiştirilir.

// type parameter T in angle brackets
public class GenericList<T>
{
    // The nested class is also generic on T.
    private class Node
    {
        // T used in non-generic constructor.
        public Node(T t)
        {
            next = null;
            data = t;
        }

        private Node? next;
        public Node? Next
        {
            get { return next; }
            set { next = value; }
        }

        // T as private member data type.
        private T data;

        // T as return type of property.
        public T Data
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node? head;

    // constructor
    public GenericList()
    {
        head = null;
    }

    // T as method parameter type:
    public void AddHead(T t)
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }

    public IEnumerator<T> GetEnumerator()
    {
        Node? current = head;

        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}

Aşağıdaki kod örneği, istemci kodunun tamsayı listesi oluşturmak için genel GenericList<T> sınıfı nasıl kullandığını gösterir. Tür bağımsız değişkenini değiştirirseniz, aşağıdaki kod dizelerin veya başka bir özel türün listesini oluşturur:

class TestGenericList
{
    static void Main()
    {
        // int is the type argument
        GenericList<int> list = new GenericList<int>();

        for (int x = 0; x < 10; x++)
        {
            list.AddHead(x);
        }

        foreach (int i in list)
        {
            System.Console.Write(i + " ");
        }
        System.Console.WriteLine("\nDone");
    }
}

Not

Genel türler sınıflar ile sınırlı değildir. Yukarıdaki örneklerde türler kullanılırclass, ancak türler de dahil olmak üzere record genel interface ve struct türler tanımlayabilirsiniz.

Genel değerlere genel bakış

  • Kod yeniden kullanımını, tür güvenliğini ve performansı en üst düzeye çıkarmak için genel türleri kullanın.
  • Genel türlerin en yaygın kullanımı koleksiyon sınıfları oluşturmaktır.
  • .NET sınıf kitaplığı, ad alanında System.Collections.Generic birkaç genel koleksiyon sınıfı içerir. Genel koleksiyonlar, ad alanı gibi ArrayListSystem.Collections sınıflar yerine mümkün olduğunda kullanılmalıdır.
  • Kendi genel arabirimlerinizi, sınıflarınızı, yöntemlerinizi, olaylarınızı ve temsilcilerinizi oluşturabilirsiniz.
  • Belirli veri türlerindeki yöntemlere erişimi etkinleştirmek için genel sınıflar kısıtlanabilir.
  • Yansıma kullanarak genel bir veri türünde kullanılan türler hakkında çalışma zamanında bilgi edinebilirsiniz.

C# dili belirtimi

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi.

Ayrıca bkz.