C#中自定义类型转换
2021/9/12 17:05:19
本文主要是介绍C#中自定义类型转换,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
类型转换有两种,隐式转换和显示转换,当没有数据丢失的时候,隐式转换会自动进行。C#允许用户定义自己的数据类型(结构和类),那么在他们之间的类型转换需要用户自己定义。
C#中基本类型转换:点击打开链接
1、类型转换定义:public static implicit / explicit operator type1(type2 para){ return }
注意:
(1)、与运算符重载类似,使用 public 和 static ,表示与类相关的公有操作,使用 operator 关键字;
(2)、implicit 表示隐式转换,explicit 表示显示转换,遵循的原则与预定义的类型转换一致,当没有数据丢失的时候使用 implicit ,否则使用 explicit ;
(3)、type1 表示 目标类型,type2 表示 源类型,需要用 return 返回 type1 类型对象。
下面给出自定义类与值类型的转换定义:
// 自定义的一个类 public class MyClass1 { // uint 类型字段 a public uint a; // int 类型字段 b public int b; // 自定义构造函数 public MyClass1(uint a,int b) { this.a = a; this.b = b; } // 自定义的显示转换:将 MyClass1 类型的对象转换成 int 类型 public static explicit operator int(MyClass1 obj) { // 实际上是将 字段 a 的值通过基本类型的强制转换,变成 int 类型的返回值 return (int)obj.a; } // 自定义的隐式转换: 将 MyClass1 类型的对象转换成 float 类型 public static implicit operator float(MyClass1 obj) { // 实际上是将 字段 b 的值转换成float,因为 int 转 float 是隐式的,所以定义的时候可以定义为 implicit return obj.b; } }
下面给出调用示例:
// 声明并初始化 MyClass1 类的对象 MyClass1 myClass = new MyClass1(1,11); // 调用自定义的显示转换 int a = (int)myClass; // a = 1 // 调用自定义的隐式转换 float b = myClass; // b = 11
2、类之间自定义类型转换
当两个类之间没有派生关系时(有派生关系时,转换已经存在),可以在源类型或者是派生类型中定义类型转换。
注意:
(1)、两个类之间没有派生关系时才可以自定义类型转换;
(2)、类型转换在源类型或目标类型中定义,可以分开定义,但是两个类中不能定义相同的类型转换。
下面给出示例:
- // 自定义的类 MyClassA
- public class MyClassA
- {
- // 如果 MyClassB 中没有这个与这个相同的转换,这里可以给出
- // public static explicit operator MyClassB(MyClassA obj)
- // {
- // return new MyClassB();
- // }
- }
- // 自定义的类 MyClassB
- public class MyClassB
- {
- // 定义的显示类型转换,返回一个 MyClassA 类型的对象
- public static explicit operator MyClassA(MyClassB obj)
- {
- return new MyClassA();
- }
- // 定义的显示类型转换,返回一个 MyClassB 类型的对象
- public static explicit operator MyClassB(MyClassA obj)
- {
- return new MyClassB();
- }
- }
- // 声明并初始化一个 MyClassB 类对象
- MyClassB myClassB = new MyClassB();
- // 使用 强制类型转换
- MyClassA myClassA = (MyClassA)myClassB;
- MyClassB myClassB1 = (MyClassB)myClassA;
注意:派生类可以隐式转换成基类。基类转换成派生类时,只有基类引用指向该派生类对象时可以转换成功,其他的会抛出异常。
下面给出示例:
- // 基类
- public class MyBase
- {
- }
- public class MySub1:MyBase
- {
- }
- public class MySub2:MyBase
- {
- }
- // 基类的引用指向基类的对象
- MyBase myBase = new MyBase();
- // MySub1 类型的对象隐式转换成了 MyBase 类型
- MyBase myBase1 = new MySub1();
- // MySub2 类型的对象隐式转换成了 MyBase 类型
- MyBase myBase2 = new MySub2();
- // 因为 MyBase 引用的是本类的对象,执行的时候会抛出异常
- MySub1 mySubA = (MySub1)myBase;
- // 可以执行
- MySub1 mySubA1 = (MySub1)myBase1;
- // 因为 MyBase 引用的是 MySub2 类型的对象,执行的时候会抛出异常
- MySub1 mySubA2 = (MySub1)myBase2;
==
这篇关于C#中自定义类型转换的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID