CA1407: Statische Member in für COM sichtbaren Typen vermeiden
TypeName |
AvoidStaticMembersInComVisibleTypes |
CheckId |
CA1407 |
Kategorie |
Microsoft.Interoperability |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Typ, der ausdrücklich als für Component Object Model (COM) sichtbar markiert ist, enthält eine public static Methode.
Regelbeschreibung
COM unterstützt keine static-Methoden.
Bei der Überprüfung dieser Regel werden Eigenschaften- und Ereignisaccessoren, Methoden für Operatorüberladungen oder mit dem System.Runtime.InteropServices.ComRegisterFunctionAttribute-Attribut oder dem System.Runtime.InteropServices.ComUnregisterFunctionAttribute-Attribut markierte Methoden ignoriert.
Standardmäßig sind folgende Programmierelemente für COM sichtbar: Assemblys, öffentliche Typen, öffentliche Instanzmember in öffentlichen Typen und alle Member öffentlicher Werttypen.
Damit diese Regel eintritt, müssen ein ComVisibleAttribute auf Assemblyebene auf false und das ComVisibleAttribute auf Klassenebene auf true festgelegt werden. Siehe dazu folgendes Codebeispiel:
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class MyClass
{
public static void DoSomething()
{
}
}
}
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ändern Sie das Design dahingehend, dass eine Instanzenmethode verwendet wird, die die gleiche Funktionalität wie die static-Methode bereitstellt.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn ein COM-Client nicht auf die von der static-Methode bereitgestellte Funktionalität zugreifen muss.
Beispiel für einen Verstoß
Beschreibungen
Im folgenden Beispiel wird eine static-Methode veranschaulicht, die gegen diese Regel verstößt.
Code
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;
}
}
}
Kommentar
Im folgenden Beispiel kann die Book.FromPages-Methode nicht aus COM aufgerufen werden.
Beispiel für die Behandlung
Beschreibungen
Um den Verstoß im vorigen Beispiel zu behandeln, könnten Sie die Methode in eine Instanzenmethode ändern, was in diesem Fall jedoch keinen Sinn ergibt. Eine bessere Lösung besteht darin, ComVisible(false) explizit auf die Methode anzuwenden, um anderen Entwicklern gegenüber zu verdeutlichen, dass die Methode nicht aus COM angezeigt werden kann.
Im folgenden Beispiel wird ComRegisterFunctionAttribute auf die Methode angewendet.
Code
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;
}
}
}
Verwandte Regeln
CA1017: Assemblys mit ComVisibleAttribute markieren
CA1406: Int64-Argumente für Visual Basic 6-Clients vermeiden
CA1413: Nicht öffentliche Felder in für COM sichtbaren Werttypen vermeiden