• C#自定义转换(implicit 或 explicit)


      C#的类型转换分为显式转换和隐式转换,显式转换需要自己声明转换类型,而隐式转换由编译器自动完成,无需我们声明,如:  

        //long需要显式转换成int
        long l = 1L;
        int i = (int)l;
    
        //int可以隐式的转换成long
        int i = 1;
        long l =;

      我们还可以自定义显式转换和隐式转换,分别采用 explicit 和 implicit 关键字来实现,格式:  

        //显式转换
        public static explicit operator Type_A(Type_B b)
        {
            return Instance_Of_Type_A;
        }
        //隐式转换
        public static implicit operator Type_A(Type_B b)
        {
            return Instance_Of_Type_A;
        }

      其中 Type_A 和 Type_B 是不同的类型,且必须有一个类型是当前包含这个转换的类型,如:  

        public class ClassA
        {
            public string Description { get; set; }
    
            public static implicit operator ClassA(ClassB classB) => new ClassA() { Description = "implicit from ClassB to ClassA:" + classB.Description };
            public static implicit operator ClassA(string description) => new ClassA() { Description = "implicit from string to ClassA:" + description };
            public static implicit operator ClassB(ClassA classA) => new ClassB() { Description = "implicit from ClassA to ClassB:" + classA.Description };
            public static implicit operator string(ClassA classA) => "implicit from ClassA to string:" + classA.Description;
    
            public override string ToString() => Description;
        }
        public class ClassB
        {
            public string Description { get; set; }
    
            public static explicit operator ClassB(string description) => new ClassB() { Description = "explicit from string to ClassB:" + description };
            public static explicit operator string(ClassB classB) => "explicit from ClassB to string:" + classB.Description;
    
            public override string ToString() => Description;
        }
        static void Main(string[] args)
        {
            //隐式转换
            {
                ClassA classA = "string";//字符串隐式转换成ClassA
                Console.WriteLine(classA as object);
    
                string description = new ClassA() { Description = "ClassA" };//ClassA隐式转换成字符串
                Console.WriteLine(description);
    
                ClassA classA1 = new ClassB() { Description = "ClassB" };//ClassB隐式转换成ClassA
                Console.WriteLine(classA1 as object);
    
                ClassB classB = new ClassA() { Description = "ClassA" };//ClassA隐式转换成ClassB
                Console.WriteLine(classB as object);
    
                //输出:
                //implicit from string to ClassA:string
                //implicit from ClassA to string:ClassA
                //implicit from ClassB to ClassA:ClassB
                //implicit from ClassA to ClassB:ClassA
            }
    
            //显式转换
            {
                ClassB classB = (ClassB)"string";//字符串显式转换成ClassB
                Console.WriteLine(classB as object);
    
                string description = (string)new ClassB() { Description = "ClassB" };//ClassB显式转换成字符串
                Console.WriteLine(description);
    
                //输出:
                //explicit from string to ClassB:string
                //explicit from ClassB to string:ClassB
            }
        }

      注:自定义的转换在开发中不常见,在一些第三方包、插件、框架中比较常见,但是有一个需要注意的点:is 和 as 运算不受自定义类型转换的影响,如:

        static void Main(string[] args)
        {
            //值类型int可以隐式转换成long,==判断为true,但是is判断为false
            int i = 1;//int
            long l = i;//int可以隐式转换为long
            Console.WriteLine(l == i);//true
            Console.WriteLine(i is long);//false
    
            ClassA classA = new ClassA() { Description = "ClassA" };
            ClassB classB = classA;//ClassA隐式转换成ClassB
            Console.WriteLine(classB as object);//implicit from ClassA to ClassB:ClassA
            Console.WriteLine(classA is ClassB);//false
        }
    一个专注于.NetCore的技术小白
  • 相关阅读:
    C# 显式创建线程 or 使用线程池线程--new Thread() or ThreadPool.QueueUserWorkItem()
    B树、B-树、B+树、B*树详解
    C# Volatile 类
    volatile(C# 参考)
    C#中volatile的用法
    C#编程总结(六)异步编程
    C#编程总结(五)多线程带给我们的一些思考
    C#编程总结(三)线程同步
    C#编程总结(二)多线程基础
    C#编程总结(一)序列化
  • 原文地址:https://www.cnblogs.com/shanfeng1000/p/14978416.html
Copyright © 2020-2023  润新知