zoukankan      html  css  js  c++  java
  • C#类型检查和强制转换以及模式匹配

    在C#中可以使用以下运算符和表达式来执行类型检查或类型转换:

    • is 运算符:检查表达式的运行时类型是否与给定类型兼容,语法是:E is T

    如现有变量high,if(high is int){int++;}

    • as 运算符:用于将表达式显式转换为给定类型(如果其运行时类型与该类型兼容)语法是:E as T(等效于:E is T ? (T)(E) : (T)null

    比较以上可知,is只是检查给定类型是否可转换为给定类型,as运算符将表达式结果显式转换为给定的引用或可以为 null 的值类型

    • 强制转换表达式(cast expression):执行显式转换,语法是:(T)E

    在运行时,显式转换可能不会成功,强制转换表达式可能会引发异常。这是也是强制转换和as的区别,as 运算符永远不会引发异常。

    在这里再说一下模式匹配(pattern matching)

    模式匹配可以理解为类型检查的扩展,当测试值匹配某种类型时,将创建一个该类型的变量(这是和以上as和强制转换的区别)

    有is类型模式,语法是 E IS T varname,如下代码:
      

    public static double ComputeAreaModernIs(object shape)
    {
    if (shape is Square s)
    return s.Side * s.Side;
    else if (shape is Circle c)
    return c.Radius * c.Radius * Math.PI;
    else if (shape is Rectangle r)
    return r.Height * r.Length;
    // elided
    throw new ArgumentException(
    message: "shape is not a recognized shape",
    paramName: nameof(shape));
    }

    switch语句,如下代码:

    public static double ComputeArea_Version3(object shape)
    {
    switch (shape)
    {
    case Square s when s.Side == 0:
    case Circle c when c.Radius == 0:
    return 0;

    case Square s:
    return s.Side * s.Side;
    case Circle c:
    return c.Radius * c.Radius * Math.PI;
    default:
    throw new ArgumentException(
    message: "shape is not a recognized shape",
    paramName: nameof(shape));
    }
    }

    模式匹配扩展了switch语句的使用范围

     

    博客备忘,一起成长。
  • 相关阅读:
    Shiro 集成Spring 使用 redis时 使用redisTemplate替代jedisPool(五)
    shiro 实现 网站登录记住我功能 学习记录(四)
    magento2根据属性id或code来添加options
    微信小程序-注册程序app.js
    微信小程序-目录结构
    如何在最新的PHP 7.1.0上安装和运行最新的Magento 2.1.3
    添加新的php版本到wamp中
    全局使用php
    PHP设计模式之单例模式
    SourceTree使用
  • 原文地址:https://www.cnblogs.com/lumingprince/p/14103682.html
Copyright © 2011-2022 走看看