当前位置: 首页 > news >正文

C#中警告CA1050、CA1821、CA1822、CA1859、CA2249及处理

目录

一、CA1050警告及处理

1.如何解决冲突:

2.何时禁止显示警告:

二、CA1821警告及处理

三、CA1822警告及处理

四、CA1859警告及处理

1.警告解决之前

2.警告解决之后

3.解决办法

1.警告解决之前

2.警告解决之后

3.解决办法

五、CA2249警告及处理 


一、CA1050警告及处理

严重性

代码

说明

项目

文件

禁止显示状态

详细说明

消息

CA1050

在命名空间中声明类型

EFGetStarted

D:\360安全浏览器下载\EntityFramework.Docs-main\samples\core\GetStarted\Model.cs

28

活动

在命名空间中声明类型以防止名称冲突,并作为一种组织对象层次结构中相关类型的方式。

1.如何解决冲突:

        若要修复与此规则的冲突,请将类型置于命名空间中。比如新增一个namespace Remove_CA1050{}命名空间,然后把发生所有程序代码剪切到这个空间中,警告自然消失。

2.何时禁止显示警告:

        虽然根本不必禁止显示此规则中的警告,但当程序集绝不会与其他组件一起使用时,可以禁止显示。

二、CA1821警告及处理

严重性

代码

说明

项目

文件

禁止显示状态

消息

CA1821

移除空终结器

03

F:\C#_TM\chapter9\03\Program.cs

16

活动

        终结器=析构函数,一旦为空,CA1821。

        应尽可能避免终结器,因为跟踪对象生存期会产生额外的性能系统开销。 垃圾回收器在收集对象之前运行终结器。

        如果调试需要终结器,请将整个终结器置于 #if DEBUG / #endif 指令中。

public class Class3 
{ 
#if DEBUG 
// Violation will not occur because the finalizer will exist and 
// contain code when the DEBUG directive is present. When the 
// DEBUG directive is not present, the finalizer will not exist, 
// and therefore not be empty. 
~Class3() 
{ Debug.Fail("Finalizer called!"); } 
#endif 
}

         终结器(以前称为析构器)用于在垃圾回收器收集类实例时执行任何必要的最终清理操作。终结器隐式调用对象基类上的 Finalize。 因此,对终结器的调用会隐式转换为以下代码:

protected override void Finalize()
{try{// Cleanup statements...}finally{base.Finalize();}
}

        这种设计意味着,对继承链(从派生程度最高到派生程度最低)中的所有实例以递归方式调用 Finalize 方法。不应使用空终结器。不必要的终结器会导致不必要的性能损失。对于终结器是否在应用程序终止过程中运行,这特定于每个 .NET 的实现 .NET 5(包括 .NET Core)及更高版本不会在应用程序终止过程中调用终结器。

//析构函数
//CA1821:移除空终结器或需要#if DEBUG/#endif
//.NET Framework:输出显示当应用程序终止时,这三个类的终结器将按照派生程度最高到最低的顺序自动进行调用。
//.NET 5(包括 .NET Core)或更高版本:没有输出,因为在应用程序终止时,此 .NET 的实现不调用终结器。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Test9_3
{class Program{public Program(){Console.WriteLine("我是构造函数");}
#if DEBUG~Program()							  //析构函数{Console.WriteLine("析构函数自动调用");  //输出一个字符串}
#endifstatic void Main(string[] args){if (args is null)                       //解除IDE0060{throw new ArgumentNullException(nameof(args));}Program program = new();             //实例化Program对象      }}
}
/*运行结果:
我是构造函数  */

三、CA1822警告及处理

严重性

代码

说明

项目

文件

禁止显示状态

消息

CA1822

成员“SubscribeToRing”不访问实例数据,可标记为 static

09

E:\C#_TM\chapter17\09\Program.cs

42

活动

        解决办法:按照提示,增加static修饰符。

四、CA1859警告及处理

严重性

代码

说明

项目

文件

禁止显示状态

消息

CA1859

将变量“_Imyinterface”的类型从“_02.IMyInterface”更改为“_02.Program”,以提高性能

02

E:\C#_TM\chapter17\02\Program.cs

72

活动

1.警告解决之前

static void Main(string[] args)
{Program program = new();				     //实例化Program类对象IMyInterface Imyinterface = program;		 //使用派生类对象实例化接口ImyInterfaceImyinterface.ID = "TM";                      //为派生类中的ID属性赋值Imyinterface.Name = "C#从入门到精通";         //为派生类中的Name属性赋值Imyinterface.ShowInfo();					 //调用派生类中方法显示定义的属性值Console.WriteLine("----------------------"); //用子类派生类直接实例化program.ID = "TM";program.Name = "C#从入门到精通";program.ShowInfo();Console.Read();
}

2.警告解决之后

static void Main(string[] args){Program program = new();                        //实例化Program类对象//使用派生类对象实例化接口     	 ((IMyInterface)program).ID = "TM";                   //为派生类中的ID属性赋值((IMyInterface)program).Name = "C#从入门到精通"; //为派生类中的Name属性赋值((IMyInterface)program).ShowInfo();             //调用派生类中方法显示定义的属性值Console.WriteLine("----------------------");    //用子类派生类直接实例化program.ID = "TM";program.Name = "C#从入门到精通";program.ShowInfo();Console.Read();}

3.解决办法

        内联临时变量后,警告消失 

严重性

代码

说明

项目

文件

禁止显示状态

消息

CA1859

将变量“factory”的类型从“_01.IGenericInterface<System.ComponentModel.IListSource>”更改为“_01.Factory<System.Data.DataTable, System.ComponentModel.IListSource>”,以提高性能

01

E:\C#_TM\chapter19\01\Program.cs

36

活动

1.警告解决之前

//实例化接口
static void Main(/*string[] args*/)
{//实例化接口IGenericInterface<IListSource> factory = new Factory<System.Data.DataTable, IListSource>();//输出指定泛型的类型Console.WriteLine(factory.CreateInstance().GetType().ToString());Console.ReadLine();
}

2.警告解决之后

static void Main(/*string[] args*/)
{//内联临时变量后不需要实例化接口//输出指定泛型的类型Console.WriteLine(new Factory<System.Data.DataTable, IListSource>().CreateInstance().GetType().ToString());Console.ReadLine();
}

3.解决办法

         内联临时变量,按着提示操作,不定义显式的变量。

五、CA2249警告及处理 

        请考虑使用 String.Contains 而不是 String.IndexOf

        原因:

        此规则查找对 IndexOf 的调用,其中结果用于检查是否存在 substring,并建议使用 Contains 来提高可读性。当使用 IndexOf 来检查结果是否等于 -1 或大于等于 0 时,可安全地将该调用替换为 Contains,而不会对性能产生影响。根据所使用的 IndexOf 重载,建议的解决方法可能是添加 comparisonType 参数:

重载

建议的解决方法

String.IndexOf(char)

String.Contains(char)

String.IndexOf(string)

String.Contains(string,StringComparison.CurrentCulture)

String.IndexOf(char, StringComparison.Ordinal)

String.Contains(char)

tring.IndexOf(string, StringComparison.Ordinal)

String.Contains(string)

String.IndexOf(char,NONStringComparison.Ordinal)*

String.Contains(char, NON StringComparison.Ordinal)*

String.IndexOf(string,NON StringComparison.Ordinal)*

String.Contains(string, NON StringComparison.Ordinal)*

* StringComparison.Ordinal 之外的任何 StringComparison 枚举值:
CurrentCulture
CurrentCultureIgnoreCase
InvariantCulture
InvariantCultureIgnoreCase
OrdinalIgnoreCase

CA2249:考虑使用“String.Contains”而不是“String.IndexOf”(代码分析) - .NET | Microsoft Learn  https://learn.microsoft.com/zh-cn/dotnet/fundamentals/code-analysis/quality-rules/ca2249

相关文章:

  • 【hive】列转行—collect_set()/collect_list()/concat_ws()函数的使用场景
  • 2.多行输入【2023.11.24】
  • 【数据结构】二叉树概念 | 满二叉树 | 完全二叉树
  • redis的一些操作
  • Servlet+JSP小型超市管理系统
  • 卷积神经网络(CNN)识别验证码
  • 野指针详解
  • Oracle中文显示???????解决办法
  • 为什么 Flink 抛弃了 Scala
  • 2023年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题
  • C++:一文读懂智能指针
  • js修改浏览器地址栏里url的方法
  • python -opencv 中值滤波 ,均值滤波,高斯滤波实战
  • 汽车电子 -- 根据DBC解析CAN报文
  • 电力感知边缘计算网关产品设计方案-网关系统通信架构方案
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 5、React组件事件详解
  • docker-consul
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java第三方包学习之lombok
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • PAT A1017 优先队列
  • SQLServer之创建显式事务
  • vue2.0项目引入element-ui
  • Vue学习第二天
  • yii2权限控制rbac之rule详细讲解
  • 初识 webpack
  • 当SetTimeout遇到了字符串
  • 多线程事务回滚
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 实现菜单下拉伸展折叠效果demo
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 鱼骨图 - 如何绘制?
  • 责任链模式的两种实现
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • (¥1011)-(一千零一拾一元整)输出
  • (26)4.7 字符函数和字符串函数
  • (4)(4.6) Triducer
  • (Note)C++中的继承方式
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)Linq学习笔记
  • (转)Windows2003安全设置/维护
  • .equals()到底是什么意思?
  • .naturalWidth 和naturalHeight属性,
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core跨平台微服务学习资源
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET开发人员必知的八个网站
  • .NET框架
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @property括号内属性讲解