Evitar membros estático em tipos visíveis com.
TypeName |
AvoidStaticMembersInComVisibleTypes |
CheckId |
CA1407 |
Category (Categoria) |
Microsoft.interoperabilidade |
Quebrando alterar |
Não-separáveis |
Causa
A type that is specifically marked as visible to COM contains a publicstatic method.
Descrição da regra
COM não oferece suporte a static métodos.
Esta regra ignora a propriedade e acessadores de evento, o sobrecarga de operador de métodos ou métodos marcados com um a System.Runtime.InteropServices.ComRegisterFunctionAttribute atributo ou a System.Runtime.InteropServices.ComUnregisterFunctionAttribute atributo.
Por padrão, é visível para COM o seguinte: assemblies, tipos públicos, os membros de instância pública em tipos públicos e todos os membros de tipos de valor público.
Para esta regra acionar um nível de assembly ComRegisterFunctionAttribute deve ser definido sistema autônomo falsee a classe- ComRegisterFunctionAttribute definido sistema autônomo true sistema autônomo mostra o código seguinte.
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 dessa regra, alterar o design para usar um método de instância que oferece a mesma funcionalidade que o static método.
Quando suprimir avisos
É seguro eliminar um aviso essa regra se um cliente COM não precisar de acesso à funcionalidade fornecida pelo static método.
Violação de exemplo
Descrição
O exemplo a seguir mostra um static método que violam essa 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, a Book.FromPages método não pode ser chamado do COM.
Correção de exemplo
Descrição
Para corrigir a violação no exemplo anterior, você poderia alterar o método para um método de instância, mas que não faz sentido nesta instância.Uma solução melhor é aplicar explicitamente ComVisible(false) o método para torná-la, desmarcar essa opção para outros desenvolvedores que o método não estiver visível do COM.
O exemplo seguinte aplica ComRegisterFunctionAttribute 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
Marcar assemblies com ComVisibleAttribute
Evitar Int64 argumentos para os clientes do Visual Basic 6
Evite campos não públicos em tipos de valor visível COM