參考
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; } } }
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語言程序設計》,據說發行量有超過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......余下全文>>