程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [小技巧]讓C#的空值處理變得更優雅,

[小技巧]讓C#的空值處理變得更優雅,

編輯:C#入門知識

[小技巧]讓C#的空值處理變得更優雅,


參考

http://www.codeproject.com/Articles/739772/Dynamically-Check-Nested-Values-for-IsNull-Values?msg=4895299#xx4895299xx

http://devtalk.net/csharp/chained-null-checks-and-the-maybe-monad/

 

介紹

C#中的空值處理,一直是一件比較讓人不爽的工作。假設現在有如下類:

public class Union { public string Name { get; set; } }

  public class Dep {
        public Union Union { get; set; }
        public string Name { get; set; } }

  public  class Person
    {
        public  Dep Dep { get;set;}
        public string Name { get; set; }
    }

 

如果Person.Dep.Union.Name.Length>5,則寫入日志,代碼該怎麼寫呢?很可能是這樣:

 if (person != null && person.Dep != null && person.Dep.Union != null && person.Dep.Union.Name != null && person.Dep.Union.Name.Length > 5)
            {
                Console.WriteLine(person.Dep.Union.Name);
            }

 

邏輯語句寫得多的各位,對於這樣寫的繁瑣應該深有體會。

 

對策

1擴展方法在訪問對象前,會先進入其對應的靜態方法。可以很方便的對this參數進行判斷和處理,而不引起nullreference異常;

2委托可以很好的進行擴展方法的後續動作。

我們可以這樣寫上面的語句

             person
                .GoTo(p => p.Dep.Union.Name)
                .If(n => n.Length >= 5)
                .Do(Console.WriteLine);

 

很簡潔,是不是?怎麼實現呢?只需加入下列擴展類: 

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;

namespace LinqTesting
{
    public static class Helper
    {
        class IsNullVisitor : ExpressionVisitor
        {
            public bool IsNull { get; private set; }
            public object CurrentObject { get; set; }

            protected override Expression VisitMember(MemberExpression node)
            {
                //it will call this overrided method with higher level node
                base.VisitMember(node);
                if (CheckNull())
                    return node;

                var member = (PropertyInfo)node.Member;
                CurrentObject = member.GetValue(CurrentObject, null);
                CheckNull();
                return node;
            }

            private bool CheckNull()
            {
                if (CurrentObject == null)
                    IsNull = true;

                return IsNull;
            }
        }

        public static TReturn GoTo<T, TReturn>(this T root, Expression<Func<T, TReturn>> funcGetValue)
        {
            var visitor = new IsNullVisitor();
            visitor.CurrentObject = root;
            visitor.Visit(funcGetValue);
            if (visitor.IsNull)
                return default(TReturn);

            return (TReturn)visitor.CurrentObject;
        }

        public static TInput If<TInput>(this TInput o, Func<TInput, bool> evaluator)
          where TInput : class
        {
            if (o == null) return null;
            return evaluator(o) ? o : null;
        }

        public static TInput Unless<TInput>(this TInput o, Func<TInput, bool> evaluator)
          where TInput : class
        {
            if (o == null) return null;
            return evaluator(o) ? null : o;
        }

        public static TInput Do<TInput>(this TInput o, Action<TInput> action)
        where TInput : class
        {
            if (o == null) return null;
            action(o);
            return o;
        }
    }
}

 

 

dota中的一些小技巧

1.如果你和DOOM對線,無論你前期占了多少便宜,5級請果斷裝孫子,慫塔、刷野、游走過度到6級,並適當提醒隊友。
2.和鳳凰對線,請盡量帶上大藥膏。
3.和蝙蝠對線,一盡快帶上小魔棒二不要讓油疊得過多三不要過分相信自己的塔,兵壓到你塔下的時候也是你最危險的時候。
4.90%以上的英雄1級的時候可以點的SF生活不能自理。
5.有些英雄我們可以稱他們為反殺之王,JUGG/LUNA/TINY,請不要被紅血誘惑,要殺他們請卡技能CD。
6.永遠不要糾結隊友怎麼加點怎麼出裝。能配合你殺死對手就是好隊友。
7.路人請不要盲目跟風311分路。很多時候這就是悲劇的開始。
8.永遠不要一根筋用一個英雄只想著出那一套裝備。克制物理DPS有羊刀有綠杖,克制法系英雄有紫苑,克制消耗英雄有梅肯有笛子。每局開始你有認真打開計分板看過對陣英雄嗎?
9.關於暗影薩滿的大招,前期用來推一座塔比殺一個英雄要有用的多。(前期積累經濟優勢,壓縮對手空間)而中後期用來配合隊友打GANK打團則比較劃算。(後期對方英雄復活復活時間長,殺死對手直接變成以多打少局面,後期等級高裝備好抗塔也不算什麼)
10.關於炸彈人。這個英雄是用來打團的,而不是只用來陰人的。當你能理解的時候,就不會在乎對手有沒有眼有沒有寶石。
11.單遇到小魚人,真眼要比粉有用的多,很多時候就地插下真眼就能秒了他,而撒一下粉的結果就是你被殺掉了.
12.如果你是一名SOLO英雄,尤其是邊路1V2,請不要隨意和對方以命換命(FB除外).當你1換1時,對方另一名會吃到更多的經驗並且在接下來的時間裡free farm.
13.有些英雄縱然1V2也不會怕你們,比如巫妖、巫醫。 可能你或者你隊友單個上能輕松帶走對手,而當你們一起上的時候則是你們被帶走。
14.螞蟻這個英雄具有很強的越塔強殺能力。R的召喚物有很高的仇恨,它可以讓你追到對方塔下並安逸的A對手不被攻擊。使用螞蟻上了R追殺的時候,尤其是追一些控制、爆發危險性英雄時,不要C碰到人馬上就進行普通攻擊,應該往前追讓C保持久一點等它持續時間結束再攻擊。CD時間+對手反應時間會讓你游刃有余。否則可能就是你被帶走。
15.VS的E具有2個功能,1開視野,2破甲進行物理輸出。很多時候當你使用E的時候就是突襲的開始。否則請你不要沒事亂E。這不是消耗型AOE技能,你是在提醒對手你來了嗎?
16.關於PUCK的F,大多數時候請保持手動,除非你需要躲TK的激光又或者走在路上防止ZEUS的大招防止小強等隱身流英雄偷襲。 另外F躲錘子看到錘子出來可以不用F等到它飛過來,輕按F一下就可以繼續進行攻擊了,多出的1-2秒時間夠你做很多事。TA的隱匿沙王的埋沙同理。
17.人馬、斧王之流需要被攻擊觸發自身的被動技能。有一個清兵技巧是:站兵堆裡,A地圖上你可以看到的任何一個敵方英雄然後迅速S掉(無論他們在不在你附近),這樣小兵就會被你勾引對你進行攻擊從而觸發你的被動技能。
18.巨牙海民的大招是一個持續性BUFF,你完全可以在使用雪球滾他之前先開好大招以避免滾過去R了後被對手走脫的尴尬,尤其是前期雪球等級不夠高眩暈不夠長。
19.遇到對手有暗牧或全能,基本上你想無視他們殺掉他的隊友是不可能的。盡情的丟技能先秒他們吧,或者眩暈、沉默他們,請保持理智。同樣惡心的英雄還有小精靈,如果他連了一個物理DPS隊友,比如拍拍比如神靈,你需要做的不是和他的隊友硬拼,請限制住他的隊友然後先秒小精靈。否則你就等著被1V5吧。
20.修補匠和大多數SOLO位到6就是大爺的英雄不同,TK的貢獻期不是在......余下全文>>
 

學習C語言技巧

  這是以前看到的一篇文章,感覺很好。不過裡面很多說都絕版了上網慢慢找吧

  程序員之路——如何學習C語言並精通C語言

  程序員之路——如何學習C語言
  學習C語言不是一朝一夕的事情,但也不需要花費十年時間才能精通。如何以最小的代價學習並精通C語言是本文的主題。請注意,即使是“最小的代價”,也絕不是什麼捷徑,而是以最短的時間取得最多的收獲,同時也意味著你需要經歷艱苦的過程。

  一、要讀就讀好書,否則不如不讀

  所有初學者面臨的第一個問題便是:如何選擇教材。好的開始是成功的一半,選擇一本優秀的教材是事半功倍的關鍵因素。不幸的是,學校通常會幫你指定一本很差勁的C語言課本;而幸運的是,你還可以再次選擇。

  大名鼎鼎的譚浩強教授出了一本《C語言程序設計》,據說發行量有超過400萬,據我所知,很多學校都會推薦這本書作為C語言課本。雖然本人的名字(譚浩宇)跟教授僅僅一字之差,但我是無比堅定地黑他這本書的。這本書不是寫給計算機專業的學生的,而是給那些需要考計算機等級考試的其它專業學生看的。這本書的主要缺點是:例子程序非常不專業,不能教給你程序設計應該掌握的思考方式;程序風格相當地不好,會讓你養成亂寫代碼的惡習;錯誤太多,曾經有人指出過這本書的上百個錯誤,其中不乏關鍵的概念性錯誤。好了,這本書我也不想說太多了,有興趣大家可以百度一下:)

  Kernighan和Ritchie的《The C Programming Language》(中譯名《C程序設計語言》)堪稱經典中的經典,不過舊版的很多內容都已過時,和現在的標准C語言相去甚遠,大家一定要看最新的版本,否則不如不看。另外,即使是最經典最權威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊》是十分必要的。《C語言參考手冊》就是《C Reference Manual》,是C語言標准的詳細描述,包括絕大多數C標准庫函數的細節,算得上是最好的標准C語言的工具書。順便提一句,最新的《C程序設計語言》是根據C89標准修訂的,而《C語言參考手冊》描述的是C99標准,二者可能會有些出入,建議按照C99標准學習。還有一本《C和指針》,寫得也是相當地不錯,英文名是《Pointers on C》,特別地強調指針的重要性,算是本書的一個特點吧。不過這本書並不十分適合初學者,如果你曾經學過C語言,有那麼一些C語言的基礎但又不是很扎實,那麼你可以嘗試一下這本書。我相信,只要你理解了指針,C語言便不再神秘。

  如果你已經啃完了一本C語言教材,想要更進一步,那麼有兩本書你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊子,內容非常非常地有趣。要注意一點,這本書是二十多年前寫成的,裡面提到的很多C語言的缺陷都已被改進,不過能夠了解一些歷史也不是什麼壞事。然後你可以挑戰一下《Expert C Programming》(中譯名《C專家編程》),書如其名,這本書頗具難度,一旦你仔細讀完並能透徹理解,你便可以放心大膽地在簡歷上寫“精通C語言”了。

  切記一個原則,不要讀自己目前還看不懂的書,那是浪費生命。如果你看不懂,那你一定是缺失了某些必需基礎知識。此時,你要仔細分析自己需要補充哪些內容,然後再去書店尋找講述的這些內容的書籍。把基礎知識補充完畢再回頭來學習,才會真正的事半功倍。

  二、Unix/Linux還是Windows,這是個很大的問題

  不同的編程環境會造就出不同思維的程序員。Windows的程序員大多依賴集成開發環境,比如Visua......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved