Heim Backend-Entwicklung C#.Net-Tutorial Detaillierte grafische und textliche Einführung in generische C#-Einschränkungen

Detaillierte grafische und textliche Einführung in generische C#-Einschränkungen

Mar 07, 2017 am 10:59 AM
c# 泛型 约束

In diesem Artikel werden die Einschränkungen von C#-Generika ausführlich vorgestellt: Einschränkungen des Referenztyps; Einschränkungen des Konstruktortyps; Es hat einen sehr guten Referenzwert, schauen wir es uns mit dem folgenden Editor an

1 Referenztypbeschränkungen

struct RefSample< T> wobei T:class Der Referenztyp verwendet Class, um Einschränkungen darzustellen, und andere Referenztypen sind spezifische Einschränkungen.

bedeutet, dass die Einschränkung eine Klasse (Referenztyp) sein muss und kein Werttyp (int, char, datatime, struct) sein kann. Sie kann eine Schnittstelle sein

Unterscheidung, das Array ist ein Referenztyp, da Sie beim Definieren eines Arrays ein Objekt mit new erstellen müssen.

Obwohl es als RefSample definiert ist, muss der eingehende Wert ein Referenztyp sein, aber RefSample ist immer noch ein Werttyp

2 Werttypbeschränkungen

class ValSample wobei T:struct

ein Referenztyp ist, da int, char und andere Typen alle struct

sind

ValSample

3. Konstruktortypbeschränkung

public T CreateInstance<T>() where T:new()
{
  return new T();
}
Nach dem Login kopieren

Der angegebene Typ T muss einen Konstruktor haben, CreateInstance sind beide gültig. Aber CreateInstance hat keinen Konstruktor.

4. Einschränkungen für Konvertierungstypen

Eine Einschränkung ermöglicht die Angabe eines anderen Typs. Das Typargument muss implizit durch Konsistenz, Referenz oder Boxing-Konvertierung in diesen Typ konvertierbar sein . Sie können auch angeben, dass ein Typargument in ein anderes Typargument konvertierbar sein muss – dies wird als Typparametereinschränkung bezeichnet.

Verstandene Bedeutung: austauschbar, das heißt, jeder Typ, den wir durch Boxen oder erzwungenen Typ in den Zieltyp konvertieren können, kann zur Übergabe von Typparametern verwendet werden.

Klasse Sample wobei T:Stream

gilt: Sample, das selbst der Einschränkung

ist ungültig: Sample Da der String-Typ nicht durch Verweis oder Ein- und Auspacken in einen Stream umgewandelt werden kann, ist

struct Sample where T:IDisposable

Es wird angegeben, dass T ein Referenztyp vom Typ IDisposable sein muss

Gültig: Sample Referenzkonvertierung

Ungültig: Sample

Analyse: Warum kann SqlConnection, aber nicht StringBuilder? Sie sind alle Referenztypen

1. SqlConnection implementiert die IDisposable-Schnittstelle, sodass sie kovariant sein kann

2. StringBuilder implementiert nur die ISerializable-Schnittstelle und kann nicht in IDisposable konvertiert werden

class Sample wobei T:IComparable

Da IComparable als Einschränkung betrachtet wird, analysieren Sie IComparable< Der Typ von ;T> kann anhand von Type.IsValueType beurteilt werden, und false ist der Referenztyp

typeof(IComparable).IsValueType Ergebnis wird als Referenztyp als falsch dargestellt

Gültig: Sample (Boxing-Konvertierung)

Ungültig: Sample

Es können auch mehrere Einschränkungen angegeben werden :

Klassenbeispiel wobei T: stream, IEnumerable,IComparable

Klasse Sample wobei T:U

Gültig: Sample

Ungültig: Sample

Zusammenfassung: Es hängt davon ab, ob die eingehenden Klassenparameter konvertiert werden können und ob die angegebenen Parameter und die eingehenden Klassenparameter dieselbe Schnittstelle implementieren. Wenn ja, ist dies in Ordnung, andernfalls ist dies nicht möglich.

darf nicht Folgendes sein: System.Object, System.Enum, System.ValueType, System.Delegate, Struktur oder versiegelte Klasse (String)

5. Kombinationseinschränkungen

Es gibt mehrere Einschränkungen für Typparameter. Hinweis: Es kann nur ein Typ sein, und Werttypen und Referenztypen können nicht vorhanden sein Gleichzeitig ist es nicht erforderlich, dass ein Typ sowohl ein Referenztyp als auch ein Werttyp ist.

Da jeder Werttyp eine konstruktorlose Funktion hat, kann es danach keine Konstruktoreinschränkungen mehr geben

Gültig:

class Sample wobei T: class, IDisposable, new( )
class Sample where T: Stream where U:IDispsable

Ungültig:

class Sample where T: class, struct (ohne jegliche Typ-Direktreferenz) Der Typ ist ein Werttyp, daher ist er ungültig)

class Sample wobei T: Stream, Klasse (Die Referenztyp-Einschränkung sollte die erste Einschränkung sein, die vorne platziert ist, also ist sie ungültig) Stream beschränkt die eingehenden Parameter nur auf Stream-spezifische Typen , während die Klasse auf Referenztypen beschränkt ist
class Sample (new() muss am Ende platziert werden)

class Sample wobei T: IDisposable, Stream (class muss vor der Schnittstelle platziert werden, damit es ist ungültig. Einschränkung, daher kann „T“ nicht als Einschränkung von „U“ verwendet werden, daher ist es ungültig

Klasse Sample wobei T:Stream ,U:IDisposable

Syntax Fehler

Da es diese Version auch online gibt

Gültig

Ich verstehe nicht:

Klasse Beispiel wobei T: struct,IDisapsable IDisapsable ein Werttyp ist?

class Sample wobei T: Klasse wobei U:struct,T T ein Referenztyp ist. Warum U zusammen mit dem Werttyp einschränken?

Ich hoffe, Sie können mich korrigieren

Das Obige ist C#-Generika Der Inhalt der Einschränkungen wird ausführlich mit Bildern und Texten vorgestellt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Active Directory mit C# Active Directory mit C# Sep 03, 2024 pm 03:33 PM

Leitfaden zu Active Directory mit C#. Hier besprechen wir die Einführung und die Funktionsweise von Active Directory in C# sowie die Syntax und das Beispiel.

Zufallszahlengenerator in C# Zufallszahlengenerator in C# Sep 03, 2024 pm 03:34 PM

Leitfaden zum Zufallszahlengenerator in C#. Hier besprechen wir die Funktionsweise des Zufallszahlengenerators, das Konzept von Pseudozufallszahlen und sicheren Zahlen.

C#-Serialisierung C#-Serialisierung Sep 03, 2024 pm 03:30 PM

Leitfaden zur C#-Serialisierung. Hier besprechen wir die Einführung, die Schritte des C#-Serialisierungsobjekts, die Funktionsweise bzw. das Beispiel.

C#-Datenrasteransicht C#-Datenrasteransicht Sep 03, 2024 pm 03:32 PM

Leitfaden zur C#-Datenrasteransicht. Hier diskutieren wir die Beispiele, wie eine Datenrasteransicht aus der SQL-Datenbank oder einer Excel-Datei geladen und exportiert werden kann.

Muster in C# Muster in C# Sep 03, 2024 pm 03:33 PM

Leitfaden zu Mustern in C#. Hier besprechen wir die Einführung und die drei wichtigsten Arten von Mustern in C# zusammen mit ihren Beispielen und der Code-Implementierung.

Primzahlen in C# Primzahlen in C# Sep 03, 2024 pm 03:35 PM

Leitfaden zu Primzahlen in C#. Hier besprechen wir die Einführung und Beispiele von Primzahlen in C# sowie die Codeimplementierung.

Fakultät in C# Fakultät in C# Sep 03, 2024 pm 03:34 PM

Leitfaden zur Fakultät in C#. Hier diskutieren wir die Einführung in die Fakultät in C# zusammen mit verschiedenen Beispielen und Code-Implementierungen.

Der Unterschied zwischen Multithreading und asynchronem C# Der Unterschied zwischen Multithreading und asynchronem C# Apr 03, 2025 pm 02:57 PM

Der Unterschied zwischen Multithreading und Asynchron besteht darin, dass Multithreading gleichzeitig mehrere Threads ausführt, während asynchron Operationen ausführt, ohne den aktuellen Thread zu blockieren. Multithreading wird für rechenintensive Aufgaben verwendet, während asynchron für die Benutzerinteraktion verwendet wird. Der Vorteil des Multi-Threading besteht darin, die Rechenleistung zu verbessern, während der Vorteil von Asynchron nicht darin besteht, UI-Threads zu blockieren. Die Auswahl von Multithreading oder Asynchron ist von der Art der Aufgabe abhängt: Berechnungsintensive Aufgaben verwenden Multithreading, Aufgaben, die mit externen Ressourcen interagieren und die UI-Reaktionsfähigkeit asynchron verwenden müssen.

See all articles