【.NET深呼吸】基础:自定义类型转换
照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老TMD写技术有什么了不起的,人人都会写。后来老周想想,也确实,代码谁不会写,能写到有品位有感悟,就不容易做到。于是,老周接受了该朋友的建议。
有初入职场的弟弟妹妹们经常诉苦,为啥,因为常常被人骂,被老员工骂,被老板骂。好像自己做的事永远都是错的,于是感觉很受打击,很伤心。
这里老周必须提醒各位,小伙子应该坚强一点,小妹妹们也不要过于绝望,千万不要因为这些事情去做傻事。西湖景观很美,“欲把西湖比西了,淡妆浓抹总相宜”,但是,如果有人跳西湖自杀的话,真是大煞风景,破坏自然天道。你可不要当这种千古罪人,而且要多想想父母,把你养这么大,你如果觉这种轻生的行为也是孝道的话,那你去死吧,老周不拦你。
初入职场,谁不是天天被人骂的,遥想老周当年,经常早上一到办公室,打开电脑,然后抬头一看,墙上的纸板上列出了老周上个月的十大罪状,妈的,写得像法院判决书似的,那架势,简直要吃人的姿态。
至于那老员工,平时受老板的气,现在你进来了,不拿你来发泄找谁去。人最可怕的就是情绪的奴役,尤其是职场上的压力。而比这更可怕的是,现代人真的在很多地方比不上古人,现在的人遇到不顺心的事,不懂得如何去化解和调整,要么乱来,要么自我毁灭;要么沉迷于酒色,要么沉迷于网络游戏。究其根本,就是精神世界太空白,平时又不多读书,人家孔老头都说了,修身齐家治国平天下,你呢,连修身都没做好,还吹什么牛逼呢?一屋不扫,何以扫天下?
老周被人骂的时候,就站在那里听着,听完后,心里没有任何感觉,晚上回家读几首诗就把白天的事忘得一干二净了。职场嘛,你应该练就这种本领。
记得老周做得最猛,也最为光荣的一件事,大约在2011年初吧,某天一到办公室,习惯地抬头看看纸板,发现多了几个写得很难看的大字——“粗枝大叶”。我就知道经理又在说我了。中午下班后,我就到对面马路找我的朋友,她在那里开了个少儿书画培训班。我去她那里找了宣纸和毛笔,然后写上四个大字——“卧薪尝胆”,随后请她吃了饭作为答谢。
下午上班后回到办公室,我就把刚写好的几个大楷直接贴在经理写的几个丑字上面,然后继续工作。
第二天早上,经理进来看到了我写的那几个大字,就在我耳边说了句:“你小子,真有你的。” 正好那个时候,老周也想换个环境,所以老周向经理承诺,把近期的项目完成后,写后各种文档,以供后面来的人接手,就很洒脱地离开了公司。
老周一直以为,那天经理应该生气了。谁曾想,相隔几年后,2015年5月,我在亲戚的婚宴上偶遇经理,以及几位旧同事。我就很坦白地问经理:“那件事,你当时是不是很生气?” 经理放下筷子,说:“倒不是,是很惊讶。你那几个字现在还在那里,你有空可以来办公室看看。” 然后咱们就聊了些有的没的一堆闲话,比如搞IT教育如何如何,怎么培训新员工之类的。我感觉经理现在对我的态度很友善,和几年前完全相反。
故事讲完了,老周只是实话实说,至于说老周做得对不对,你自己参考吧。
=======================================================
今天说一个基础知识,我记得,我的烂书《精通C#》里面介绍过自定义类型转换的内容,书名有点夸张,老周不喜欢这名字,但出版社喜欢,我也没办法。
实现自定义类型转换可以通过重载运算符来解决。有两种转换方式:
1、隐式转换:就像子类实例可以直接赋给基类变量一样,不需要写任何强制转换的东东,通过赋值就能够自动转换类型。
2、显式转换:必须手动写上强制转换,才能完成类型的转换。比如 int x = (int)dv;
好,咱们用实例说话,先来个隐式转换的。
假设我定义了一个Product类,表示一种产品的信息。
public class Product
{
public int ProID { get; set; } public string ProName { get; set; } public float ProSize { get; set; }
}
我希望实现:可以将一个Product类隐式转换为string类型。可在类型中重载转换运算符。
public static implicit operator string(Product p)
{
return $"产品ID = {p.ProID},产品名称 = {p.ProName},产品尺寸 = {p.ProSize}";
}
和普通运算符重载差不多,都是声明为公共的,静态的,因为运算符是操作类型的,不是针对某个实例而设定的。要实现隐式转换,需要加上implicit关键字,转换运算符实际上是要转换的目标类型,此处是string,然后参与运算的操作数是Product实例。
下面,一起来见证一下奇迹。
static void Main(string[] args)
{
Product prd = new Product();
prd.ProID = ;
prd.ProName = "山货自行车";
prd.ProSize = 1.35f;
// 隐式转换为字符串
string str = prd;
// 输出
Console.WriteLine(str);
Console.Read();
}
得到结果如下。

正常情况下,Product实例是不能转换为string的,但由于我上面定义隐式转换的运算符重载,使得这一赋值成为可能。
string str = prd;
如果使用显式转换,则在使用时必须明确注明强制转换。
假设一个Work类,代码如下:
public class Work
{
public int Num1 { get; set; } public int Num2 { get; set; } public static explicit operator int(Work w)
{
return w.Num1 * w.Num2;
}
}
显式转换重载和前面隐式转换差不多,只是要把implicit关键字换成explicit关键字。下面可以测试一下。
Work wk = new Work();
wk.Num1 = ;
wk.Num2 = ; // 赋值时要强制转换
int n = (int)wk;
Console.WriteLine($"计算结果:{n}");
同样的,在正常情况下,Work类是复合类型,也不可能强制转换为int值,但由于在类中有自定义转换,所以使用强制转换是可以完成转换的。
其实,.net库中有许多类型也定义了这两种转换,比如WPF中,动画时间线对象的Duration属性就可以TimeSpan进行隐式转换。
别小看这个基本知识点,经验表明,这东东在实际应用中很有用。
【.NET深呼吸】基础:自定义类型转换的更多相关文章
- [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换
[.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...
- AutoMapper搬运工之自定义类型转换
前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NE ...
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
[源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...
- Struts2自定义类型转换,和处理类型转换错误
Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自 ...
- [Struts2学习笔记] -- 自定义类型转换
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- C#构造函数、操作符重载以及自定义类型转换
构造器 构造器(构造函数)是将类型的实例初始化的特殊方法.构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容. 实例构造器 顾名思义,实例构造器的作用就是对类型的实例进行初始化.如果类没有显示 ...
- java struts2入门学习---自定义类型转换
自定义类型转换器的作用就是将struts无法识别的类型转换成自己所需要的. 比如输入:广东-东莞-虎门,对应的输出时能输出:广东省 东莞市 虎门(镇/区) 这里涉及到的知识点即是将String转换为任 ...
- mybatis generator 生成javabean自定义类型转换
因为默认mybatis generator自动生成的,带小数的都转成了bigdecimal了,而且长度不同的整数转成了不同的类型. 但是我想要带小数的转成double,整数转成integer. 所有自 ...
- Mybatis使用自定义类型转换Postgresql
Mybatis使用自定义类型转换Postgresql 主要目的 为了解决从数据库取出来之后再手动转换为javaBean的问题. 主要用mybatis提供的Handler来把处理前置 添加转换类 imp ...
随机推荐
- vue2.0实践的一些细节
最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...
- VisualVM通过jstatd方式远程监控远程主机
配置好权限文件 [root@test bin]# cd $JAVA_HOME/bin [root@test bin]# vim jstatd.all.policy grant codebase &qu ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- 小白解决CENTOS7错误:Cannot find a valid baseurl for repo: base/7/x86_6
刚入手的MacBook想着学点东西,本汪还是决定玩玩CentOS服务器,安装好了VirtualBox + CentOS. 打开一看,懵逼了!命令行! 行吧,先装个图形界面: $sudo yum gro ...
- HTML DOM 介绍
本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...
- 23种设计模式--责任链模式-Chain of Responsibility Pattern
一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...
- jdb调试scala代码的简单介绍
在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...
- Android之解析XML
1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...
- MySQL数据库罕见的BUG——Can't get hostname for your address
在连接mysql jdbc时候,抛出了 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communicat ...
- postgresql无法安装pldbgapi的问题
要对函数进行调试需要安装插件pldbgapi,当初在windows上面的postgresql实例中执行了一下语句就安装上了: create extension pldbgapi; 但是在linux中执 ...