Dart-Typtestoperatoren

Überblick der drei Operatoren (as /is/is!)

OperatorFunktionsbeschreibung
asErzwungene Typumwandlung; kann auch zum Definieren von Bibliotheksaliasen verwendet werden
isTypprüfung: Gibt true zurück, wenn das Objekt dem angegebenen Typ entspricht
is!Typprüfung: Gibt true zurück, wenn das Objekt nicht dem angegebenen Typ entspricht

Bedingung für eine gültige Prüfung obj is T: Das Objekt obj implementiert oder erbt den Typ T (einschließlich Oberklassen, Schnittstellen und Nullable-Typen).

Beispiel: Beliebiges Objekt is Object? ergibt immer true.

Der is-Operator

Sichere Typüberprüfung

Prüft den Laufzeittyp eines Objekts; bei Ergebnis true kann das Objekt innerhalb des Codeblocks direkt als dieser Typ verwendet werden, ohne manuelle Umwandlung. Ist das Objekt null oder stimmt der Typ nicht überein, wird false zurückgegeben – es wird keine Ausnahme ausgelöst.

Im folgenden Beispiel werden Klassenobjekte benutzt. Wenn Sie Klassen noch nicht gelernt haben, stellen Sie sich diese einfach als Vorlagen zum Erstellen von Daten vor.

class Person {
  String firstName = '';
}

class Employee extends Person {}

void main() {
  dynamic employee = Employee();

  // Typprüfung mit is
  if (employee is Person) {
    // Innerhalb des Zweigs wird employee automatisch als Person erkannt
    employee.firstName = "Jack";
    print(employee.firstName); // Gibt Jack aus
  }

  dynamic emptyObj = null;
  if (emptyObj is Person) {
    // Wird nicht ausgeführt, null passt nicht zu Person
    print("Übereinstimmung gefunden");
  }
}Code-Sprache: Dart (dart)

Dieser Code definiert eine Klasse Person und anschließend eine abgeleitete Klasse Employee.

Im Code prüft is, ob ein Objekt vom Typ Person ist. Ist dies wahr, können Sie es im Codeblock {} direkt als Person nutzen. Grund dafür ist die dynamische Typdeklaration dynamic employee = Employee();.

Beim zweiten Beispiel dynamic emptyObj = null; ist der Wert null, also ergibt emptyObj is Person false und der Code in {} wird nicht ausgeführt.

Der is!-Operator

Umgekehrte Typüberprüfung

Syntax:

Variable is! Typ

Es entspricht genau der Negation des Ergebnisses von is.

Gleichbedeutend mit !(Variable is Typ) – prüft, ob das Objekt nicht dem Zieltyp entspricht.

Sehen Sie sich das Beispiel an:

class Person {
  String name = '';
}

void main() {
  dynamic obj = "Text";
  if (obj is! Person) {
    print("obj ist kein Objekt vom Typ Person");
  }
}Code-Sprache: Dart (dart)

In diesem Beispiel wird der Code im Block ausgeführt und „obj ist kein Objekt vom Typ Person“ ausgegeben, da obj keine Instanz ist, die aus der Person-Vorlage erstellt wurde.

Der as-Operator

Erzwungene Typumwandlung

Verwendung:

(Variable as Zieltyp).Eigenschaft/MethodeCode-Sprache: JavaScript (javascript)

Nutzen Sie diesen Operator nur, wenn Sie zu 100 % sicher sind, dass das Objekt dem Zieltyp entspricht. Andernfalls wird eine Laufzeitausnahme ausgelöst. Aus Gründen der Programmrobustheit sollte er nicht übermäßig eingesetzt werden.

class Teacher {
  String name = '';
}

void main() {
  dynamic jason = Teacher();
  // Erzwinge Umwandlung nach Teacher, um auf die Eigenschaft zuzugreifen
  (jason as Teacher).name = "Jason";
  print((jason as Teacher).name); // Jason
}Code-Sprache: Dart (dart)

Dieses Beispiel gibt Jason aus

Wir erstellen direkt eine Teacher-Instanz mit dynamic jason = Teacher();, also können wir garantieren, dass es sich um einen Teacher handelt – hier treten keine Fehler auf.

Der folgende Code erzeugt einen Fehler.

class Teacher {
  String name = '';
}

class Car {
  String name = '';
}

void main() {
  dynamic jason = Teacher();
  
  // Erzwinge Umwandlung nach Car, um auf die Eigenschaft zuzugreifen
  (jason as Car).name = "Jason";//❌Fehler
  print((jason as Car).name); //❌Fehler
}Code-Sprache: Dart (dart)

Der Fehler entsteht, da jason ursprünglich ein Teacher-Objekt ist, wir aber versuchen, es zwangsweise in Car umzuwandeln.

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Unhandled exception:
type 'Teacher' is not a subtype of type 'Car' in type cast
#0      main (file:///D:/dartdemo/firstdart/bin/firstdart.dart:12:10)
#1      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#2      _RawReceivePort._handleMessage (dart:isolate-patch/isolate-patch.dart:193:12)Code-Sprache: PHP (php)

Kernvergleich von as und is

// Schreibweise 1: Erzwungene Umwandlung mit as
(employee as Person).firstName = 'Bob';

// Schreibweise 2: Zuerst prüfen mit is, dann verwenden
if (employee is Person) {
  employee.firstName = 'Bob';
}Code-Sprache: JavaScript (javascript)

Verhalten, wenn employee gleich null oder kein Objekt vom Typ Person ist:

  • Variante mit as: Es wird eine CastError ausgelöst und das Programm stürzt ab;
  • Variante mit is: Der if-Zweig wird nicht ausgeführt, es gibt keinen Fehler und keine Aktion.

Obwohl der Code etwas länger wird, bevorzugen Sie die Variante mit is – sie sorgt für eine stabilere Programmausführung.

Zweite Verwendung von as

Zweite Verwendung von as

as dient nicht nur der Typumwandlung: Beim Importieren von Bibliotheken können Sie damit einen Bibliotheksalias vergeben

import 'dart:math' as math;

void main() {
  // Klassen/Methoden über den Bibliotheksalias aufrufen
  print(math.pi); // Gibt 3.141592653589793 aus
}Code-Sprache: JavaScript (javascript)

Vollständiges Beispiel zum Abschluss

class Animal {}
class Cat extends Animal {}

void main() {
  dynamic obj = Cat();

  // 1. Prüfung mit is
  if (obj is Animal) {
    print("obj ist ein Objekt vom Typ Animal");
  }

  // 2. Umgekehrte Prüfung mit is!
  if (obj is! String) {
    print("obj ist keine Zeichenkette");
  }

  // 3. Erzwungene Umwandlung mit as
  Animal a = obj as Animal;

  // Fehlerbeispiel, führt zum Absturz
  dynamic str = "hello";
  // Animal error = str as Animal; // Löst CastError aus
}Code-Sprache: JavaScript (javascript)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert