我有一个接口的实现,并且该接口扩展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) 我在项目中使用静态代码分析来检查代码违规.其中一个广泛使用的规则是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) 想发布这个,即使我在写这个问题的过程中弄清楚了.将在下面发布答案.
使用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) 如果这是重复的问题,请指出正确的链接,我将删除此问题.
我知道在VS Team System中我可以使用代码分析,但我正在使用VS Professional.
你能告诉我如何整合FxCop和Visual Studio吗?我不想将FxCopCmd.exe添加到我的Post-build事件中以便在每次编译时运行FxCop.我想通过右键单击解决方案资源管理器中的项目来选择运行FxCop.
谢谢你的帮助.
通常,当您处置私有成员时,您可能会执行以下操作:
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
它的相关程度?
假设我列举了所有货币:
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) 出于某种原因,FXCop似乎认为我应该在Dispose中调用GC.SuppressFinalize,无论我是否有终结器.
我错过了什么吗?是否有理由在没有定义终结器的对象上调用GC.SuppressFinalize?
有人希望我让其他人的代码符合某些FxCop规则集,其中包括规则CA1726:使用首选术语.大多数术语/替换都是正确的,我可以理解,人们必须决定用一种方法来命名.
但是,"旗帜"一词的处理方式是什么?任何人都可以向我解释为什么我不会使用这个名字?(在我去老板之前抱怨它之前;))
比如,我有一个数据对象,它有一个类'flags'的成员,它捆绑了大量定义如何处理数据对象的属性.你怎么称呼这个?
之前我遇到过这个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[]
属性的最佳选择是什么?
当我在我的项目上运行 FxCop 时,我收到了大量 ID 为 CA2007 的警告。文档中缺少此 ID (它只是从 CA2006 跳到 CA2100),但我得到的消息是:
不要在不调用 ConfigureAwait 的情况下直接等待任务
我的印象是 .NET Core 没有使用同步上下文,这意味着我不需要使用.ConfigureAwait(bool)
. 但是,当我尝试使用 Google 搜索它时,我现在只能找到对 ASP.NET Core 的提及(例如这篇博文)。
鉴于我找不到任何权威的东西,我开始怀疑我是否将 ASP.NET Core 更改误认为是更普遍适用于所有 .NET Core 的更改。
谁能给我一个明确的答案?
我是否需要通过我的应用程序并应用大量的ConfigureAwait
? 或者我应该在我的 FxCop 规则集中禁用 CA2007?
fxcop ×10
c# ×9
.net ×3
idisposable ×2
.net-core ×1
asynchronous ×1
c#-6.0 ×1
coding-style ×1
dispose ×1
finalizer ×1
integration ×1
roslyn ×1
rules ×1