标签: fxcop

当你的实现是一个空方法时,你如何"正确"实现Dispose()(根据FxCop)?(CA1063)

我有一个接口的实现,并且该接口扩展IDisposable.在我特定的接口实现中,我不需要处理任何东西,所以我只有一个空Dispose()方法.

public interface IMyStuff : IDisposable
{
}

public MyStuffImpl : IMyStuff
{
    public void Dispose()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在FxCop中,这导致CA1063:

Error, Certainty 95, for ImplementIDisposableCorrectly
{
    Resolution   : "Provide an overridable implementation of Dispose(
                   bool) on 'MyStuffImpl' or mark the type as sealed. 
                   A call to Dispose(false) should only clean up native 
                   resources. A call to Dispose(true) should clean up 
                   both managed and native resources."
}
CriticalWarning, Certainty 75, for CallGCSuppressFinalizeCorrectly
{
    Resolution   : "Change 'MyStuffImpl.Dispose()' …
Run Code Online (Sandbox Code Playgroud)

.net c# fxcop idisposable

15
推荐指数
1
解决办法
6375
查看次数

CA2213代码分析规则和自动实现的属性

我在项目中使用静态代码分析来检查代码违规.其中一个广泛使用的规则是CA2213,它检查一次性场的正确处理.

我注意到CA2213没有检查处理自动实现的属性.

此外,如果类继承自实现IDisposable的类并且不覆盖Dispose方法,则CA2213不会检查是否处置字段或自动实现的属性.

实际例子:

public sealed class Good : IDisposable {
    private Font font;
    public Font Font {
        get { return font; }
        set { font = value; }
    }
    public Good() { font = new Font("Arial", 9); }
    public void Dispose() { /* Do nothing */ }       // CA2213
}

public sealed class Bad : IDisposable {
    public Font Font { get; set; }
    public Bad() { Font = new Font("Arial", 9); }
    public void Dispose() { /* Do …
Run Code Online (Sandbox Code Playgroud)

c# dispose fxcop static-analysis

15
推荐指数
2
解决办法
1716
查看次数

代码分析警告CA2213 - 在IDisposable支持字段上调用Dispose()

想发布这个,即使我在写这个问题的过程中弄清楚了.将在下面发布答案.

使用VS代码分析获得以下警告:

警告CA2213'DBConn'包含IDisposable类型的字段'DBConn.k__BackingField':'SqlConnection'.更改"DBConn"上的Dispose方法以在此字段上调用Dispose或Close.

但我的代码确实在DBConn属性上调用Dispose().它不在支持领域吗?我有这样的其他实例 - 我处理编译器不会抛出此警告的位置.这是下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;    

namespace TheProgramSpace
{
    public sealed class DBConn : IDisposable
    {
        // class containing the database and its connection
        public SqlConnection TheConn { get; }
        public string DbPath { get; }
        public string DbName { get; }


        public DBConn(ProgInstance FPI)
        {
            // constructs new SQLConnection            
            DbPath = FPI.dbPath;
            DbName = FPI.dbName;

            string connString = "Data Source = " + DbPath + …
Run Code Online (Sandbox Code Playgroud)

c# fxcop visual-studio c#-6.0 visual-studio-2015

15
推荐指数
2
解决办法
6149
查看次数

如何整合FxCop和VS 2008?

如果这是重复的问题,请指出正确的链接,我将删除此问题.

我知道在VS Team System中我可以使用代码分析,但我正在使用VS Professional.

你能告诉我如何整合FxCop和Visual Studio吗?我不想将FxCopCmd.exe添加到我的Post-build事件中以便在每次编译时运行FxCop.我想通过右键单击解决方案资源管理器中的项目来选择运行FxCop.

谢谢你的帮助.

integration fxcop visual-studio-2008

14
推荐指数
2
解决办法
5330
查看次数

告诉FxCop另一种方法是调用dispose

通常,当您处置私有成员时,您可能会执行以下操作:

public void Dispose() {
    var localInst = this.privateMember;
    if (localInst != null) {
        localInst.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

本地赋值的目的是避免竞争条件,其中另一个线程可能在null检查后将私有成员分配为null.在这种情况下,我不关心是否Dispose在实例上调用两次.

我一直使用这种模式,所以我写了一个扩展方法来做到这一点:

public static void SafeDispose(this IDisposable disposable)
{
    if (disposable != null)
    {
        // We also know disposable cannot be null here, 
        // even if the original reference is null.
        disposable.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在我的班上,我可以这样做:

public void Dispose() {
    this.privateMember.SafeDispose();
}
Run Code Online (Sandbox Code Playgroud)

问题是,FxCop不知道我这样做了它给了我CA2000:在每种情况下丢失范围警告之前处理对象.

我不想关闭这个规则,我不想压制每一个案例.有没有办法提示FxCop这个方法相当于Dispose它的相关程度?

c# fxcop idisposable

14
推荐指数
1
解决办法
1489
查看次数

如何抑制所有类型成员的代码分析消息?

假设我列举了所有货币:

public enum CurrencyType
{
    /// <summary>
    /// United Arab Emirates dirham
    /// </summary>
    [EnumMember]
    AED = 784,

    /// <summary>
    /// Afghan afghani
    /// </summary>
    [EnumMember]
    AFN = 971,

    /// <summary>
    /// Albanian lek
    /// </summary>
    [EnumMember]
    ALL = 008,

    ...
}
Run Code Online (Sandbox Code Playgroud)

VS 2015代码分析一直抱怨每个成员有100个违反CA1709的行为.

这本身就是一个有用的规则,我不想禁用它; 然而,在这个特定的情况下它并没有多大帮助,因为它CurrencyType是公共的,并且在很多其他项目中使用.

我可以压制这个消息; 然而,VS只允许我为每个成员压制它 - 这意味着我将拥有100 [SuppressMessage(...)]行,这将使代码混乱.

有没有办法抑制所有CurrencyType成员的所有CA1709 ,而不是为这个项目中的所有其他代码抑制它,而不必写100 [SuppressMessage(...)]

有一个Scope参数SuppressMessageAttribute,但文档不清楚.我试过放两个

[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope = "type", Justification = "Currency codes are defined in ISO …
Run Code Online (Sandbox Code Playgroud)

.net c# code-analysis fxcop roslyn

14
推荐指数
2
解决办法
1万
查看次数

是否应该在没有终结器的对象上调用GC.SuppressFinalize?

出于某种原因,FXCop似乎认为我应该在Dispose中调用GC.SuppressFinalize,无论我是否有终结器.

我错过了什么吗?是否有理由在没有定义终结器的对象上调用GC.SuppressFinalize?

c# fxcop finalizer

13
推荐指数
2
解决办法
3456
查看次数

CA1726:FxCop禁止的词:标志

有人希望我让其他人的代码符合某些FxCop规则集,其中包括规则CA1726:使用首选术语.大多数术语/替换都是正确的,我可以理解,人们必须决定用一种方法来命名.

但是,"旗帜"一词的处理方式是什么?任何人都可以向我解释为什么我不会使用这个名字?(在我去老板之前抱怨它之前;))

比如,我有一个数据对象,它有一个类'flags'的成员,它捆绑了大量定义如何处理数据对象的属性.你怎么称呼这个?

c# fxcop coding-style rules

13
推荐指数
1
解决办法
1758
查看次数

CA1819:属性不应返回数组 - 什么是正确的替代方案?

之前我遇到过这个FxCop规则,并不满足于如何解决违规(thread1,thread2).我现在有另一个案例需要纠正违反CA1819的行为.

具体来说,我有一个算法库,它在曲线(x,y)上执行一些分析计算,公共"输入对象"如下:

public class InputObject
{
        public double[] X { get; set; }
        public double[] Y { get; set; }
        // + lots of other things well
}
Run Code Online (Sandbox Code Playgroud)

此对象的X和Y属性在库中的数百个位置中使用,通常使用索引.输入对象永远不会被算法改变,但实际上它应该无关紧要.而且,.Length经常被称为.它是一个数学库,并且double[]是那里的标准数据类型.无论如何,修复CA1819将需要相当多的工作.

我考虑使用List<double>,因为Lists支持索引并且与数组非常相似,但我不确定这是否会减慢算法速度或者FxCop是否会对这些列表感到满意.

更换这些double[]属性的最佳选择是什么?

.net c# fxcop

13
推荐指数
1
解决办法
6509
查看次数

CA2007 与 .NET Core 应用程序相关吗?

当我在我的项目上运行 FxCop 时,我收到了大量 ID 为 CA2007 的警告。文档中缺少此 ID (它只是从 CA2006 跳到 CA2100),但我得到的消息是:

不要在不调用 ConfigureAwait 的情况下直接等待任务

我的印象是 .NET Core 没有使用同步上下文,这意味着我不需要使用.ConfigureAwait(bool). 但是,当我尝试使用 Google 搜索它时,我现在只能找到对 ASP.NET Core 的提及(例如这篇博文)。

鉴于我找不到任何权威的东西,我开始怀疑我是否将 ASP.NET Core 更改误认为是更普遍适用于所有 .NET Core 的更改。

谁能给我一个明确的答案?

我是否需要通过我的应用程序并应用大量的ConfigureAwait? 或者我应该在我的 FxCop 规则集中禁用 CA2007?

c# asynchronous fxcop .net-core

13
推荐指数
1
解决办法
2157
查看次数