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

主要内容

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

1. 类型的转换构造器

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

一般用于:

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

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

使用方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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#中还提供了显示和隐式的转换方法。

隐式转换的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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());
        }
    }
}

显式转换的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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类型作为一个典型来研究。

posted @   wang_yb  阅读(571)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示