对不使用IDisposable的框架组件使用.NET分析器规则CA1001



我有一个启用了Roslyn分析仪的Unity项目,其中一个是CA1001:";拥有可丢弃字段的类型应该是可丢弃的";(https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1001)。

这对于手动创建和销毁的类非常有用,可以查看它们是否正确地处理了所有字段。然而,在很多情况下,由于IDisposable的病毒性,创建这些对象的最顶层对象将是组件,在Unity的情况下是MonoBehavior类。为了满足规则,可以将IDisposable添加到MonoBehavior中,并正确地实现dispose模式,但这不会给类增加太多价值,因为作为不依赖IDisposaable的框架的组件,它永远不会被调用。

在这种情况下,最好的方法是以某种方式更改规则,以检查是否已在OnDestroy方法中处理了IDisposable字段。有没有一种方法可以将规则CA1001更改为对MonoBehavior子类这样工作?或者有其他分析仪可以做到这一点吗?如果没有,那么至少可以对特定类型的子类禁用该规则吗?(到目前为止,我能做的最好的事情就是取消名为"*Component.cs"的文件的规则,但这远不是最好的。(

我的问题是针对Unity的,但它实际上适用于任何不依赖IDisposable接口的框架。

编辑:

示例代码:

public class Resource : IDisposable
{
public void Dispose()
{
Debug.Log("Resource disposed");
}
}
public class ExampleComponent : MonoBehaviour
{
private Resource resource;
private void Start()
{
resource = new Resource();
}
private void OnDestroy()
{
resource.Dispose();
}
}

在这种情况下,resource在传统的OnDestroy方法中被适当地布置,但是CA1001仍然被触发。

我认为您可以通过排除特定类型及其派生类型(在您发布的同一链接中(忽略从UnityEngine.MonoBehaviour派生的任何类型的规则

将以下键值对添加到项目中的.editorconfig文件中

类似的东西

dotnet_code_quality.CA1001.excluded_type_names_with_derived_types = T:UnityEngine.MonoBehaviour

最新更新