VS 2013 ultimate中的错误代码引用不正确

时间:2015-08-23 17:11:55

标签: visual-studio-2013 reference-counting codelens

我不确定这是设计还是需要启用/禁用VS 2013终极版中的功能,但是代码版生成的引用计数完全没有问题。它不显示直接引用特定类/方法的类/方法的计数,而是显示与整个解决方案中的类/方法同名的所有内容的计数。

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

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及其对应的行号:

enter image description here

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

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

2 个答案:

答案 0 :(得分:1)

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

  

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

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

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

也许"参考"是错的名字,但我认为"相关的符号"也会产生很多问题;)。

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

答案 1 :(得分:0)

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

当我采用相同的方法并将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)
    {
    }
}
}