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

Los*_*ont 5 .net c# dispose static-analysis unity-game-engine

我有一个启用了 Roslyn 分析器的 Unity 项目,其中之一是 CA1001:“拥有一次性字段的类型应该是一次性的”(https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality ) -规则/ca1001)。

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

在这种情况下,最好的办法似乎是以某种方式改变规则,以检查 IDisposable 字段是否已在 OnDestroy 方法中处理。有没有办法更改规则 CA1001 以像 MonoBehaviour 子类一样工作?或者有其他分析器可以做到这一点吗?如果不是,那么至少可以对特定类型的子类禁用该规则吗?(到目前为止我能做的最好的事情就是取消名为“*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();
    }
}
Run Code Online (Sandbox Code Playgroud)

本例resource按常规OnDestroy方法已正确处理,但CA1001仍被触发。

der*_*ugo 0

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

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

就像是

dotnet_code_quality.CA1001.excluded_type_names_with_derived_types = T:UnityEngine.MonoBehaviour
Run Code Online (Sandbox Code Playgroud)