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

标签 c# .net unity3d static-analysis dispose

我有一个启用了 Roslyn 分析器的 Unity 项目,其中之一是 CA1001:“拥有一次性字段的类型应该是一次性的”( https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1001 )。
这对于手动创建和销毁的类非常有用,可以查看它们是否正确处理了所有字段。然而,在很多情况下,由于 IDisposable 的病毒性质,创建这些的最顶层对象将是组件,在 Unity 的情况下是 MonoBehaviour 类。为了满足规则,可以将 IDisposable 添加到 MonoBehaviour 并正确实现处置模式,但是这不会为类增加太多值(value),因为作为不依赖于 IDisposable 的框架的组件,它永远不会被调用。
在这种情况下,似乎最好的方法是以某种方式更改规则以检查 IDisposable 字段是否已在 OnDestroy 方法中处理。有没有办法将规则 CA1001 更改为 MonoBehaviour 子类的工作方式?或者有没有其他分析仪可以做到这一点?如果不是,那么至少可以为特定类型的子类禁用该规则吗? (到目前为止,我能做的最好的事情是取消名为“*Component.cs”的文件的规则,但这远不是最好的。)
我的问题是针对 Unity,但它实际上适用于任何不依赖 IDisposable 接口(interface)的框架。
编辑:
示例代码:

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 的任何类型的规则。通过 Exclude specific types and their derived types (在您发布的同一链接中)

add the following key-value pair to an .editorconfig file in your project


就像是
dotnet_code_quality.CA1001.excluded_type_names_with_derived_types = T:UnityEngine.MonoBehaviour

关于c# - 对不使用 IDisposable 的框架组件使用 .NET 分析器规则 CA1001,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68090158/

相关文章:

c# - 触摸事件不触发 C# WPF

c# - 为什么 ReSharper 不建议对这两个 block 使用空传播?

c# - 找不到类型或命名空间名称 'NUnit' |统一

c# - 将带分隔符的文件读入 DataTable 的高效函数

android - Facebook unity SDK 与其他插件的实现

c# - 带有下一页/上一页预览的 Xamarin iOS UIScrollView : Zoom Not Working as Expected

c# - C# 中是否可以将服务结果自动转换为相同类型?

c# - 如何从 ODBC 连接中获取可用表的列表?

.net - 换行符在电子邮件中不起作用 - .net Windows 服务

c# - json 牛顿软件 : Deserialize Object containing a list of string