Ich habe ein LINQ-Objekt mit einer zusätzlichen Methode hinzugefügt. Die Klasse hat keine wegwerfbaren Eigenschaften oder Methoden, aber FxCop löst den Fehler "Typen, die Einwegfelder besitzen, sollte wegwerfbar sein" und auf diese Klasse verweisen.Warum löst FxCop den Fehler "Typen, die Einwegfelder besitzen, für eine Klasse ohne verfügbare Felder aus?"
ich den Code so weit reduziert haben und erhalten immer noch den Fehler:
partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from wiki in context.Wikis
from pageTag in context.VirtualWikiPageTags
select new {};
return null;
}
}
}
Wenn ich jedoch eine der beiden von Klauseln entfernen, stoppt FxCop den Fehler geben:
partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from pageTag in context.VirtualWikiPageTags
select new {};
return null;
}
}
}
Or
partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from wiki in context.Wikis
select new {};
return null;
}
}
}
PagePermissionSet ist nicht Einweg.
Ist das ein falsch positives Ergebnis? Oder erzeugt der LINQ-Code irgendwie ein Einwegfeld in der Klasse? Wenn es kein falscher positiver Wert ist, empfiehlt FxCop, die IDisposable-Schnittstelle zu implementieren, aber was würde ich in der Dispose-Methode tun?
EDIT: Der vollständige FxCop Fehler ist:
"Implement IDisposable on 'WikiPage' because it creates members of the following IDisposable types: 'WikiTomeDataContext'. If 'WikiPage' has previously shipped, adding new members that implement IDisposable to this type is considered a breaking change to existing consumers."
Edit 2: Dies ist der demontierten Code, der den Fehler auslöst:
public PagePermissionSet GetUserPermissions(Guid? userId)
{
using (WikiTomeDataContext context = new WikiTomeDataContext())
{
ParameterExpression CS$0$0001;
ParameterExpression CS$0$0003;
var permissions = context.Wikis.SelectMany(Expression.Lambda<Func<Wiki, IEnumerable<VirtualWikiPageTag>>>(Expression.Property(Expression.Constant(context), (MethodInfo) methodof(WikiTomeDataContext.get_VirtualWikiPageTags)), new ParameterExpression[] { CS$0$0001 = Expression.Parameter(typeof(Wiki), "wiki") }), Expression.Lambda(Expression.New((ConstructorInfo) methodof(<>f__AnonymousType8..ctor), new Expression[0], new MethodInfo[0]), new ParameterExpression[] { CS$0$0001 = Expression.Parameter(typeof(Wiki), "wiki"), CS$0$0003 = Expression.Parameter(typeof(VirtualWikiPageTag), "pageTag") }));
return null;
}
}
Bearbeiten 3: Es scheint zu sein, eine Closure-Klasse, die einen Verweis auf den DataContext enthält. Hier ist sein zerlegter Code:
[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
// Fields
public WikiTomeDataContext context;
// Methods
public <>c__DisplayClass1();
}
Das klingt plausibel. Wenn dies der Fall ist, muss ich etwas unternehmen, um sicherzustellen, dass der DataContext entsorgt wird? – AaronSieb
Es gibt nichts, worüber man sich Sorgen machen müsste. Es gibt nur eine Instanz Ihres Datenkontextes, den Sie über den using-Block bereinigen. b/c Der Abschluss hat keinen Finalizer, hier gibt es keine Perforationen. –
Danke! Ich werde diesen Fehler dann in die Ausschlussliste verschieben. – AaronSieb