Неверные ссылки на codelens в VS 2013 Ultimate
Я не уверен, является ли это разработкой или необходимо включить / отключить функции в VS 2013 Ultimate, но подсчет ссылок, генерируемых кодовыми линзами, совершенно не в порядке. Вместо того, чтобы показывать количество классов / методов, непосредственно ссылающихся на определенный класс / метод, он показывает количество всего, что имеет то же имя, что и класс / метод во всем решении.
Например, скажем, в моем решении четыре класса (не имеет значения четыре проекта с одним классом в каждом).
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();
}
}
}
Счетчик ссылок для метода PrintThis() в class1 показывает 5. Всплывающие окна ссылок показывают class1, class2, class3, class4 и class5 и соответствующие им номера строк:
Он должен показывать только одну ссылку (1 ссылка) и класс 5 во всплывающем окне. Также я не уверен, почему codelens также включает класс, который фактически реализует метод в count. Теперь я не вижу, кто кому звонит. Подсчет ссылок очень полезен, когда вам нужно иметь дело с большим количеством классов.
Я бы не хотел переустанавливать Resharper и / или VS, если есть гораздо более простое решение.
2 ответа
Я видел довольно много дискуссий по этой теме в прошлом, пока эта функция находилась в стадии разработки. Мне пришлось немного покопаться в моих почтовых архивах, чтобы понять причину. Официальное объяснение таково:
То, что описано ниже, определенно работает как задумано, хотя это может показаться ошибкой с другой точки зрения. По сути, Find All References каскадно пересекает связанные символы (такие как виртуальные методы, переопределения, реализации интерфейса и т. Д.) По нескольким причинам:
- Найти все ссылки неразрывно связаны с переименованием символа. Итак, это набор символов, который вам нужно будет включить в операцию переименования символов, если вы хотите не нарушать вашу программу.
- Без выполнения всего анализа программы Visual Studio не будет точно знать, какие методы действительно являются реальными ссылками при выполнении программы. (И это все равно невозможно на самом деле...) Кроме того, он не знает точно, что вы ищете (возможно, вы все-таки искали производный метод), и поэтому он представляет весь набор.
Поскольку все больше и больше людей используют платформы IoC/DI, замена во время выполнения становится все более и более вероятной, и я лично нахожу большую ценность в поиске других методов, которые могли бы быть заменены на его месте во время выполнения, но было бы замечательно, когда они будут сгруппированы отдельно, чтобы четко показать, на какой метод есть прямые ссылки, а какие на подстановочные ссылки.
Возможно, "ссылки" - это неправильное имя, но я полагаю, что "Связанные символы" также могут вызвать много вопросов;).
Я не знаю способа изменить это поведение в CodeLens, так что вам может понадобиться установить Resharper в любом случае, возможно, в Visual Studio User Voice уже есть элемент для этого, но я не смог его найти.
Ваш опубликованный код содержит ошибки.. объявления класса недействительны.
Когда я взял то же самое и поместил ключевое слово class в объявлениях, я получил 1 ссылку, показанную в Class1, и 0 ссылок, показанную в классах 2,3,4.
Я сделал это с VS-2014 [Обновление 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)
{
}
}
}