照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老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. Angular企业级开发(5)-项目框架搭建

    1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...

  2. SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

    目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...

  3. Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持

    Jexus 是一款运行于 Linux 平台,以支持  ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...

  4. PowerShell过滤文件中的重复内容

    Get-Content -Path E:\test11\data.txt | Sort-Object | Get-Unique 源文件: AA0001 2014-06-30 15:27:13.073 ...

  5. unity 3d 解析 json

    官网案例传送门 我这里不过是借花献佛,案例官网就有. using UnityEngine; using System.Collections; public class json : MonoBeha ...

  6. Android中的flexboxlayout布局

    提到FlexboxLayout大家估计有点模糊,它是谷歌最近开源的一个android排版库,它的前身Flexbox是2009年W3C提出了一种新的布局,可以简便.完整.响应式的实现页面布局,Flexb ...

  7. i++、++i 、i--、--i

    总结: i++ 先用后加, ++i先加后用: i--先用后减, --i先减后用: //int i = 1; //Console.WriteLine(i);//1 //Console.WriteLine ...

  8. 自制Azure中国版“加血包”

    Micrsoft Azure中国版的国际出口最近升级为电话线拨号模式,目测为10个用户共享一条56kb的电话线拨号链路.有图有真相: 中国的IT从业者,有三分之一的职业生涯时间是在跟网络斗智斗勇.这点 ...

  9. [学习笔记]JavaScript之函数式编程

    欢迎指导与讨论:) 前言 函数式编程能使我们的代码结构变得简洁,让代码更接近于自然语言,易于理解. 一.减少不必要的函数嵌套代码 (1)当存在函数嵌套时,若内层函数的参数与外层函数的参数一致时,可以这 ...

  10. jQuery.data() 使用方法

    data() 方法向被选元素附加数据,或者从被选元素获取数据.在实际开发中,可以用来记录上一步操作某一对象的值,来给下一步操作做一些判断 $("#btn1").click(func ...