CA1407:避免在 COM 可見型別中使用靜態成員
型別名稱 |
AvoidStaticMembersInComVisibleTypes |
CheckId |
CA1407 |
分類 |
Microsoft.Interoperability |
中斷變更 |
中斷 |
原因
特別標記為元件物件模型 (COM) 可見的型別會包含 public static 方法。
規則描述
COM 不支援 static 方法。
此規則會忽略屬性 (Property) 和事件存取子、運算子多載方法,或是使用 System.Runtime.InteropServices.ComRegisterFunctionAttribute 屬性 (Attribute) 或 System.Runtime.InteropServices.ComUnregisterFunctionAttribute 屬性 (Attribute) 所標記的方法。
根據預設,COM 可以看見下列各項:組件、公用型別、公用型別中的公用執行個體 (Instance) 成員,和公用實值型別的所有成員。
為了引發這個規則,必須將組件層級 (Assembly-level) 的 ComVisibleAttribute 設定為 false,並將類別的 ComVisibleAttribute 設定為 true,如下列程式碼所示。
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class MyClass
{
public static void DoSomething()
{
}
}
}
如何修正違規
若要修正此規則的違規情形,請將設計變更為使用可提供與 static 方法相同功能的執行個體方法 (Instance Method)。
隱藏警告的時機
如果 COM 用戶端不需要存取 static 方法所提供的功能,您可以放心地隱藏這項規則的警告。
範例違規
描述
下列範例顯示違反此規則的 static 方法。
程式碼
using System;
using System.Runtime.InteropServices;
using System.Collections.ObjectModel;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class Book
{
private Collection<string> _Pages = new Collection<string>();
public Book()
{
}
public Collection<string> Pages
{
get { return _Pages; }
}
// Violates this rule
public static Book FromPages(string[] pages)
{
if (pages == null)
throw new ArgumentNullException("pages");
Book book = new Book();
foreach (string page in pages)
{
book.Pages.Add(page);
} return book;
}
}
}
註解
在此範例中,無法從 COM 呼叫 Book.FromPages 方法。
範例修正
描述
若要修正上一個範例內的違規情形,您可以將方法變更為執行個體方法 (Instance Method),但是這麼做在此執行個體內並無意義。 較佳的方式是明確地將 ComVisible(false) 套用至方法,以確保其他開發人員無法從 COM 看見方法。
下列範例會將 ComRegisterFunctionAttribute 套用至方法。
程式碼
using System;
using System.Runtime.InteropServices;
using System.Collections.ObjectModel;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class Book
{
private Collection<string> _Pages = new Collection<string>();
public Book()
{
}
public Collection<string> Pages
{
get { return _Pages; }
}
[ComVisible(false)]
public static Book FromPages(string[] pages)
{
if (pages == null)
throw new ArgumentNullException("pages");
Book book = new Book();
foreach (string page in pages)
{
book.Pages.Add(page);
}
return book;
}
}
}
相關規則
CA1017:以 ComVisibleAttribute 標記組件
CA1406:避免對 Visual Basic 6 用戶端使用 Int64 引數
CA1413:避免在 COM 可見的實值型別中使用非公用欄位