gpt4 book ai didi

linq - 为什么 FxCop 在没有一次性字段的类上引发错误 "Types that own disposable fields should be disposable"?

转载 作者:行者123 更新时间:2023-12-02 09:01:04 28 4
gpt4 key购买 nike

我有一个 LINQ 对象,其中添加了一个附加方法。该类没有一次性属性或方法,但 FxCop 引发错误“拥有一次性字段的类型应该是一次性的”并引用该类。

到目前为止我已经减少了代码,但仍然收到错误:

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;
}
}
}

但是,如果我删除任一 from 子句,FxCop 就会停止给出错误:

partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from pageTag in context.VirtualWikiPageTags
select new {};

return null;
}
}
}

或者

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 不是一次性的。

这是误报吗?或者 LINQ 代码是否以某种方式在类上生成一次性字段?如果不是误报,FxCop 建议我实现 IDisposable 接口(interface),但我会在 Dispose 方法中做什么?

编辑:完整的 FxCop 错误是:

"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."

编辑2:这是引发错误的反汇编代码:

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;
}
}

编辑3:似乎确实有一个包含对 DataContext 的引用的闭包类。这是它的反汇编代码:

[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
// Fields
public WikiTomeDataContext context;

// Methods
public <>c__DisplayClass1();
}

最佳答案

我的猜测是,两个 From 子句生成对 SelectMany 的调用,并在数据上下文上使用闭包。闭包的实例有一个数据上下文字段,这会导致 FxCop 警告。这没什么好担心的。

您的数据上下文只有一个实例,您可以通过 using block 来清理它。由于闭包没有终结器,因此 FxCop 警告中没有性能或安全含义。

关于linq - 为什么 FxCop 在没有一次性字段的类上引发错误 "Types that own disposable fields should be disposable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1219086/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com