Aracılığıyla paylaş


Tür Parametrelerindeki Kısıtlamalar (C# Programlama Kılavuzu)

Bir generic sýnýf tanýmlarken sınıfınızın başlatır, istemci kodu tür bağımsız değişkenleri için kullanabileceğiniz türlerini türlerini sınırlamalar bulunabilir.İstemci kodu Sınıfınızın bir sınırlama izin verilmeyen bir türünü kullanarak oluşturmaya çalışırsa, bir derleme zamanı hatası sonucudur.Bu kısıtlamalar kısıtlamalar denir.Kısıtlamaları kullanılarak belirtilir where bağlamsal anahtar sözcüğü.Aşağıdaki tablo kısıtlamaları altı türlerini listeler:

Kısıtlama

Description

Burada t: yapı

Tür bağımsız değişkeni, bir değer türü olmalıdır.Herhangi bir değer türü dışında Nullable belirtilebilir.Daha fazla bilgi için bkz. Boş Değer Atanabilir Türleri Kullanma (C# Programlama Kılavuzu).

Burada t: sınıf

Tür bağımsız değişkeni, bir başvuru türü olmalıdır; Bu, aynı zamanda herhangi bir sınıf, arabirim, temsilci veya dizi türü için geçerlidir.

Burada t: new()

Tür bağımsız değişkeni, Ortak parametresiz oluşturucusu olmalıdır.Diğer sınırlamalar ile birlikte kullanıldığında new() kısıtlama son olarak belirtilmelidir.

Burada t: < temel sınıf adı >

Tür bağımsız değişkeni olması veya belirtilen ana sınıftan türer.

Burada t: < arabirim adı >

Tür bağımsız değişkeni olması veya belirtilen arabirim uygulamak gerekir.Birden çok arabirim kısıtlamaları belirtilebilir.Kısıtlayan arabirim genel olabilir.

Burada t: u

t için sağlanan tür bağımsız değişkeni olması veya u. için sağlanan bağımsız değişken öğesinden türetilmeli

Neden kısıtlamalarını kullanmak

Geçerli olup olmadığını belirlemek için veya başka bir öğe için karşılaştırmak için genel bir listedeki bir öğeyi incelemek isterseniz, derleyici bazı garanti işleci veya yöntemi çağırmak için olan istemci kodu tarafından belirtilen herhangi bir tür bağımsız değişkeni tarafından desteklenecektir emin olması gerekir.Bu garanti, generic sýnýf tanımınızı bir veya daha fazla kısıtlamayı uygulanarak elde edilir.Örneğin, temel sınıf kısıtlaması yalnızca nesne türü derleyici bildirir veya buradan türetilmiş tür tür bağımsız değişkenleri kullanılır.Derleyici bu garanti sahip bir generic sýnýf içinde çağrılabilir bu tür yöntemleri izin verebilirsiniz.Bağlamsal anahtar sözcüğünü kullanarak kısıtlamaları uygulanır where.Aşağıdaki kod örneği için ekleyebilirsiniz biz işlevselliğini göstermektedir GenericList<T> sınıfı (de Genel Türlere Giriş (C# Programlama Kılavuzu)) bir temel sınıf kısıtlaması uygulayarak.

public class Employee
{
    private string name;
    private int id;

    public Employee(string s, int i)
    {
        name = s;
        id = i;
    }

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public int ID
    {
        get { return id; }
        set { id = value; }
    }
}

public class GenericList<T> where T : Employee
{
    private class Node
    {
        private Node next;
        private T data;

        public Node(T t)
        {
            next = null;
            data = t;
        }

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

        public T Data
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;

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

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

    public T FindFirstOccurrence(string s)
    {
        Node current = head;
        T t = null;

        while (current != null)
        {
            //The constraint enables access to the Name property. 
            if (current.Data.Name == s)
            {
                t = current.Data;
                break;
            }
            else
            {
                current = current.Next;
            }
        }
        return t;
    }
}

Kullanılacak genel sınıf kısıtlaması sağlar Employee.Name özelliği t tipindeki tüm maddeler ya da olduğu garanti çünkü bir Employee veya devraldığı bir nesneyi Employee.

Aynı tür parametresi için birden çok kısıtlamalar uygulanabilir ve kısıtlamaları genel türleri aşağıdaki gibi olabilir:

class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
    // ...
}

Type parametresi sınırlama tarafından izin verilen işlemleri ve kısıtlayan türü ve tüm türleri, Devralma hiyerarşisinde desteklediği için yöntem çağrıları sayısını artırmak.Bu nedenle, tasarlarken generic sýnýflar ya da yöntemleri, basit atama ötesinde genel üyeleri üzerinde herhangi bir işlemi gerçekleştiren veya yüklenecek tarafından desteklenmeyen herhangi bir yöntemin çağrılması, System.Object, türü parametresi kısıtlamaları uygulamak gerekir.

Uygulanırken, where T : class kısıtlama, kaçının == ve != tür parametresi işleçlerini bu işleçleri yalnızca başvuru kimlik değil değer eşitlik için sınamak için.Bağımsız değişken olarak kullanılan bir yazıda bu operatörler aşırı yüklenmiş olsa bile bu durum geçerlidir.Aşağıdaki kod bu noktayı gösterir; Çıktı bile yanlış String class aþýrý yükleme == işleci.

public static void OpTest<T>(T s, T t) where T : class
{
    System.Console.WriteLine(s == t);
}
static void Main()
{
    string s1 = "target";
    System.Text.StringBuilder sb = new System.Text.StringBuilder("target");
    string s2 = sb.ToString();
    OpTest<string>(s1, s2);
}

Bu davranış için derleme zamanında derleyici yalnızca t bir başvuru türüdür ve bu nedenle tüm baþvuru türleri için geçerli olan varsayılan operatörler kullanmalısınız bilir, nedenidir.Değer eşitlik için sınamalısınız, de uygulamak için önerilen yol olan where T : IComparable<T> kısıtlama ve genel sınıf oluşturmak için kullanılan herhangi bir sınıfta arabirim uygulamak.

Birden çok parametre sınırlama

Aşağıdaki örnekte gösterildiği gibi birden çok parametre ve tek bir parametre için birden çok kısıtlamaları kısıtlamalar uygulayabilirsiniz:

class Base { }
class Test<T, U>
    where U : struct 
    where T : Base, new() { }

Sınırlandırılmamış tür parametreleri

Public class t gibi hiçbir kısıtlamaları olan parametreler yazın SampleClass<T>{}, sınırlandırılmamış tür parametreleri olarak adlandırılır.Sınırlandırılmamış tür parametreleri aşağıdaki kurallar vardır:

  • != Ve == işleçleri somut tür bağımsız değişkeni bu operatörler destekleyeceğini garanti olduğundan kullanılamaz.

  • Birinden diğerine dönüştürülebilir System.Object ya da herhangi bir arabirim türü için açıkça dönüştürülmüş.

  • ' Karşılaştırabilirsiniz null.Sınırlandırılmamış bir parametre karşılaştırılır, null, karşılaştırma her zaman türü bağımsız değişken bir değer türü ise false döner.

Tür parametreleri olarak kısıtlamaları

Bir kısıtlama bir üye işlev çalıştırıldığında, kendi tür parametresi yararlı olduğu gibi bu tür parametresi kapsayan tür aşağıdaki örnekte gösterildiği gibi parametreye sınırlamak bir genel tür parametresinin kullanımı vardır:

class List<T>
{
    void Add<U>(List<U> items) where U : T {/*...*/}
}

Önceki örnekte, T bir tür kısıtlaması kapsamında olduğunu Add yöntemi ve bağlamında bir sınırlandırılmamış tür parametresi List sınıfı.

Tür parametreleri genel sınıf tanımlarında kısıtlamaları olarak da kullanılabilir.Not: tür parametresi, diğer tür parametreleri ile birlikte açılı ayraçlar içinde bildirilmelidir

//Type parameter V is used as a type constraint. 
public class SampleClass<T, U, V> where T : V { }

Tür parametreleri kullanışlılığını sýnýflarla birlikte kısıtlamaları olarak çok sınırlı, onu türetildiği dışında derleyici tür parametresi hakkında hiçbir şey kabul edilebilir çünkü System.Object.Generic sýnýflar iki tür parametre arasında bir miras ilişkisiyle zorlamak istediğiniz senaryolarda kısıtlamalar tür parametreleri kullanın.

Ayrıca bkz.

Başvuru

Genel Türlere Giriş (C# Programlama Kılavuzu)

Genel Sınıflar (C# Programlama Kılavuzu)

new Kısıtlaması (C# Başvurusu)

System.Collections.Generic

Kavramlar

C# Programlama Kılavuzu