Tag: 代码分析

使用全局高速缓存时,如何修复CA2000 IDisposable C#编译器警告

CA2000是关于IDisposable接口的警告: CA2000:Microsoft.Reliability:在方法’ImportProcessor.GetContext(string)’中,在对所有引用超出范围之前,在对象’c’上调用System.IDisposable.Dispose。 我的方法用于存储上下文缓存,如下所示: public class RegionContext : IDisposable { /* Implement Dispose() here */ } private Dictionary contextCache = new ….. (); public RegionContext GetContext(string regionCode) { RegionContext rc = null; if (!this.contextCache.TryGetValue(regionCode.ToUpper(), out rc)) { rc = new RegionContext(regionCode); this.contextCache.Add(regionCode.ToUpper(), rc); } return rc; } 你会在哪里使用修复此编译器警告的using()语句? 我的外部类实际上在自己的实现中迭代并处理contextCache中的内容。 我要压制它,还是有办法正确摆脱这个警告?

如何满足CA2202(不要多次丢弃对象)

这个问题在您看来可能与CA2202重复,如何解决这个具有公认答案的案例 。 但是你可能会意识到,接受的答案有5个基于质量差的投票。 此外,任何其他投票的答案实际上并不能解决问题。 他们中的大多数都解释了如何压制规则或辩论这条规则有多么错误以及为什么我们应该忽略它。 由于那个规则存在,应该有一种方法来满足它,我正在寻找社区支持来解决这个问题。 我试图弄清楚如何在以下代码中满足CA2202 。 我理解这里的问题是, using语句还配置了encryptedStream对象。 但是如果我删除了finally部分,它就会开始抛出CA2000 那么,编写它以符合CA2202和CA2000的正确方法是什么 byte[] result; MemoryStream encryptedStream = null; try { encryptedStream = new MemoryStream(); using (var cryptStream = new CryptoStream(encryptedStream, cryptoTransform, CryptoStreamMode.Write)) { cryptStream.Write(inputInBytes, 0, inputInBytes.Length); cryptStream.FlushFinalBlock(); result = encryptedStream.ToArray(); } } finally { encryptedStream?.Dispose(); } string output = Convert.ToBase64String(result);

在C#代码中查找未捕获的exception

我想知道是否有一个工具可以使用静态代码分析在C#中找到未捕获的exception? 基本上我想选择一个方法A(),并希望找到methodA()抛出的所有exception的列表以及methodA()调用的所有方法。 我尝试过ReSharper + Agent Johnson和AtomineerUtils ,都失败了这个简单的任务。 这是我的示例代码: public class Rectangle { public int Width { get; set; } public int Height { get; set; } public int Area() { CheckProperties(); long x = Width * Height; if (x > 10) throw new ArgumentOutOfRangeException(); return (int) x; } private void CheckProperties() { if (Width < […]

CA1502的自定义阈值

有没有办法改变CodeAnalysis规则的门槛? 特别是,当方法的代码复杂度超过20时,我们希望Build失败。不幸的是,规则CA1502的阈值为25: 当圈复杂度超过25时,该规则会报告违规行为。 我们能以某种方式改变这个吗?

替代嵌套类型的Expression <Func >

我有一个调用服务时使用的函数。 在调用服务之前,它将创建一个日志条目: protected TResult CallService(TService service, Expression<Func> functionSelector) { Logger.LogServiceCall(service, functionSelector); return functionSelector.Compile()(service); } Visual Studio 2010代码分析器通知我不应在以下消息中使用嵌套类型: CA1006:Microsoft.Design:考虑一种设计,其中’ServiceManager.CallService (TService,Expression <Func >)’不嵌套generics类型’Expression <Func >’ 。 虽然我可以简单地为此条目创建抑制规则,但是是否存在会阻止显示此类警告的替代方法?

转让所有权后如何摆脱CA2000警告?

以下代码生成两个CA2000警告(其中,但这不是重点)。 public sealed class Item: IDisposable { public void Dispose() {} } public sealed class ItemContainer { public void Add(Item item) { } } public sealed class Test: IDisposable { private ICollection itemCollection; private ItemContainer itemContainer; private void Add(Item item) { itemCollection.Add(item); } public void Initialize() { var item1 = new Item(); // no warning […]

C#调用图生成工具

我刚收到一大堆(大部分是未记录的)C#代码,我想在潜入并开始重构之前想象它的结构。 我过去(使用其他语言)使用生成调用图的工具完成了这项工作。 你能推荐一个好的工具来促进C#中的结构发现吗? UPDATE 除了这里提到的工具,我已经看到(通过电子管)人们说.NET Reflector和CLR Profiler具有此function。 有这些经验吗?

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

假设我列举了所有货币: public enum CurrencyType { /// /// United Arab Emirates dirham /// [EnumMember] AED = 784, /// /// Afghan afghani /// [EnumMember] AFN = 971, /// /// Albanian lek /// [EnumMember] ALL = 008, … } VS 2015代码分析一直抱怨每个成员100次违反CA1709 。 这本身就是一个有用的规则,我不想禁用它; 但在这种特定情况下,它没有多大帮助,因为CurrencyType是公共的,并且在很多其他项目中使用。 我可以压制这个消息; 但是,VS只允许我为每个成员压制它 – 这意味着我将有100个[SuppressMessage(…)]行,这将使代码混乱。 有没有办法抑制所有CurrencyType成员的所有CA1709,而不是为这个项目中的所有其他代码抑制它,而不必写100 [SuppressMessage(…)] ? SuppressMessageAttribute有一个Scope参数,但文档不清楚。 我试过放两个 [SuppressMessage(“Microsoft.Naming”, “CA1709:IdentifiersShouldBeCasedCorrectly”, Scope = “type”, […]

您使用哪些工具和技术来查找死代码?

您使用哪些工具和技术在.NET中查找死代码? 在过去,我使用Obsolete属性修饰方法(传递true,因此编译器将发出错误,如MSDN中所述 )。 我有兴趣看到其他人的建议(除了像FxCop或ReSharper这样的工具)。 我想确保我不会错过其他有用的工具。

是否有一个工具可以在C#应用程序中查找未引用的函数(死的,过时的代码)?

如果没有从任何地方调用foo(),我想删除foo()。