Tag: 代码分析

CA2104警告:有没有办法将类标记为“不可变”来抑制它?

请考虑以下代码,它引发CA2104: Do not declare read only mutable reference types. public class Test { // This provokes CA2104: “Do not declare read only mutable reference types”. protected readonly ImmutableClass ImmutableMember; } public class ImmutableClass { } 有没有人知道一种方法将类标记为不可变的方式会抑制警告CA2104? 我尝试使用[ImmutableObject(true)]装饰MutableClass而没有成功的希望(因为该属性对于表单编辑器来说非常清楚),并且肯定它不起作用。 我假设Code Analysis在确定是否发出CA2104时使用已知的不可变类型列表,因此我们不能使用相同的方法。 我想即使你可以将一个类标记为不可变,编译器也无法实际检查它是否为真,但至少它可能是一个有用的指标。 无论如何,我有什么属性可以忽略吗? 如果没有,就必须进行压制。 目前似乎没有替代方法可以做到这一点 。 我找到了一个有趣的博客,来自Joe Duffy(“Windows上的并发编程”一书的作者)关于这种事情 。 他从“想象我们有一个不可变的属性”开始。 …… 🙂 这很有意思 – 他遇到了编写一些新的FxCop规则来分析属于不可变的类型的麻烦。

CA2000在C#中将对象引用传递给基础构造函数

当我通过Visual Studio的代码分析实用程序运行一些代码时,我收到警告,我不确定如何解决。 也许这里的某个人遇到了类似的问题,解决了这个问题,并愿意分享他们的见解。 我正在编写DataGridView控件中使用的自定义绘制单元格。 代码类似于: public class DataGridViewMyCustomColumn : DataGridViewColumn { public DataGridViewMyCustomColumn() : base(new DataGridViewMyCustomCell()) { } 它会生成以下警告: CA2000:Microsoft.Reliability:在方法’DataGridViewMyCustomColumn.DataGridViewMyCustomColumn()’中,在对所有引用超出范围之前,对对象’new DataGridViewMyCustomCell()’调用System.IDisposable.Dispose。 我知道它警告我DataGridViewMyCustomCell(或它inheritance自的类)实现了IDisposable接口,并且应该调用Dispose()方法来清理DataGridViewMyCustomCell声明的任何资源。 我在互联网上看到的示例建议使用块来限制对象的生命周期并让系统自动处理它,但是当移动到构造函数的主体中时不能识别base,因此我无法编写使用阻止它…我不确定我还想做什么,因为不会指示运行时释放仍然可以在以后在基类中使用的对象? 我的问题是,代码是否正常? 或者,如何重构以解决警告? 我不想压制警告,除非这样做真的合适。

如何仅在一个项目中禁用警告?

我的解决方案中有一个遗留项目没有评论和许多警告。 我希望不会看到有关此特定项目的警告,但我希望在同一解决方案中看到其他项目的警告。 可能吗? 编辑:我指的是特定项目的“所有警告”。

如何禁用整个类的特定代码分析警告

我试图在整个类中禁用代码分析规则,但不是整个项目,只是一个类。 在下面的示例中,构建生成CA1822警告,因为它认为unit testing方法应该是静态的。 修复是将以下属性添加到每个unit testing方法: [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Performance”, “CA1822:MarkMembersAsStatic”)] 然而,这很繁琐,并且在一个有很多unit testing的课程中变得杂乱无章。 我试过了: 将属性移动到类 包装所有方法 #pragma warning disable CA1822 #pragma warning restore CA1822 这两种方法都没有奏效。 public class TestClass { public TestClass() { // some setup here } [Fact] public void My_Unit_Test1() { // the ‘this’ parameter is never used, causes CA warning 1822 } [Fact] public void My_Unit_Test2() { […]

未找到类型或命名空间“您缺少程序集引用”,而所有引用都是正确的

我正在尝试使用MSBuildWorkspace类 。 我的项目中包含所有程序集引用。 当我在对象浏览器中打开引用时,我看到了命名空间和我尝试使用的类。 但在我的以下使用声明中, using Microsoft.CodeAnalysis.MSBuild 我得到了一个 The type or namespace name ‘MSBuild’ does not exist in the namespace ‘Microsoft.CodeAnalysis’ (are you missing an assembly reference?) 但有趣的是,Syntax荧光笔识别出类型名称,它的编译器抱怨 这是构建日志 1>c:\windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3258: The primary reference “Microsoft.CodeAnalysis.Workspaces” could not be resolved because it has an indirect dependency on the .NET Framework assembly “Microsoft.Build, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” […]

在.NET核心项目上启用Microsoft的代码分析

我们的团队使用自定义规则集的代码分析function,如果我们忘记对方法参数执行null检查,则会导致构建失败。 但是,现在我们创建一个新的.NET Core项目时,它看起来并不像Code Analysis这些新项目的function。 “项目属性”区域中没有用户界面,并且按照此处的建议向项目添加自定义规则集只会影响StyleCop Analyzers( SAxxxx规则)。 有没有办法在.NET Core项目中启用代码分析( CAxxxx )规则?

CA1500与SA1309 – 哪一个获胜?

我的前缀是说我理解Code Analysis和StyleCop都是指导原则,很多人都选择忽略它们。 但话说回来,我想看看这两条规则的普遍共识是什么。 规则CA1500表示不要使参数名称和私有字段名称相同。 另一方面, 规则SA1309表示不要为成员添加下划线或“m_”作为前缀。 这使我们几乎没有选择区分私有支持字段与其相应的参数。 拿这些例子。 SA1309抱怨: class SomeClass { int _someField; public SomeClass(int someField) { this._someField = someField; } } CA1500抱怨: class SomeClass { int someField; public SomeClass(int someField) { this.someField = someField; } } 我有什么选择? 我不想创建私有支持字段PascalCase,因为这是公共字段/属性的(我相信相当普遍的)约定。 而且我不想重命名其中一个,只是为了解决歧义。 所以我留下了上面两个中的一个,这将要求我压制其中一个SA / CA规则。 你们通常做什么? 更重要的是,这些规则的作者认为你应该做些什么(因为它们都没有在他们的文档中提供替代解决方案)?

嵌套使用语句和Microsoft代码分析

最近我开启了额外的代码分析规则。 令我惊讶的是,我在一个我一直在考虑作为最佳实践的地方看到了违规行为。 如果我有两个嵌套的一次性用品,我会使用两个这样的语句: using (StringReader strReader = new StringReader(xmlString)) using (XmlReader xmlReader = XmlReader.Create(strReader)) { result.ReadXml(xmlReader); } 这也对应于C#中高评级的Q&A 嵌套使用语句 我得到的违规行为如下: Warning 18 CA2202 : Microsoft.Usage : Object ‘strReader’ can be disposed more than once in method ‘????’. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.: Lines: […]

检测C#代码中的递归调用

我想在我的代码中找到所有递归调用。 如果我在Visual Studio中打开文件,我会在编辑器的左侧看到“递归调用”图标。 我想检查这些电话的整个解决方案。 我使用Resharper命令行工具和VS的加载项Resharper – 代码检查没有运气,此规则未应用于其规则集。 有什么办法可以检查整个解决方案 – 我真的不想打开每个文件并检查那个蓝色的“递归调用”图标:) 编辑:我对单级递归很感兴趣

在代码分析中使用Microsoft.Bcl.Async会导致错误

我正在尝试使用Microsoft.Bcl.Async和代码分析,但是当我运行代码分析时,我得到一个或多个错误。 我正在使用Visual Studio 2012和Update 2。 这对我来说很容易重现: 创建一个针对.Net 4的新默认控制台应用程序。 右键单击References然后选择Manage NuGet Packages… 单击“ Online然后在Search Online框中键入async 。 您应该看到Async for .Net Framework 4 … 单击“ Install并接受所有问题。 添加到Main()一行说: TaskEx.Delay(1000); 和一个using System.Threading.Tasks; 转到项目属性,代码分析部分,然后勾选Enable Code Analysis on Build 。 编译程序。 我收到两个代码分析错误: CA0052运行代码分析时出错CA0052:未选择任何目标。 [错误和警告](全球) CA0055运行代码分析CA0055时出错:无法加载ConsoleApplication2.exe。 读取模块“ConsoleApplication2”时遇到以下错误:无法解析成员引用:[Microsoft.Threading.Tasks,Version = 1.0.12.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a] System.Threading.Tasks.TaskEx :: Delay。 [错误和警告](全球) 我为其他测试程序获得了不同的代码分析错误。 我试过的基本Windows窗体应用程序给了我: CA0001错误运行代码分析CA0001:读取模块“AsyncForNet4”时遇到以下错误:无法解析成员引用:[Microsoft.Threading.Tasks,Version = 1.0.12.0,Culture = […]