有人希望我让其他人的代码符合某些FxCop规则集,其中包括规则CA1726:使用首选术语.大多数术语/替换都是正确的,我可以理解,人们必须决定用一种方法来命名.
但是,"旗帜"一词的处理方式是什么?任何人都可以向我解释为什么我不会使用这个名字?(在我去老板之前抱怨它之前;))
比如,我有一个数据对象,它有一个类'flags'的成员,它捆绑了大量定义如何处理数据对象的属性.你怎么称呼这个?
当我在我的项目上运行 FxCop 时,我收到了大量 ID 为 CA2007 的警告。文档中缺少此 ID (它只是从 CA2006 跳到 CA2100),但我得到的消息是:
不要在不调用 ConfigureAwait 的情况下直接等待任务
我的印象是 .NET Core 没有使用同步上下文,这意味着我不需要使用.ConfigureAwait(bool). 但是,当我尝试使用 Google 搜索它时,我现在只能找到对 ASP.NET Core 的提及(例如这篇博文)。
鉴于我找不到任何权威的东西,我开始怀疑我是否将 ASP.NET Core 更改误认为是更普遍适用于所有 .NET Core 的更改。
谁能给我一个明确的答案?
我是否需要通过我的应用程序并应用大量的ConfigureAwait? 或者我应该在我的 FxCop 规则集中禁用 CA2007?
框架设计指南(第2版,第327页)说:
CONSIDER提供方法
Close(),除了Dispose(),如果close是该区域的标准术语.这样做时,重要的是使Close实现相同
Dispose并IDisposable.Dispose明确地考虑实现方法.
所以,按照提供的例子,我有这个类:
public class SomeClass : IDisposable {
private SomeDisposable someInnerDisposable;
public void Open() {
this.someInnerDisposable = new SomeDisposable();
}
void IDisposable.Dispose() {
this.Close();
}
public void Close() {
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
this.someInnerDisposable.Dispose();
this.someInnerDisposable = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
FxCop似乎不喜欢这样:
CA1816:Microsoft.Usage:'SomeClass.Close()'调用'GC.SuppressFinalize(object)',这种方法通常仅在'IDisposable.Dispose'的实现中调用.有关更多信息,请参阅IDisposable模式.
CA1816:Microsoft.Usage:更改'SomeClass.IDisposable.Dispose()'以调用'GC.SuppressFinalize(object)'.这将防止对象一旦被处理并且已经超出范围而不必要地完成对象.
CA1063:Microsoft.Design:修改'SomeClass.IDisposable.Dispose()'以便它调用Dispose(true),然后在当前对象实例上调用GC.SuppressFinalize(在Visual Basic中为'this'或'Me'),然后回报.
CA1063:Microsoft.Design:将'SomeClass.IDisposable.Dispose()'重命名为'Dispose'并确保将其声明为public和sealed.
-要么-
我试过了
[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose() …Run Code Online (Sandbox Code Playgroud) 有没有人知道相当于Delphi的FxCop/StyleCop?我真的希望将样式等自动检查到持续集成中.
我一直在阅读这个问题和其他一些答案,虽然我在更改引用和更改当前实例的状态之间有所区别,但我不确定为什么这意味着我不应该只读它.这是因为标记某些东西只是告诉编译器有关该实例的特殊内容,所以它能够将它当作线程安全处理时实际上可能不是吗?
据推测,有些情况下我不希望实例能够被更改,但是不介意实例的状态是否改变(单例可能./ me准备火焰)标记实例的后果是什么readonly如果我想要这个?
我们有3年的解决方案(.sln),大约有20个项目(.csproj).开始使用FxCop和/或StyleCop是否合理?也许我们应该首先将它用于几个小项目但不是整个解决方案?
看到一些经验丰富的答案会很高兴.
谢谢.
编辑:我们正在使用TeamCity进行持续集成.我们没有可能使用ReSharper.:(仅限CodeRushXpress.
如何抑制整个类型的FxCop警告?
namespace ConsoleApplication1
{
public static class Serializer<T>
{
public static string Serialize(T obj)
{
return string.Empty;
}
public static T Deserialize(string str)
{
return default(T);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试过这个,但它对我不起作用:
[assembly: SuppressMessage("Microsoft.Design",
"CA1000:DoNotDeclareStaticMembersOnGenericTypes", Scope = "Type",
Target = "ConsoleApplication1.Serializer'1")]
Run Code Online (Sandbox Code Playgroud) FxCop 10抱怨以下内容:
using XYZ.Blah; //CA1709 - "XYZ"
using Xyz.Blah; //No complaint.
using XylophoneSuperDuperLongFullName.Blah; //I don't want to have a long full name for my company name.
Run Code Online (Sandbox Code Playgroud)
问题是......我希望我的公司名称显示在所有大写字母中,因为XYZ是缩写.该名称的长版本太长,无法成为有用的命名空间.微软逃脱了这种东西,因为他们的首字母缩写只有两个字母.
using MS.Something; //No Complaint.
using Microsoft.SomethingElse; //No Complaint.
Run Code Online (Sandbox Code Playgroud)
所以,我正在考虑添加一个SuppressMessageAttribute来抑制此警告.但是,我不确定如何恰当地这样做(或者甚至在哪里坚持它),以便它只影响这一个实例.我不想在该命名空间中抑制任何内容,因为我想抓住我犯的任何其他错误.我确实看过msdn和谷歌搜索但我找不到任何显示如何专门针对这个实例.我发现最接近的是Scope ="namespace",但我不确定这是否意味着它会影响实际的命名空间名称,或者它是否会影响该命名空间中的所有内容.
有什么问题?我正在尝试安装FxCop 10.要安装它,需要Microsoft Windows SDK 7.1.我安装了SDK.现在,要安装FxCop,我必须运行FxCopSetup.exe,它应该位于%ProgramFiles%\ Microsoft SDKs\Windows\v7.1\Bin\FxCop文件夹中.但是,该文件夹丢失了.
我做了什么来试图解决它?我搜索了网络以解决问题,我尝试了一些在几个讨论中提出的解决方法,包括(1)没有完全安装SDK和(2)卸载SDK,重启,重新安装SDK并重新启动.
任何帮助是极大的赞赏.谢谢!
顺便说一句,我正在运行Windows 7(如果这是相关的).
public class MultiSomething { } //CA1704:IdentifiersShouldBeSpelledCorrectly
Run Code Online (Sandbox Code Playgroud)
当我运行代码分析时,我收到一个错误,因为Microsoft不识别"Multi"这个词(他们使用它的数字IMultiValueConverter).因此,我所做的是更正CodeAnalysisDictionary.xml文件,并按照此处提供的步骤操作.但是,它似乎没有解决问题,我仍然收到代码分析警告消息.
为了确保这不是识别的单词部分的错误,我添加了另一个类和另一个异常.
public class MultiSomething { } //CA1704:IdentifiersShouldBeSpelledCorrectly
public class MutiiSomething { } //NO WARNING
<Dictionary>
<Words>
<Recognized>
<Word>Multi</Word> <-- This seems to not do anything... -->
<Word>Mutii</Word> <-- This actually does something... -->
</Recognized>
</Words>
</Dictionary>
Run Code Online (Sandbox Code Playgroud)
修复它的另一种方法是使用SuppressMessage,虽然如果我打算在整个地方使用这个词,这不是一个很好的解决方案.
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Multi")]
public class MultiSomething { } //NO WARNING (Suppressed)
Run Code Online (Sandbox Code Playgroud)
微软是否真的阻止'Multi'被添加到已识别的单词中?
fxcop ×10
c# ×7
.net ×3
stylecop ×2
.net-core ×1
asynchronous ×1
ca1704 ×1
casing ×1
coding-style ×1
delphi ×1
immutability ×1
namespaces ×1
readonly ×1
rules ×1