Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Mivel az objektumok polimorfikusak, lehetséges, hogy egy alaposztálytípusú változó származtatott típust tárol. A származtatott típus példánytagok eléréséhez vissza kell adni az értéket a származtatott típusra. Azonban a gipszöntés létrehozza annak kockázatát, hogy dobjon egy InvalidCastException. A C# olyan mintamegfeleltetési utasításokat biztosít, amelyek feltételesen hajtanak végre egy leadást, csak akkor, ha az sikeres lesz. A C# a is és as operátorokat is biztosítja annak tesztelésére, hogy egy érték egy bizonyos típusú-e.
Az alábbi példa bemutatja, hogyan használhatja a mintaegyező is utasítást:
var g = new Giraffe();
var a = new Animal();
FeedMammals(g);
FeedMammals(a);
// Output:
// Eating.
// Animal is not a Mammal
SuperNova sn = new SuperNova();
TestForMammals(g);
TestForMammals(sn);
// Output:
// I am an animal.
// SuperNova is not a Mammal
static void FeedMammals(Animal a)
{
if (a is Mammal m)
{
m.Eat();
}
else
{
// variable 'm' is not in scope here, and can't be used.
Console.WriteLine($"{a.GetType().Name} is not a Mammal");
}
}
static void TestForMammals(object o)
{
// You also can use the as operator and test for null
// before referencing the variable.
var m = o as Mammal;
if (m != null)
{
Console.WriteLine(m.ToString());
}
else
{
Console.WriteLine($"{o.GetType().Name} is not a Mammal");
}
}
class Animal
{
public void Eat() { Console.WriteLine("Eating."); }
public override string ToString()
{
return "I am an animal.";
}
}
class Mammal : Animal { }
class Giraffe : Mammal { }
class SuperNova { }
Az előző minta a mintamegfelelő szintaxis néhány funkcióját mutatja be. Az if (a is Mammal m) utasítás egyesíti a tesztet egy inicializálási hozzárendeléssel. A hozzárendelés csak akkor történik meg, ha a teszt sikeres. A változó m csak a beágyazott if utasítás hatókörében található, ahol hozzárendelték. Később nem férhet hozzá m ugyanazon metóduson belül. Az előző példa azt is bemutatja, hogyan konvertálhat egy objektumot egy adott típusra az as operátorral .
Ugyanazt a szintaxist is használhatja a teszteléshez, ha egy null értékű értéktípus értéke van, ahogy az alábbi példában is látható:
int i = 5;
PatternMatchingNullable(i);
int? j = null;
PatternMatchingNullable(j);
double d = 9.78654;
PatternMatchingNullable(d);
PatternMatchingSwitch(i);
PatternMatchingSwitch(j);
PatternMatchingSwitch(d);
static void PatternMatchingNullable(ValueType? val)
{
if (val is int j) // Nullable types are not allowed in patterns
{
Console.WriteLine(j);
}
else if (val is null) // If val is a nullable type with no value, this expression is true
{
Console.WriteLine("val is a nullable type with the null value");
}
else
{
Console.WriteLine("Could not convert " + val.ToString());
}
}
static void PatternMatchingSwitch(ValueType? val)
{
switch (val)
{
case int number:
Console.WriteLine(number);
break;
case long number:
Console.WriteLine(number);
break;
case decimal number:
Console.WriteLine(number);
break;
case float number:
Console.WriteLine(number);
break;
case double number:
Console.WriteLine(number);
break;
case null:
Console.WriteLine("val is a nullable type with the null value");
break;
default:
Console.WriteLine("Could not convert " + val.ToString());
break;
}
}
Az előző minta bemutatja a minták illesztésének egyéb funkcióit, amelyeket a konverziókkal való használat során lehet alkalmazni. A null mintához tartozó változót tesztelheti kifejezetten az null érték ellenőrzésével. Amikor a változó futásidejű értéke null, egy is utasítás, amely típust ellenőriz, mindig visszaadja false. A mintamegfeleltetési is utasítás nem engedélyezi a null értékű típust, például int? vagy Nullable<int>, de bármely más értéktípust tesztelhet. Az is előző példában szereplő minták nem korlátozódnak a null értékű értékekre. Ezekkel a mintákkal azt is tesztelheti, hogy egy referenciatípusú változó rendelkezik-e valamilyen értékkel, vagy null.
Az előző minta azt is bemutatja, hogyan használja a típusmintát egy switch utasításban, amelyben a változó számos különböző típus egyike lehet.
Ha azt szeretné tesztelni, hogy egy változó egy adott típus-e, de nem rendeli hozzá egy új változóhoz, használhatja az és is az as operátorokat referenciatípusokhoz és nullértékű értéktípusokhoz. Az alábbi kód bemutatja, hogyan használható a is C# nyelv részét képező utasítások és as utasítások a mintaegyezés bevezetése előtt annak ellenőrzésére, hogy egy változó egy adott típusú-e:
// Use the is operator to verify the type.
// before performing a cast.
Giraffe g = new();
UseIsOperator(g);
// Use the as operator and test for null
// before referencing the variable.
UseAsOperator(g);
// Use pattern matching to test for null
// before referencing the variable
UsePatternMatchingIs(g);
// Use the as operator to test
// an incompatible type.
SuperNova sn = new();
UseAsOperator(sn);
// Use the as operator with a value type.
// Note the implicit conversion to int? in
// the method body.
int i = 5;
UseAsWithNullable(i);
double d = 9.78654;
UseAsWithNullable(d);
static void UseIsOperator(Animal a)
{
if (a is Mammal)
{
Mammal m = (Mammal)a;
m.Eat();
}
}
static void UsePatternMatchingIs(Animal a)
{
if (a is Mammal m)
{
m.Eat();
}
}
static void UseAsOperator(object o)
{
Mammal? m = o as Mammal;
if (m is not null)
{
Console.WriteLine(m.ToString());
}
else
{
Console.WriteLine($"{o.GetType().Name} is not a Mammal");
}
}
static void UseAsWithNullable(System.ValueType val)
{
int? j = val as int?;
if (j is not null)
{
Console.WriteLine(j);
}
else
{
Console.WriteLine("Could not convert " + val.ToString());
}
}
class Animal
{
public void Eat() => Console.WriteLine("Eating.");
public override string ToString() => "I am an animal.";
}
class Mammal : Animal { }
class Giraffe : Mammal { }
class SuperNova { }
Amint látható, a kód és a mintamegfelelő kód összehasonlításával a mintaegyeztetési szintaxis robusztusabb funkciókat biztosít a teszt és a hozzárendelés egyetlen utasításban való kombinálásával. Ha lehetséges, használja a mintamegfeleltetési szintaxist.