《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类型作为一个典型来研究。



本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/archive/2011/06/30/2094048.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
C#
C#学习相关系列之数组---常用方法使用(二)
C#学习相关系列之数组---常用方法使用(二)
|
1月前
|
存储 C# 数据库
C# 生成唯一ID,有哪些方法?
【2月更文挑战第12天】
149 0
|
3月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
1月前
|
C#
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq常用方法---排序(一)
C#学习相关系列之Linq常用方法---排序(一)
|
1月前
|
开发框架 .NET 编译器
C#学习相关系列之匿名方法和Lambda表达式
C#学习相关系列之匿名方法和Lambda表达式
|
1月前
|
C#
C#中保留小数点后N位的方法_kaic
C#中保留小数点后N位的方法_kaic
|
1月前
|
存储 C# 开发者
C#变量类型
C#变量类型
18 0
|
3月前
|
C# Python
C# 笔记3 - 重载一系列像python那样的print()方法
C# 笔记3 - 重载一系列像python那样的print()方法
27 1