RT,

你在閱讀 .NET/C#開源項目源碼的時候見過哪些高級寫法?


回想起來,.net的代碼我只用反射看過Windows Forms的,寫的不是很好。其餘的就是BCL,就是基礎類型啊容器這些,那是COM寫的。

大家一定要去看那個字元串的實現。


最近的應該是本地函數。

其他的就Interlocked,Semaphore、ThreadLocal和AsyncLocal


去微軟 dotnet/corefx 的代碼裏搜關鍵詞:workaround,就會發現,哦,原來微軟也是這麼寫代碼的……


http://Asp.Net Core裡面FIlter的實現呀,一個方法有600多行,裡面是個大的switch,然後30多個goto,然後裏面還嵌套了多個遞歸,亮瞎氪金眼。。。

我在架構班解讀源碼時,這個方法花了快3個小時才講完。。。

Microsoft.AspNetCore.Mvc.Infrastructure命名空間下的ResourceInvoker類,自己去看


我是覺得挺高級的,反正我是從來沒這麼寫過,代碼出處.net源碼,Environment類


我說一個吧,手機打字只能說個思想了……

就是.net core官方庫中log組件,用的是廣播的方式。

大家都照知道log的方式有很多種,有記文件、記資料庫、記錄到log系統等等方式。而日誌又分不同的等級。 官方庫應對這種多需求的方式是讓你自己實現不同的logger,由這個logger自己決定記錄什麼等級的日誌,如何記。

自己實現的logger添加到他的集合中,每次logger(業務代碼中從DI獲取的)被調用時,遍歷集合中的具體logger來實現廣播。這樣就能達到調用一個logger方法,向不同的logger系統記錄日誌。

===還有一個抽象介面加擴展的方式,看的人多了再更===


之前看到過微軟的一個開源項目裏用 ConcurrentDictionary 實現一個單例模式,示例代碼(不確定是否完全一樣,思想差不多):

public class Singleton2
{
private static readonly ConcurrentDictionary& Instances = new ConcurrentDictionary&();

private Singleton2()
{
}

public static Singleton2 GetInstance() =&> Instances.GetOrAdd(1, k =&> new Singleton2());
}

https://github.com/WeihanLi/DesignPatterns/tree/master/CreatePattern/SingletonPattern


真正的高級,就是寫正確的代碼


Immutable Stack ,一個不可變的stack容器。Eric Lippert 真滴厲害,看他blog,會有種:「哇,原來代碼還能這麼寫。」真的就是 fabulous adventure。

do-while-CompareExchange 線程同步模式:

private EventHandler& Click = null;
public void add_Click(EventHandler& value){
EventHandler& prevHandler;
EventHandler& click = this.Click;
do{
prevHandler = click;
var newHandler = (EventHandler&)Delegate.Combine(prevHandler, value);

click = Interlocked.CompareExchange(ref this.Click, newHandler, prevHandler);
}while(click != prevHandler);
}


Thead.Sleep(0)


你是想問語法糖嗎?這個沒啥高級的。


推薦閱讀:
相關文章