照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老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深呼吸】基础:自定义类型转换的更多相关文章

  1. [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换

    [.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...

  2. AutoMapper搬运工之自定义类型转换

    前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NE ...

  3. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  4. Struts2自定义类型转换,和处理类型转换错误

    Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自 ...

  5. [Struts2学习笔记] -- 自定义类型转换

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  6. C#构造函数、操作符重载以及自定义类型转换

    构造器 构造器(构造函数)是将类型的实例初始化的特殊方法.构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容. 实例构造器 顾名思义,实例构造器的作用就是对类型的实例进行初始化.如果类没有显示 ...

  7. java struts2入门学习---自定义类型转换

    自定义类型转换器的作用就是将struts无法识别的类型转换成自己所需要的. 比如输入:广东-东莞-虎门,对应的输出时能输出:广东省 东莞市 虎门(镇/区) 这里涉及到的知识点即是将String转换为任 ...

  8. mybatis generator 生成javabean自定义类型转换

    因为默认mybatis generator自动生成的,带小数的都转成了bigdecimal了,而且长度不同的整数转成了不同的类型. 但是我想要带小数的转成double,整数转成integer. 所有自 ...

  9. Mybatis使用自定义类型转换Postgresql

    Mybatis使用自定义类型转换Postgresql 主要目的 为了解决从数据库取出来之后再手动转换为javaBean的问题. 主要用mybatis提供的Handler来把处理前置 添加转换类 imp ...

随机推荐

  1. Mediaplayer error (-19,0)

    Android MediaPlayer 发生 error (-19,0) 错误解决方法. 引起原因:由于多次实例化MediaPlayer.start() 进行播放操作引起的.由于没有及时释放内存资源导 ...

  2. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)

    上一节部署了 cirros-vm1 到 first_local_net,今天我们将再部署 cirros-vm2 到同一网络,并创建 second_local_net. 连接第二个 instance 到 ...

  3. nodejs利用ajax实现网页无刷新上传图片

    nodejs利用ajax实现网页无刷新上传图片 标签(空格分隔): nodejs 通常情况下上传图片是要通过提交form表单来实现的,但是这又不可避免的产生了网页转. 利用ajax技术和FormDat ...

  4. required

    required,这是HTML5中的一个新属性:这是HTML5中input元素中的一个属性. required译为必须的,在input元素中应用这一属性,就表示这一input元素节点是必填的或者必选的 ...

  5. Android的Kotlin秘方(I):OnGlobalLayoutListener

    春节后,又重新“开张”.各位高手请继续支持.谢谢! 原文标题:Kotlin recipes for Android (I): OnGlobalLayoutListener 原文链接:http://an ...

  6. iOS之解决崩溃Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.

    崩溃提示:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CAL ...

  7. Struts的拦截器

    Struts的拦截器 1.什么是拦截器 Struts的拦截器和Servlet过滤器类似,在执行Action的execute方法之前,Struts会首先执行Struts.xml中引用的拦截器,在执行完所 ...

  8. ASP.NET Aries JSAPI 文档说明:AR.DataGrid、AR.Dictionary

    AR.Global 文档 1:对象或属性: 名称 类型 说明 DG 对象 DataGrid操作对象 //datagrid集合,根据ID取出DataGrid对象,将Json当数组用. Items: ne ...

  9. 如何让我们的PHP在Jexus中跑起来

    最近一段时间,经常看到不少的朋友在问,应该怎么设置才能够让Jexus支持PHP.其实,Jexus在很早之前就已经是可以支持PHP,像Apache或Nginx一样充当PHP的Web服务器的.不过由于没有 ...

  10. 如何利用mono把.net windows service程序迁移到linux上

    How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...