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