Condividi tramite


Evitare i membri statici nei tipi visibili a COM

Aggiornamento: novembre 2007

TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

Category

Microsoft.Interoperability

Breaking Change

NonBreaking

Causa

Un tipo specificatamente contrassegnato come visibile a COM contiene un metodopublicstatic.

Descrizione della regola

COM non supporta i metodi static.

Questa regola ignora le funzioni di accesso a proprietà ed eventi, i metodi di overload degli operatori o i metodi contrassegnati con l'attributo System.Runtime.InteropServices.ComRegisterFunctionAttribute o System.Runtime.InteropServices.ComUnregisterFunctionAttribute.

Per impostazione predefinita, i seguenti elementi sono visibili a COM: assembly, tipi pubblici, membri di istanza pubblici in tipi pubblici e tutti i membri di tipi di valore pubblici.

Per l'attivazione di questa regola, è necessario che un oggetto ComRegisterFunctionAttribute a livello di assembly sia impostato su false e che l'oggetto ComRegisterFunctionAttribute relativo a classe sia impostato su true come illustrato nel codice seguente.

using System;
using System.Runtime.InteropServices; 

[assembly: ComVisible(false)] 
namespace Samples
{    
    [ComVisible(true)]
    public class MyClass
    {
        public static void DoSomething()
        {
        }
    }
}

Correzione di violazioni

Per correggere una violazione di questa regola, modificare la progettazione in modo da utilizzare un metodo di istanza che fornisca la stessa funzionalità del metodo static.

Esclusione di avvisi

È consigliabile non visualizzare un avviso di questa regola se un client COM non deve accedere alla funzionalità fornita dal metodo static.

Esempio di violazione

Descrizione

Nell'esempio riportato di seguito viene dichiarato un metodo static che viola questa regola.

Codice

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;        
        }    
    }
}

Commenti

In questo esempio non è possibile chiamare il metodo Book.FromPages da COM.

Correzione di esempio

Descrizione

Per correggere la violazione nell'esempio precedente, è possibile impostare il metodo su un metodo di istanza. In questo caso specifico sarebbe tuttavia inutile. Una soluzione migliore consiste nell'applicare in modo esplicito ComVisible(false) al metodo per spiegare chiaramente agli altri sviluppatori che il metodo non è visibile da COM.

Nell'esempio riportato di seguito viene applicato ComRegisterFunctionAttribute al metodo.

Codice

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;
        }
    }
}

Regole correlate

Contrassegnare gli assembly con ComVisibleAttribute

Evitare gli argomenti Int64 per i client Visual Basic 6

Evitare i campi non pubblici nei tipi di valori visibili a COM

Vedere anche

Altre risorse

Interoperabilità con codice non gestito