• 【.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 = 1001;
                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 = 5;
                wk.Num2 = 7;
    
                // 赋值时要强制转换
                int n = (int)wk;
                Console.WriteLine($"计算结果:{n}");

    同样的,在正常情况下,Work类是复合类型,也不可能强制转换为int值,但由于在类中有自定义转换,所以使用强制转换是可以完成转换的。

    其实,.net库中有许多类型也定义了这两种转换,比如WPF中,动画时间线对象的Duration属性就可以TimeSpan进行隐式转换。

    别小看这个基本知识点,经验表明,这东东在实际应用中很有用。

    示例代码下载

  • 相关阅读:
    XML文件的操作说明
    IIS中如何应用程序启用https协议
    sql server中的数据类型转换函数
    sql语句中的join连接(左连接、右连接、全连接、内连接)
    sql语句中日期相减的操作
    C# NameValueCollection集合
    json的两种表示结构(对象和数组).。
    ASP.NET中一般处理程序报的错误:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值
    C#中类的实例是不能 获取到类中的静态方法和静态变量(Static)的,及原因
    《好好学Java 从零基础到项目实战》姗姗而来
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/5042525.html
Copyright © 2020-2023  润新知