Обзор
При работе в проекте C # Visual Studio 15 имеет ярлык на Find All References
, который отображает все ссылки на переменную, используемую в решении в панели '...' references
.
Можно ли просмотреть только подмножество результата Find All References
, где присваивается переменная?
Пример
С учетом этого надуманного Foo.cs
:
public class Bar
{
private int val;
public Bar(int val) { this.val = val; }
public SetValue(int val) { this.val = val; }
}
public class Foo
{
public Bar bar = new Bar(111);
public Foo()
{
bar = new Bar(222);
bar.SetValue(333);
Modify(ref bar, 444);
Set(out bar, 555);
}
public void Modify(ref Bar toModify, int val)
{
toModify.SetValue(val);
}
public void Set(out Bar toSet, int val)
{
toSet = new Bar(val);
}
}
Если я наведу курсор на объявление Foo.bar
и нажму Shift+F12
для Find All References
(или щелкните правой кнопкой мыши и выберите ту же опцию) Я получаю следующие 4 строки:
Я хотел бы удобным способом просто получить подмножество ссылоккоторые конкретно состоят из гарантированных назначений для bar
.
В идеале я хотел бы иметь ярлык, похожий на Shift+F12
, который выполняет такое действие, например Ctrl+Shift+F12
.
В частности, когдавыполнено, я хотел бы, чтобы окно результатов Find All References
:
- включало назначений, таких как
bar = new Bar(222)
(игнорируя первоначальное определение) - Включите , передавая его как параметр
out
, который гарантированно присваивает ему значение. - Игнорирует , передавая
ref
, так как это не гарантирует выполнение назначения,Ради этого вопроса я только заинтересован в заданиях, которые гарантированы . - Игнорируют любые другие ссылки на
bar
.
В этом примере я хочу видеть только строки со значениями 222
и 555
, поскольку это единственные гарантированные назначения:
Панель поиска
Мне известно, что в правом верхнем углу окна результатов Find All References
есть строка поиска, и я могу использовать ее для фильтрации существующего набора ссылок, возвращаемыхShift+F12
, и поэтому может фильтровать для =
(который должен быть экранирован с помощью \
) и out
:
Однако это не идеально.
- Похоже, он не поддерживает регулярное выражение, поэтому поиск
=
и out
должен выполняться отдельно. - Что еще более важно, он не поддерживает синтаксис.Это просто совпадения строк, которые могут легко привести к ложным срабатываниям и ложным отрицаниям:
// False positive, 'bar' not assigned but line contains '='
var derp = bar.GetValue();
if(bar == null) {...}
bar.SetString("===");
// False negative,'bar' assigned but line does not contain '='
Bar
= new Bar(666);
Желаемое решение
Повторно: можно ли выполнить базовый синтаксический анализ способом, аналогичным Find All References
, но возвращать ссылки только тогда, когда гарантированное присвоение переменной выполняется ввопрос?
Цель состоит в том, чтобы использовать это в больших проектах, где есть тысячи ссылок на данную переменную, но только несколько назначений, и иметь возможность иметь некоторый механизм для быстрого просмотра этих конкретных строк кода вВзгляд.
Если есть способ добавить сочетание клавиш, чтобы просто выполнить Find All References
и автоматическое заполнение \=
в строке поиска, это было бы приемлемо , но не идеальноиз-за ложных срабатываний / негативов, как указано выше.Поскольку ложный отрицательный результат маловероятен, по крайней мере, это приведет к сужению ссылок до меньшего подмножества.
Идеальным решением было бы использовать знания Visual Studio о коде, чтобы найти все экземпляры, где данная переменная присваивается синтаксически.