2018年3月22日

C# lock (typeof (Object)) CA2002

在 IBatisNet內看到這樣的用法:
lock (typeof (SqlMapper))
{
  ...
}

程式碼分析給出了 CA2002
不知道為什麼會寫出 lock typeof object的東西,這樣真的能鎖住東西?

C# 巢狀 Using 的程式碼分析警告 CA2202

使用 Visual Studio的程式碼分析(Code Analysis)功能,如果程式碼中有使用巢狀 using時:
using (StreamReader sr = new StreamReader(inputStream))
{
  using (CsvReader csvReader = new CsvReader(sr))
  {
    ..
  }
}
就會出現警告 CA2202:不要多次處置物件的 Dispose方法

但是在 MSDN的這篇 IDisposable.Dispose Method ()說明中寫道:如果一個物件被多次呼叫 Dispose方法,第一次之後的呼叫都會被忽略

 If an object's Dispose method is called more than once, the object must ignore all calls after the first one. The object must not throw an exception if its Dispose method is called multiple times. Instance methods other than Dispose can throw an ObjectDisposedException when resources are already disposed.

所以實際使用上是沒問題的
但是這樣在 Code Analysis就會卡著一個甚至多個警告訊息,看了很礙眼
那就在 function上加一個 SuppressMessage,讓這個警告不會再出現
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public byte[] FunctionName(...) {

好啦這是在 StackOverflow上挖出來的解法
但是討論串內要直接用 SuppressMessage,還是用醜一點的寫法解掉這個訊息,還是有很多爭論