Visual studio 2013 VS 2013 ultimate中的代码镜头引用不正确

Visual studio 2013 VS 2013 ultimate中的代码镜头引用不正确,visual-studio-2013,reference-counting,codelens,Visual Studio 2013,Reference Counting,Codelens,我不确定这是出于设计还是需要在VS 2013 ultimate中启用/禁用功能,但codelens生成的参考计数完全不正常。它不显示直接引用特定类/方法的类/方法的计数,而是显示整个解决方案中与该类/方法同名的所有类/方法的计数 例如,假设我的解决方案中有四个类(四个项目各有一个类并不重要) class1中PrintThis()方法的引用计数显示为5。参考弹出窗口显示class1、class2、class3、class4和class5及其对应的行号: 它应该只显示一个参考(1个参考)和弹出窗口

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

例如,假设我的解决方案中有四个类(四个项目各有一个类并不重要)

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

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


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

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

当我采用相同的方法并将class关键字放在声明上时,我得到了Class1中显示的1个引用,以及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)
    {
    }
}
}

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

下面所描述的肯定是按照设计工作的,尽管从另一个角度看它可能看起来是一个bug。本质上,通过相关符号(如虚拟方法、重写、接口实现等)查找所有引用级联,原因如下:

  • “查找所有引用”本质上与重命名符号绑定。因此,这是一组符号,如果希望不中断程序,则需要在重命名符号操作中包含这些符号
  • 如果不执行整个程序分析,VisualStudio将无法确切地知道在程序执行时哪些方法才是真正的引用。(这在现实中无论如何都是不可能的…)此外,它并不确切地知道你在寻找什么(也许你一直在寻找一个派生的方法),因此它展示了整个集合
  • 随着越来越多的人使用IoC/DI框架,在运行时进行替换的可能性越来越大,我个人发现在运行时寻找其他可能被替换的方法非常有价值,但如果将它们单独分组,以清楚地显示哪些方法是直接引用的,哪些方法是可替换引用的,那就太好了

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


    我不知道如何更改CodeLens中的此行为,因此您可能需要安装Resharper,上可能已经有此项,但我找不到。

    使用@Terje的更新项更新了示例。问题很明显存在,但需要一个稍微不同的示例来重新编写。@david-类声明中什么是无效的?嗯!!我不知道我怎么没上“课”,有点。当我研究codelens时,有一段时间参考文献被分成两个数字,“直接”参考文献和“间接”参考文献。直接引用是您可以确定的引用,间接引用是接口实现方法和虚拟方法等可以作为引用的东西。我们尝试让参考指标显示2个数字,或者只是直接参考,让弹出窗口显示2个不同的类别,这让每个在用户研究和测试期间尝试过的人都感到困惑。(就个人而言,我很喜欢!)@JohnGardner:我也希望看到这一点,因为有一个广泛使用的基类,在很多函数中读取“99+引用”是毫无用处的。我有一个相同的“问题”:我也只希望看到“真实”引用,也就是说在派生类中,我只希望看到基类的方法,但并非所有类的所有方法都派生自同一基类。不幸的是,这是不可用的。
    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)
        {
        }
    }
    }