时间:2021-05-20
由于是多态对象,基类类型的变量可以保存派生类型。 要访问派生类型的实例成员,必须将值强制转换回派生类型。 但是,强制转换会引发 InvalidCastException 风险。 C# 提供模式匹配语句,该语句只有在成功时才会有条件地执行强制转换。 C# 还提供 is 和 as 运算符来测试值是否属于特定类型。
下面的示例演示如何使用模式匹配 is 语句:
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 { }class Program{ static void Main(string[] args) { 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"); } }}前面的示例演示了模式匹配语法的一些功能。 if (a is Mammal m) 语句将测试与初始化赋值相结合。 只有在测试成功时才会进行赋值。 变量 m 仅在已赋值的嵌入式 if 语句的范围内。 以后无法在同一方法中访问 m。 前面的示例还演示了如何使用 as 运算符将对象转换为指定类型。
也可以使用同一语法来测试可为 null 的值类型是否具有值,如以下示例所示:
前面的示例演示了模式匹配用于转换的其他功能。 可以通过专门检查 null 值来测试 NULL 模式的变量。 当变量的运行时值为 null 时,用于检查类型的 is 语句始终返回 false。 模式匹配 is 语句不允许可以为 null 值的类型,如 int? 或 Nullable<int>,但你可以测试任何其他值类型。 上述示例中的 is 模式不局限于可为空的值类型。 也可以使用这些模式测试引用类型的变量具有值还是为 null。
前面的示例还演示如何在变量为其他类型的 switch 语句中使用类型模式。
如果需要测试变量是否为给定类型,但不将其分配给新变量,则可以对引用类型和可以为 null 的值类型使用 is 和 as 运算符。 以下代码演示如何在引入模式匹配以测试变量是否为给定类型前,使用 C# 语言中的 is 和 as 语句:
正如你所看到的,将此代码与模式匹配代码进行比较,模式匹配语法通过在单个语句中结合测试和赋值来提供更强大的功能。 尽量使用模式匹配语法。
以上就是c# 使用模式匹配以及 is 和 as 运算符安全地进行强制转换的详细内容,更多关于c# 强制转换的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
as运算符类似于强制转换操作。但是,如果无法进行转换,则as返回null而非引发异常。as运算符只执行引用转换和装箱转换。as运算符无法执行其他转换,如用户定义
C#条件运算符是指什么呢?让我们首先从概念上了解C#条件运算符: ?:运算符称为条件运算符。有时,它也称为三元运算符。 conditional-expr
在C#中常用到的运算符有条件运算符,is运算符,as运算符,typeof运算符等等,接下来在文章中将为大家具体介绍各个运算符的使用方法条件运算符条件运算符用(&
VB.NET中的除法运算符有两个:/(浮点除法)、\(整数除法)C#中的除法运算符只有一个:/(除法)VB.NET中的除法运算符与C#中的除法运算符存在很大的差
注意啦,C#中的??运算符是和?:运算符是不同的,这两者是有区别的。 ??运算符称为null合并运算符,用于定义null值的类型和引用类型的默认值。 只