【.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進行隱式轉換。
別小看這個基本知識點,經驗表明,這東東在實際應用中很有用。
?
示例代碼下載
轉載于:https://www.cnblogs.com/tcjiaan/p/5042525.html
總結
以上是生活随笔為你收集整理的【.NET深呼吸】基础:自定义类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7硬盘分区
- 下一篇: WPF利用动画实现圆形进度条