code-prettify

2014年7月25日 星期五

C# StyleCop System using directives must be placed before all other using directives.

一般我們的專案會像這樣,使用了很多的 using 參考。
這時候我們就會使用 Visual Stdio 內建的功能,對 Using 進行整理。
右鍵 > 組合管理 Using > 移除和排序


移除和排序後的樣子,很方便對吧!

 但是呢?StyleCop 出來抱怨了,
「System using directives must be placed before all other using directives.」。
也就是說,所有 System 相關的 using 必須放在最前面。


從前面的圖片可以看的出來,SocketLibaray 比 System 的字母順序還前面,所以排在 System 的前面了。
這樣我們就不能用 Visual Stdio 內建的排序了嗎?只能手動調整了嗎?
放心,其實 Visual Stdio 是有這個設定的,在功能選單內,
選項 > 文字編輯器 > C# > 進階 > 組合管理 Using > 排序 Using 時先放置 'System' 指示詞
將這個選項打勾,然後按下確定。



接著再對剛剛的 using 做一次排序,
噹噹!依照我們希望的順序,System 在前面了喔!
這麼一來 StyleCop 也不會報錯了呢。

C# StyleCop 忽略特定錯誤訊息

雖然 StyleCop 蠻方便的,但是有時候難免會出現誤報,
像是這一行 IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipHostInfo 就被判定為匈牙利命名法 (Hungarian notation),
這時候只能換另一個變數命名,
或者,使用 Suppress 忽略掉這個錯誤訊息。

在這個函式上方加上這一行
[SuppressMessage("StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "Reviewed.")]
就可以忽略掉這一個錯誤訊息。

至於每一次 StyleCop Rule 的 Suppress 要怎麼寫,
可以參考 StyleCop Rules Documentation ,
除了 Rule Suppressions 的說明之外,每個 Rule 最下方也有該 Rule 的Suppress 方法。
像是這次遇到的 SA1305 FieldNamesMustNotUseHungarianNotation 就是從這裡來的。

Reference
StyleCop
StyleCop Rules Documentation


C# 程式碼風格分析 StyleCop 與 Visual Studio Express 整合


首先到 http://stylecop.codeplex.com/ 網站下載並安裝 StyleCop,
安裝過程就下一步按到底就完成了。
如果你使用的 Visual Studio 不是 Express 版本 (Professional, Premium, Ultimate...etc),
這時候在 Visual Studio > 方案總管 裡面對著專案按下右鍵,就會出現 Run StyleCop,
詳細的說明請參考這篇文章  [Tool]程式碼風格分析-StyleCop

因為 Visual Studio Express 不支援任何 UI 方面的擴充功能 (Extensions),
所以就算安裝完之後,是不會有任何變化的。
這時候可以手動在專案檔 (.csproj) 上設定,讓每一次建置 (Build) 的時候都執行一次 StyleCop 檢查。

在專案檔裡面加上這一行:
<Import Project="$(ProgramFiles)\MSBuild\StyleCop\v4.7\StyleCop.targets" />

這麼一來,這個專案每次建置的時候,就會進行 StyleCop 檢查,錯誤訊息也會出現在 Visual Studio 的錯誤清單讓你檢視。當然,「檢示錯誤訊息」功能是不存在的,只能用錯誤代號自行查詢了。

延伸問題:
一、每個專案都要手動加上設定。
這點可以用靠修改範本讓新建立的專案都先加上設定,舊的就只能一個一個改。

二、如果這個專案在另一個沒有安裝 StyleCop 的電腦上建置,那專案就會建置失敗。
雖然可以透過 NuGet 安裝 StyleCop 來解決這個問題,但是考慮到 StyleCop Rule 的一致性,還是建議統一安裝 StyleCop。

Reference
StyleCop
Intergrating StyleCop with Visual Studio Express
[Tool]程式碼風格分析-StyleCop

2014年7月21日 星期一

C# Serialization

C# Serialzation

使用 C# 序列化物件

最近常遇到將物件序列化的問題,
想說乾脆將物件序列化的方法寫成一個工具,稱為 SerialzationHelper,
套上泛型就可以適用在所有的物件了。(當然該物件必須是 serializable 的才可以啦)

Book 是用來測試的可序列化類別,
Main 是使用序列化的過程,
SerialzationHelper 是序列化工具。

完整範例: Reference:
Basic Serialization
BinaryFormatter 類別
MemoryStream 類別
using Statement (C# Reference)