首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CA1805:避免进行不必要的初始化。

CA1805:避免进行不必要的初始化。

作者头像
呆呆
发布于 2022-02-19 10:51:22
发布于 2022-02-19 10:51:22
4530
举报
文章被收录于专栏:centosDaicentosDai

规则 ID

CA1805

类别

“性能”

修复是中断修复还是非中断修复

非中断

原因

类的字段已显式初始化为该字段类型的默认值。

规则说明

在运行构造函数之前,.NET 运行时将引用类型的所有字段初始化为其默认值。 在大多数情况下,在构造函数中将字段显式初始化为其默认值是多余的,这会增加维护成本,并可能会降低性能(例如,随着程序集大小的增加),可以删除显式初始化。

如何解决冲突

在大多数情况下,正确的解决方法是删除不必要的初始化。

class C

{

// Violation

int _value1 = 0;

// Fixed

int _value1;

}

在某些情况下,由于字段会永久保留其默认值,因此删除初始化可能会导致发出后续的 CS0649 警告。 在这种情况下,更好的解决方法是完全删除该字段,或将其替换为属性:

class C

{

// Violation

private static readonly int s_value = 0;

// Fixed

private static int Value => 0;

}

何时禁止显示警告

禁止显示警告始终是安全的,因为警告只是突出显示了可能不必要的代码以及可以避免的工作。

另请参阅

性能规则

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CA1830:在 StringBuilder 上优先使用强类型 Append 和 Insert 方法重载。
调用 StringBuilder Append 或 Insert 方法时,使用的是对 Append 或 Insert 方法有专用重载的类型调用 ToString 生成的参数。
用户4268038
2022/02/19
5280
CA1832:使用 AsSpan 或 AsMemory 而不是基于范围的索引器来获取数组
对数组使用范围索引器并向 ReadOnlySpan<T> 或 ReadOnlyMemory<T> 隐式赋值。
用户4268038
2022/02/25
1.9K0
CA1841:首选字典包含方法
此规则可找到在 IDictionary<TKey,TValue> 的 Keys 或 Values 集合上对 Contains 方法的调用,这些调用可替换为在字典本身对 ContainsKey 或 ContainsValue 方法的调用。
呆呆
2022/02/26
4490
CA1845:使用基于跨度的“string.Concat”
此规则查找包含 Substring 调用的字符串串联表达式,同时建议将 Substring 替换为 AsSpan 并使用基于跨度的 String.Concat 重载。
呆呆
2022/02/26
4740
CA1831:在合适的情况下,为字符串使用 AsSpan 而不是基于范围的索引器
对字符串使用了范围索引器,并将值隐式分配给了 ReadOnlySpan<char>。
用户4268038
2022/02/19
1.6K0
CA1825:避免数组分配长度为零
初始化长度为零的数组将导致不必要的内存分配。 请改为通过调用 Array.Empty 方法来使用静态分配的空数组实例。 内存分配在此方法的所有调用之间共享。
用户4268038
2022/02/19
5280
CA1810:以内联方式初始化引用类型的静态字段
当一个类型声明显式静态构造函数时,实时 (JIT) 编译器会向该类型的每个静态方法和实例构造函数中添加一项检查,以确保之前已调用该静态构造函数。 访问任何静态成员或创建该类型的实例时,将触发静态初始化。 但是,如果声明一个类型的变量,但不使用它,则不会触发静态初始化;这在初始化会更改全局状态的情况下非常重要。
呆呆
2022/02/19
7680
CA1802:在合适的位置使用文本
某个字段被声明为 static 和 readonly(在 Visual Basic 中为 Shared 和 ReadOnly),并使用可在编译时计算的值初始化。
呆呆
2022/02/19
9600
CA1837:使用 Environment.ProcessId 而不是 Process.GetCurrentProcess().Id
此规则会查找对 System.Diagnostics.Process.GetCurrentProcess().Id 的调用,并建议改用 System.Environment.ProcessId,因为这样更高效。
用户4268038
2022/02/19
6410
CA1827:如果可以使用 Any,请勿使用 Count/LongCount
在使用 Any 方法会更有效的情况下使用了 Count 或 LongCount 方法。
用户4268038
2022/02/19
6810
CA1838:不要对 P/Invoke 使用 StringBuilder 参数
StringBuilder 的封送处理总是会创建一个本机缓冲区副本,这导致一个 P/Invoke 调用出现多次分配。 若要将 StringBuilder 作为 P/Invoke 参数进行封送,运行时将:
用户4268038
2022/02/19
6680
CA2015:请勿为派生自 MemoryManager<> 的类型定义终结器
如果发生将终结器添加到派生自 MemoryManager<T> 的类型的情况,可能表示存在 bug,因为这表明在 Span<T> 中分发的本机资源正在被清除,同时 Span<T> 可能仍在使用该资源。
用户4268038
2022/02/20
3070
CA1829:使用 Length/Count 属性,而不是 Enumerable.Count 方法
对支持等效且更高效的 Length 或 Count 属性的类型使用了 Count LINQ 方法。
用户4268038
2022/02/19
6290
CA2012:正确使用 ValueTask
从成员调用中返回的 ValueTask 实例的使用方式可能导致异常、损坏或性能不佳。
用户4268038
2022/02/20
2950
CA1008:枚举应具有零值
非中断 - 如果系统提示你向无标志枚举添加 None 值。 中断 - 如果系统提示你重命名或删除任何枚举值。
用户4268038
2022/01/10
6830
CA1828:如果可以使用 AnyAsync,请勿使用 CountAsync/LongCountAsync
在使用 AnyAsync 方法会更有效的情况下使用了 CountAsync 或 LongCountAsync 方法。
用户4268038
2022/02/19
7170
CA1836:可用时最好使用 IsEmpty (而不是 Count)
使用了 Count 或 Length 属性或 Count<TSource>(IEnumerable<TSource>) 扩展方法,通过将值与 0 或 1 进行比较来确定对象是否包含任何项,以及对象是否具有更有效的 IsEmpty 属性可以代替使用。
用户4268038
2022/02/19
5760
CA1846:首选 AsSpan 次选 Substring
对其中一个 String.Substring 重载的调用结果被传递给具有接受 ReadOnlySpan<Char> 的可用重载的方法。
呆呆
2022/02/26
1K0
CA2013:请勿将 ReferenceEquals 与值类型结合使用
使用 System.Object.ReferenceEquals 方法来测试一个或多个值类型是否相等。
用户4268038
2022/02/20
1.5K0
CA2007:不直接等待任务
异步方法直接等待 Task 时,延续任务通常会出现在创建任务的同一线程中,具体取决于异步上下文。 此行为可能会降低性能,并且可能会导致 UI 线程发生死锁。 请考虑调用 Task.ConfigureAwait(Boolean) 以表示延续任务意图。
呆呆
2022/02/26
1.7K0
推荐阅读
相关推荐
CA1830:在 StringBuilder 上优先使用强类型 Append 和 Insert 方法重载。
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档