Partilhar via


CA1407: evitar membros estáticos em tipos visíveis COM

TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

Categoria

Microsoft.Interoperability

Alteração Significativa

Sem quebra

Causa

Um tipo que é marcado como especificamente visível ao Component Object Model (COM) contém um método de publicstatic .

Descrição da Regra

COM o não oferece suporte a métodos de static .

Esta regra ignora acessadores de propriedade e de evento, métodos de sobrecarregamento de operador, ou métodos que são marcados usando o atributo de ComRegisterFunctionAttribute ou atributo de ComUnregisterFunctionAttribute .

Por padrão, os seguintes são visíveis à: os assemblies, tipos de chaves pública, membros públicos da instância do no utilitário, e todos os membros de tipos de valor públicos.

Para que essa regra ocorra, um nível de assembly ComVisibleAttribute deve ser definido como false e a classe ComVisibleAttribute deve ser definida como true, porque o código a seguir mostra.

using System;
using System.Runtime.InteropServices; 

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

Como Corrigir Violações

Para corrigir uma violação desta regra, alterar o design para usar um método de instância que fornece a mesma funcionalidade que o método de static .

Quando Suprimir Alertas

É seguro suprimir um aviso dessa regra se um cliente COM não requer acesso à funcionalidade fornecida pelo método de static .

Violação de exemplo

Descrição

O exemplo a seguir mostra um método de static que viola esta regra.

Código

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

Comentários

Neste exemplo, o método de Book.FromPages não pode ser chamado COM.

Correção de exemplo

Descrição

Para corrigir a violação no exemplo anterior, você pode alterar o método a um método de instância, mas isso não faz sentido nesse caso.A melhor solução é aplicar explicitamente ComVisible(false) para o método para tornar claro para outros desenvolvedores que o método não pode ser considerado COM.

O exemplo a seguir aplica ComRegisterFunctionAttribute para o método.

Código

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

Regras Relacionadas

CA1017: marcar assemblies com ComVisibleAttribute

CA1406: evitar argumentos Int64 para clientes do Visual Basic 6

CA1413: evitar campos não públicos em tipos de valor visíveis COM

Consulte também

Outros recursos

Interoperação com código não gerenciado