C#用户定义类型转换详解
发布时间:2022-06-07 11:44:32
C#用户定义类型转换
•用于自定义类和结构能够进行隐式转换和显示转换.例如:将一个自定义类类型转换成整型,浮点型等,反之亦然.
C#提供隐式转换和显式转换
•隐式转换:编译器自动执行转换
•显式转换:编译器只在使用显式转换运算符时才执行转换
声明隐式转换的语法如下.注:所有用户定义转换必须使用public和static修饰符
public static implicit operator TargetType(SourceType Identifier)
{
...
return ObjectOfTargetType;
}
TargetType:目标类型
参数Identitfier:源数据
例如,下面代码使一个int字面量被隐式转换为LimitedInt对象,反过来LimitedInt也可以隐式转换成一个int
class LimitedInt
{
const int MaxValue = 100;
const int MinValue = 0;
private int _theValue = 0;
//属性
public int TheValue
{
get { return _theValue; }
set
{
if (value < MinValue)
{
_theValue = 0;
}
else
{
_theValue = value > MaxValue ? MaxValue : value;
}
}
}
//隐式转换:将LimitedInt对象转为整型
public static implicit operator int(LimitedInt li)
{
return li.TheValue;
}
//隐式转换:将整型转换为LimitedInt对象
public static implicit operator LimitedInt(int x)
{
LimitedInt li = new LimitedInt();
li.TheValue = x;
return li;
}
}
class Program
{
static void Main(string[] args)
{
LimitedInt li = 500; //将500转换为LimitedInt
int value = li; //将LimitedInt转换为int
Console.WriteLine("li:{0},value:{1}", li.TheValue, value);
Console.ReadKey();
}
改代码输出结果:li:100,value:100
显示转换和强制转换运算符
前面所讲的都是隐式转换,如果你把运算符implcit改为explicit,你将不得不在实行转换时显示使用转换运算符
代码片段如下:
//显示转换:将LimitedInt对象转为整型
public static explicit operator int(LimitedInt li)
{
return li.TheValue;
}
//显示转换:将整型转换为LimitedInt对象
public static explicit operator LimitedInt(int x)
{
LimitedInt li = new LimitedInt();
li.TheValue = x;
return li;
}
static void Main(string[] args)
{
LimitedInt li = (LimitedInt)500; //将500强制转换为LimitedInt
int value = (int)li; //将LimitedInt强制转换为int
Console.WriteLine("li:{0},value:{1}", li.TheValue, value);
Console.ReadKey();
}
猜你喜欢
- 1、取得控制台应用程序的根目录方法方法1、Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径方法
- 树的同构备忘!定义:给定两棵树r1、r2,如果r1可以通过若干次的左子树和右子树互换,使之与r2完全相同,这说明两者同构。举例树的构造树可以
- FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化
- 用法一:常量在JDK1.5之前,我们定义常量都是:publicstaticfianl....。现在好了,有了枚举,可以把相关的常量分组到一个
- 使用flatMap列出子目录前面已经看到如何列出指定目录下的文件了。我们再来看下如何遍历指定目录的直接子目录(深度为1),先实现一个简单的版
- Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。一、当两个并发线程访问同一个
- 1.创建一个线程Java操作线程最核心的类就是Thread类创建线程有很多方法,下面我们写一个Mythread类继承 Thread 类重写r
- 方式一:例如:”0000123” (字符串必须全为数字)处理过程:String tempStr = "0000123";
- synchronized关键字synchronized,我们谓之锁,主要用来给方法、代码块加锁。当某个方法或者代码块使用synchroniz
- MyBatisMyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC
- 现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1、公钥加密,私钥解密;2、私钥加密,公钥解密。下面就为大家分析一
- 现在Web开发越来越倾向于前后端分离,前端使用AngularJS,React,Vue等,部署在NodeJS上,后面采用SpringBoot发
- 一、ArrayList简介在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:ArrayList底层是一段连
- Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无
- 类加载子系统classLoader 只负责对字节码文件的加载,至于是否可以运行,还要看执行引擎。加载的类信息存放于方法区的内存空间,除了类信
- 注意:适用于springboot或者springcloud框架1.首先下载相关文件2.然后需要去启动相关的启动文件3、导入相关jar包(如果
- 前言:封装、继承和多态是面向对象编程的三大特征。1.封装1.1.封装概念封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据
- 1.引言在开发中,拖放是一种比较常见的手势操作,使用它能够让应用的交互更加地便捷和友好,本文将简要介绍如何为Android中的View添加拖
- 1. 定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。2. 使用的
- 1:首先。创建一个springboot项目,这里我使用以及构建好基本框架的脚手架,打开是这个样子:Result类:已经封装好了三种返回类型的