2

我不确定这是设计使然还是需要在 VS 2013 Ultimate 中启用/禁用功能,但 codelens 生成的引用计数完全不正常。它不显示直接引用特定类/方法的类/方法的计数,而是显示与整个解决方案中的类/方法同名的所有内容的计数。

例如,假设我的解决方案中有四个类(四个项目中每个类都没有关系)。

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

namespace ClassLibrary20
{

    public interface IWillPrint
    {
        void PrintThis();
    }


    public class Class1 : IWillPrint
    {
        public void PrintThis() { }
    }

    public class Class2 : IWillPrint
    {
        public void PrintThis() { }
    }

    public class Class3 : IWillPrint
    {
        public void PrintThis() { }
    }

    public class Class4 : IWillPrint
    {
        public void PrintThis() { }
    }

    public class Class5
    {

        public void SomeMethod()
        {
            var j = new Class1();
            j.PrintThis();
        }
    }
}

class1 中方法 PrintThis() 的引用计数显示为 5。引用弹出窗口显示 class1、class2、class3、class4 和 class5 及其对应的行号:

在此处输入图像描述

它应该在弹出窗口中只显示一个参考(1 个参考)和第 5 类。另外我不确定为什么codelens还包括实际实现计数中的方法的类。我现在看不到谁在呼唤谁。当你有很多类要处理时,引用计数是一个很大的帮助。

如果有更简单的解决方案,我不想重新安装 resharper 和/或 VS。

4

2 回答 2

2

过去我看到过很多关于这个话题的讨论,而这个功能正在开发中。我不得不在我的邮件档案中挖掘一下,看看是什么原因。官方的解释是这样的:

下面描述的内容肯定按设计工作,尽管从不同的角度来看它可能看起来是一个错误。本质上,Find All References 通过相关符号(如虚方法、覆盖、接口实现等)级联,原因如下:

  1. 查找所有引用本质上与重命名符号相关联。因此,如果您不希望破坏您的程序,这是您需要包含在重命名符号操作中的一组符号。
  2. 如果不执行整个程序分析,Visual Studio 将无法确切知道程序执行时哪些方法真正是真正的引用。(无论如何这在现实中是不可能的......)此外,它并不确切知道您在寻找什么(也许您毕竟在寻找派生方法),因此它呈现了整个集合。

随着越来越多的人使用 IoC/DI 框架,运行时替换的可能性越来越大,我个人发现寻找其他可能在运行时替换它的方法很有价值,但如果它们会是很好的单独分组以清楚地显示哪些方法是直接引用的,哪些是可替代的引用。

也许“引用”是错误的名称,但我认为“相关符号”也会导致很多问题;)。

我知道无法在 CodeLens 中更改此行为,因此您可能仍需要安装 Resharper,Visual Studio User Voice上可能已经有此项目,但我找不到它。

于 2015-09-06T15:20:54.130 回答
0

您发布的代码有缺陷..类声明无效。

当我采用相同的方法并将 class 关键字放在声明中时,我确实得到了 Class1 中显示的 1 个引用,以及 Classes 2、3、4 中显示的 0 个引用

我用 VS-2014 [Update 4] 和 VS-2015 [RTM] 做到了这一点.....代码如下:

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

namespace ConsoleApplication3
{
public class class1
{
    public void PrintThis()
    {
    }
}

public class class2
{
    public void PrintThis()
    {
    }
}

public class class3
{
    public void PrintThis()
    {
    }
}

public class class4
{
    public void PrintThis()
    {
    }
}

public class class5
{

    public void SomeMethod()
    {
        var j = new class1();
        j.PrintThis();
    }
}

internal class Program
{
    private static void Main(string[] args)
    {
    }
}
}
于 2015-09-06T12:46:49.723 回答