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