共用方式為


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 可見的實值型別中使用非公用欄位

請參閱

其他資源

與 Unmanaged 程式碼互通