• 《CLR Via C# 第3版》笔记之(八) 类型的转换构造器和方法


    主要内容

    • 类型的转换构造器
    • 显式/隐式的转换操作符

    1. 类型的转换构造器

    类型转换构造器是指 通过一种类型(比如Type1)的实例来构造另一种类型(比如Type2)的实例。

    一般用于:

    1) Type1和Type2之间没有继承关系,但是仍然希望从Type1转换到Type2

    2) Type1和Type2是完全不同的两种类型

    使用方法如下:

    using System;
    
    namespace cnblog_bowen
    {
        public class CLRviaCSharp_8
        {
            static void Main(string[] args)
            {
                Type1 t1 = new Type1(10);
                t1.Show();
    
                // 通过Type1 来构造 Type2
                Type2 t2 = new Type2(t1);
                t2.Show();
                Console.ReadKey(true);
            }
        }
    
        public class Type1
        {
            private Int32 type1_n;
            public int Type1_n { get { return type1_n; } }
    
            public Type1(Int32 n)
            {
                type1_n = n;
            }
    
            public void Show()
            {
                Console.WriteLine("type1_n = " + type1_n.ToString());
            }
        }
    
        public class Type2
        {
            private Int32 type2_n;
    
            // 类型转换构造器,根据Type1来构造Type2
            public Type2(Type1 t1)
            {
                type2_n = t1.Type1_n + 10;
            }
    
            public void Show()
            {
                Console.WriteLine("type2_n = " + type2_n.ToString());
            }
        }
    }

    显示结果如下:

    image

    2. 显式/隐式的转换操作符

    我们可以看出 通过构造器来完成类型的转换并不是很灵活。

    其实C#中还提供了显示和隐式的转换方法。

    隐式转换的代码如下:

    using System;
    
    namespace cnblog_bowen
    {
        public class CLRviaCSharp_8
        {
            static void Main(string[] args)
            {
                Type1 t1 = new Type1(10);
                t1.Show();
    
                // 通过隐式转换将Type1转为Type2
                Type2 t2 = t1;
                t2.Show();
                Console.ReadKey(true);
            }
        }
    
        public class Type1
        {
            private Int32 type1_n;
            public int Type1_n { get { return type1_n; } }
    
            public Type1(Int32 n)
            {
                type1_n = n;
            }
    
            public void Show()
            {
                Console.WriteLine("type1_n = " + type1_n.ToString());
            }
        }
    
        public class Type2
        {
            private Int32 type2_n;
    
            // 类型转换构造器,根据Type1来构造Type2
            public Type2(Type1 t1)
            {
                type2_n = t1.Type1_n + 10;
            }
    
            // implicit关键字表示是隐式转换
            public static implicit operator Type2(Type1 t1)
            {
                return new Type2(t1);
            }
    
            public void Show()
            {
                Console.WriteLine("type2_n = " + type2_n.ToString());
            }
        }
    }

    显式转换的代码如下:

    using System;
    
    namespace cnblog_bowen
    {
        public class CLRviaCSharp_8
        {
            static void Main(string[] args)
            {
                Type1 t1 = new Type1(10);
                t1.Show();
    
                // 通过显式转换将Type1转为Type2
                Type2 t2 = (Type2)t1;
                t2.Show();
                Console.ReadKey(true);
            }
        }
    
        public class Type1
        {
            private Int32 type1_n;
            public int Type1_n { get { return type1_n; } }
    
            public Type1(Int32 n)
            {
                type1_n = n;
            }
    
            public void Show()
            {
                Console.WriteLine("type1_n = " + type1_n.ToString());
            }
        }
    
        public class Type2
        {
            private Int32 type2_n;
    
            // 类型转换构造器,根据Type1来构造Type2
            public Type2(Type1 t1)
            {
                type2_n = t1.Type1_n + 10;
            }
    
            // explicit关键字表示是显式转换
            public static explicit operator Type2(Type1 t1)
            {
                return new Type2(t1);
            }
    
            public void Show()
            {
                Console.WriteLine("type2_n = " + type2_n.ToString());
            }
        }
    }

    通过显式/隐式转换操作符来进行类型转换时需要注意两点:

    1)显式/隐式转换函数必须是public

    2)显式/隐式转换函数必须是static

    为了更好的理解转换操作符和操作符重载方法,强烈建议将System.Decimal类型作为一个典型来研究。

  • 相关阅读:
    Python的内置模块itertools
    列表的sort()和sorted()方法
    Python面试
    数据分析相关概念
    数据分析中Numpy,Pandas,Matplotlib,scripy和Scikit-Learn等数据处理库...
    mysql数据库的语法及简介
    Cannot add foreign key constraint
    MySQL数据库重装
    MySQL数据库在Python中的操作
    Python中的取整函数
  • 原文地址:https://www.cnblogs.com/wang_yb/p/2094048.html
Copyright © 2020-2023  润新知