• 18. C# 转换


    1.重载转换运算符

    到目前为止,我们使用的类型转换,包括隐式类型转换和显示类型转换都是在两个相关的类中进行的,这几个类要么是简单类型之间的转换,比如int 隐式转换成double,要么是有继承关系,或者是实现了接口。假如我们要在两个不相关的类之间进行转换,可以重载转换运算符。

        class ConvClass1
        {
            public int Val;
    
            /// <summary>
            /// 定义ConvClass2隐式转换为ConvClass2的方式
            /// </summary>
            /// <param name="c1"></param>
            /// <returns></returns>
            public static implicit operator ConvClass2(ConvClass1 c1)
            {
                ConvClass2 c = new ConvClass2();
                c.Val = c1.Val;
                return c;
            }
        }
    
        class ConvClass2
        {
            public double Val;
    
            /// <summary>
            /// 定义ConvClass2显示式转换为ConvClass1的方式
            /// </summary>
            /// <param name="c1"></param>
            /// <returns></returns>
            public static explicit operator ConvClass1(ConvClass2 c1)
            {
                ConvClass1 c = new ConvClass1();
                checked { c.Val = (int)c1.Val; }
                return c;
            }
        }
    
        class Program
        {
    
            static void Main(string[] args)
            {
    
                ConvClass1 c1 = new ConvClass1();
                c1.Val = 5;
                ConvClass2 c2 = c1;//ConvClass1隐式转换为ConvClass2
    
                ConvClass2 d = new ConvClass2();
                d.Val = 8.88;
                ConvClass1 d1 = (ConvClass1)d;//ConvClass2显示转换为ConvClass1,如果val的值超过了int的范围会引发一个报错
    
                Console.ReadLine();
            }
        }

    2.as运算符

    as运算符把一种类型转换为指定的引用类型,如果不能转换返回null,as 运算符只使用以下几种情况:

    <operand> as <type>

    1)<operand>的类型是<type>;

    2) <operand>可以隐式转换为<type>;

    3)<operand>可以封箱为<type>。

        class Program
        {
    
            static void Main(string[] args)
            {
                D d = new D();
                A a = d;
    
                D dd = a as D;//a 是D类型,可以转换
    
                MyInterface i = a as MyInterface;// a 可以隐式转换成MyInterface
    
                int j = 1;
                object o = j as object;//j可以封箱为object 
    
                Console.ReadLine();
            }
        }
    
        interface MyInterface
        { }
    
        class A : MyInterface
        { 
        
        }
    
        class D : A { }

    as运算符非常有用,因为一般的类型转换如果转换不了会抛出异常,需要处理异常,as 运算符如果转换不了返回null,只需要判断是不是null就可以了,少了处理异常的代码。

  • 相关阅读:
    344. 反转字符串
    942. 增减字符串匹配
    CGO内部机制
    CGO函数调用
    CGO类型转换
    CGO基础
    Go net/http代理
    GO-中间件(Middleware )
    Go如何巧妙使用runtime.SetFinalizer
    ARM基础
  • 原文地址:https://www.cnblogs.com/lidaying5/p/10606507.html
Copyright © 2020-2023  润新知