Просмотр значений данных в подсказках по данным в редакторе кода
Подсказки по данным предоставляют удобный способ просмотра сведений о переменных в программе во время отладки. Подсказки по данным работают только в режиме прерывания и только с переменными, которые находятся в пределах текущей области выполнения. Если вы не знакомы с процессом отладки кода, перед выполнением задач в этой статье рекомендуется прочесть документ об отладке для начинающих и статью Методы и инструменты отладки.
Работа с подсказками по данным
Подсказки по данным появляются только в режиме прерывания и только с переменными, которые находятся в пределах текущей области выполнения.
Отображение подсказки по данным
- Установите точку останова в коде и начните отладку, нажав клавишу F5 или выбрав команду Отладка>Начать отладку.
- При приостановке в точке останова наведите указатель мыши на любую переменную в текущей области. Появится подсказка по данным с именем и текущим значением переменной.
Как сделать подсказку по данным прозрачной
Чтобы сделать подсказку по данным прозрачной для просмотра находящегося за ней кода, нажмите клавишу CTRL, когда подсказка отображается. Подсказка будет прозрачной, пока удерживается клавиша CTRL. Для закрепленных или плавающих подсказок этот метод не работает.
Развернутая подсказка по данным
Начиная с Visual Studio 2022 с обновлением 1 появилась возможность сохранять подсказку по данным развернутой, пока вы не щелкнете в другом месте. Это называется закрепленной подсказкой по данным. Чтобы включить эту функцию, выберите Инструменты>Параметры>Отладка, а затем на вкладке Общие выберите Сохранять развернутые подсказки по данным до щелчка в другим месте.
Закрепление подсказок по данным
Для закрепления подсказки по данным, чтобы она оставалась открытой, щелкните значок кнопки Прикрепить к источнику.

Закрепленную подсказку можно перемещать, перетаскивая ее в окне кода. Значок кнопки отображается во внутреннем поле рядом со строкой, к которой прикреплена подсказка.
Подсказки по данным всегда определяются в контексте того места, где приостановлено выполнение, а не в контексте текущего местоположения курсора или местоположения подсказки. Если в другой функции навести указатель на переменную, имеющую такое же имя, что и переменная в текущем контексте, отобразится значение переменной в текущем контексте.
Открепление подсказки по данным от источника
Чтобы сделать закрепленную подсказку по данным плавающей, наведите на нее указатель мыши и выберите значок кнопки в контекстном меню.
Значок кнопки примет открепленную форму, и подсказка станет плавающей, или вы сможете перетаскивать ее по всем открытым окнам. Плавающие подсказки по данным закрываются при завершении сеанса отладки.
Повторное закрепление подсказок по данным
Чтобы повторно закрепить плавающую подсказку по данным, наведите на нее указатель мыши в редакторе кода и щелкните значок кнопки. Значок кнопки примет прикрепленную форму, и подсказка снова станет закрепленной в этом окне кода.
Если плавающая подсказка находится не в окне исходного кода, значок кнопки недоступен, и подсказку нельзя закрепить повторно. Чтобы значок кнопки стал доступен, верните подсказку в окно редактора кода, перетащив ее или переместив фокус в окно кода.
Закрытие подсказки по данным
Чтобы закрыть подсказку по данным, наведите на нее указатель мыши и выберите значок закрытия (x) в контекстном меню.
Закрытие всех подсказок по данным
Чтобы закрыть все подсказки по данным, в меню Отладка выберите команду Очистить все подсказки по данным.
Закрытие всех подсказок по данным для определенного файла
Чтобы закрыть все подсказки по данным для определенного файла, в меню Отладка выберите команду Очистить все подсказки по данным, прикрепленные к .
Развертывание и изменение сведений
Вы можете использовать подсказки по данным, чтобы развернуть массив, структуру или объект для просмотра его элементов. Кроме того, вы можете изменить значение переменной из подсказки по данным.
Развертывание переменной
Чтобы развернуть объект в подсказке по данным для просмотра его элементов, наведите указатель мыши на стрелки развертывания перед именами элементов. Элементы отобразятся в виде дерева. Для закрепленной подсказки по данным нажмите + перед именем переменной, а затем разверните дерево.

Для перемещения вверх и вниз по развернутому представлению можно использовать мышь или клавиши со стрелками.
Вы также можете закреплять развернутые элементы в закрепленной подсказке по данным, наводя на них указатель мыши и выбирая значок кнопки. После свертывания дерева выбранные элементы будут отображаться в закрепленной подсказке.
Изменение значения переменной
Чтобы изменить значение переменной или элемента в подсказке по данным, выберите значение, введите новое значение и нажмите клавишу ВВОД. Значения, предназначенные только для чтения, недоступны для выбора.
Закрепление свойств в подсказках по данным
Эта возможность поддерживается для .NET Core 3.0 или более поздних версий.
С помощью средства Закрепляемые свойства можно быстро проверять объекты по их свойствам в подсказках по данным. Чтобы воспользоваться этим средством, наведите указатель мыши на свойство и выберите значок булавки либо щелкните правой кнопкой мыши и в контекстном меню выберите пункт Закрепить элемент в избранном. При этом это свойство всплывает в верхней части списка свойств объекта, а имя и значение свойства отображаются в правом столбце подсказки по данным. Чтобы открепить свойство, щелкните значок булавки еще раз или в контекстном меню выберите пункт Открепить элемент в избранном.
При просмотре списка свойств объекта в подсказке по данным можно также включать и отключать отображение имен свойств и отфильтровывать незакрепленные свойства. Чтобы получить доступ к любой из этих команд, щелкните правой кнопкой мыши строку со свойством и выберите в контекстном меню команду Показать только закрепленные элементы или Скрыть имена закрепленных элементов в значениях.
Визуализация сложных типов данных
Значок с увеличением стекла рядом с переменной или элементом в подсказке данных означает, что для переменной доступны один или несколько визуализаторов, таких как визуализатор текста. Визуализаторы выводят сведения в более наглядной, иногда графической, форме.
![]()
Чтобы просмотреть элемент с помощью визуализатора по умолчанию для типа данных, выберите значок с увеличением стекла. Щелкните стрелку рядом со значком лупы, чтобы выбрать вариант из списка визуализаторов для типа данных.
Добавление переменной в окно контрольных значений
Если вы хотите продолжить наблюдение за переменной, то можете добавить ее в окно контрольных значений из подсказки по данным. Щелкните правой кнопкой мыши переменную в подсказке по данным и выберите пункт Добавить контрольное значение.
Переменная появится в окне Контрольные значения. Если в используемом выпуске Visual Studio поддерживается несколько окон Контрольные значения, переменная появится в окне Контрольные значения 1.
Импорт и экспорт подсказок по данным
Подсказки по данным можно экспортировать в XML-файл. Затем этот файл можно использовать совместно или изменять в текстовом редакторе. Вы также можете импортировать XML-файл подсказок по данным, который получили или изменили.
Экспорт подсказок по данным
- Выберите команду Отладка>Экспорт подсказок по данным.
- В диалоговом окне Экспорт подсказок по данным перейдите к месту, где нужно сохранить XML-файл, введите им файла и нажмите кнопку Сохранить.
Импорт подсказок по данным
- Выберите команду Отладка>Импорт подсказок по данным.
- В диалоговом окне Импорт подсказок по данным выберите XML-файл подсказок, который хотите, и нажмите Открыть.
Связанный контент
- Что такое отладка?
- Методы и инструменты отладки
- Первое знакомство с отладкой
- Просмотр данных в отладчике
- Окна «Контрольные значения» и «Быстрая проверка»
- Создание пользовательских визуализаторов для объектов .NET
Пошаговое руководство. Отображение подсказок QuickInfo
QuickInfo — это функция IntelliSense, которая отображает сигнатуры и описания методов при перемещении указателя на имя метода. Вы можете реализовать такие функции на основе языка, как QuickInfo, определив идентификаторы, для которых требуется предоставить описания QuickInfo, а затем создав подсказку, в которой будет отображаться содержимое. Вы можете определить QuickInfo в контексте языковой службы или определить собственное расширение имени файла и тип контента и отобразить QuickInfo только для этого типа или отобразить QuickInfo для существующего типа контента (например, «текст»). В этом пошаговом руководстве показано, как отобразить QuickInfo для типа контента «text».
В примере QuickInfo в этом пошаговом руководстве отображаются подсказки при перемещении указателя на имя метода. Для реализации этих четырех интерфейсов требуется:
- исходный интерфейс
- интерфейс поставщика источника
- интерфейс контроллера
- интерфейс поставщика контроллера Поставщики исходных и контроллеров являются компонентами компонента Managed Extensibility Framework (MEF), и отвечают за экспорт классов источника и контроллера и импорта служб и брокеров, таких как ITextBufferFactoryService, который создает текстовый буфер подсказки и IQuickInfoBroker, который активирует сеанс QuickInfo. В этом примере источник QuickInfo использует жестко закодированный список имен и описаний методов, но в полных реализациях языковая служба и документация по языку отвечают за предоставление этого содержимого.
Создание проекта MEF
Создание проекта MEF
- Создайте проект VSIX на C#. (В Диалоговое окно «Новый проект» , выберите Visual C# / Расширяемость, а затем ПРОЕКТ VSIX.) Назовите решение QuickInfoTest .
- Добавьте в проект шаблон элемента классификатора редактора. Дополнительные сведения: Создание расширения с помощью шаблона элемента редактора.
- Удалите файлы существующих классов.
Реализация источника QuickInfo
Источник QuickInfo отвечает за сбор набора идентификаторов и их описания и добавление содержимого в текстовый буфер подсказки при обнаружении одного из идентификаторов. В этом примере идентификаторы и их описания просто добавляются в исходный конструктор.
Реализация источника QuickInfo
- Добавьте файл класса с именем TestQuickInfoSource .
- Добавьте ссылку на Microsoft.VisualStudio.Language.IntelliSense.
- Добавьте приведенные ниже импортированные данные.
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel.Composition; using Microsoft.VisualStudio.Language.Intellisense; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Text.Operations; using Microsoft.VisualStudio.Text.Tagging; using Microsoft.VisualStudio.Utilities;
Imports System Imports System.Collections.Generic Imports System.Linq Imports System.Text Imports System.Collections.ObjectModel Imports System.ComponentModel.Composition Imports Microsoft.VisualStudio.Language.Intellisense Imports Microsoft.VisualStudio.Text Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.Text.Operations Imports Microsoft.VisualStudio.Text.Tagging Imports Microsoft.VisualStudio.Utilities
internal class TestQuickInfoSource : IQuickInfoSource
Friend Class TestQuickInfoSource Implements IQuickInfoSource
private TestQuickInfoSourceProvider m_provider; private ITextBuffer m_subjectBuffer; private Dictionary m_dictionary;
Private m_provider As TestQuickInfoSourceProvider Private m_subjectBuffer As ITextBuffer Private m_dictionary As Dictionary(Of String, String)
public TestQuickInfoSource(TestQuickInfoSourceProvider provider, ITextBuffer subjectBuffer) < m_provider = provider; m_subjectBuffer = subjectBuffer; //these are the method names and their descriptions m_dictionary = new Dictionary(); m_dictionary.Add("add", "int add(int firstInt, int secondInt)\nAdds one integer to another."); m_dictionary.Add("subtract", "int subtract(int firstInt, int secondInt)\nSubtracts one integer from another."); m_dictionary.Add("multiply", "int multiply(int firstInt, int secondInt)\nMultiplies one integer by another."); m_dictionary.Add("divide", "int divide(int firstInt, int secondInt)\nDivides one integer by another."); >
Public Sub New(ByVal provider As TestQuickInfoSourceProvider, ByVal subjectBuffer As ITextBuffer) m_provider = provider m_subjectBuffer = subjectBuffer 'these are the method names and their descriptions m_dictionary = New Dictionary(Of String, String)() m_dictionary.Add("add", "int add(int firstInt, int secondInt)" & vbLf & "Adds one integer to another.") m_dictionary.Add("subtract", "int subtract(int firstInt, int secondInt)" & vbLf & "Subtracts one integer from another.") m_dictionary.Add("multiply", "int multiply(int firstInt, int secondInt)" & vbLf & "Multiplies one integer by another.") m_dictionary.Add("divide", "int divide(int firstInt, int secondInt)" & vbLf & "Divides one integer by another.") End Sub
public void AugmentQuickInfoSession(IQuickInfoSession session, IList qiContent, out ITrackingSpan applicableToSpan) < // Map the trigger point down to our buffer. SnapshotPoint? subjectTriggerPoint = session.GetTriggerPoint(m_subjectBuffer.CurrentSnapshot); if (!subjectTriggerPoint.HasValue) < applicableToSpan = null; return; >ITextSnapshot currentSnapshot = subjectTriggerPoint.Value.Snapshot; SnapshotSpan querySpan = new SnapshotSpan(subjectTriggerPoint.Value, 0); //look for occurrences of our QuickInfo words in the span ITextStructureNavigator navigator = m_provider.NavigatorService.GetTextStructureNavigator(m_subjectBuffer); TextExtent extent = navigator.GetExtentOfWord(subjectTriggerPoint.Value); string searchText = extent.Span.GetText(); foreach (string key in m_dictionary.Keys) < int foundIndex = searchText.IndexOf(key, StringComparison.CurrentCultureIgnoreCase); if (foundIndex >-1) < applicableToSpan = currentSnapshot.CreateTrackingSpan ( //querySpan.Start.Add(foundIndex).Position, 9, SpanTrackingMode.EdgeInclusive extent.Span.Start + foundIndex, key.Length, SpanTrackingMode.EdgeInclusive ); string value; m_dictionary.TryGetValue(key, out value); if (value != null) qiContent.Add(value); else qiContent.Add(""); return; >> applicableToSpan = null; >
Public Sub AugmentQuickInfoSession(ByVal session As IQuickInfoSession, ByVal qiContent As IList(Of Object), ByRef applicableToSpan As ITrackingSpan) Implements IQuickInfoSource.AugmentQuickInfoSession ' Map the trigger point down to our buffer. Dim subjectTriggerPoint As System.Nullable(Of SnapshotPoint) = session.GetTriggerPoint(m_subjectBuffer.CurrentSnapshot) If Not subjectTriggerPoint.HasValue Then applicableToSpan = Nothing Exit Sub End If Dim currentSnapshot As ITextSnapshot = subjectTriggerPoint.Value.Snapshot Dim querySpan As New SnapshotSpan(subjectTriggerPoint.Value, 0) 'look for occurrences of our QuickInfo words in the span Dim navigator As ITextStructureNavigator = m_provider.NavigatorService.GetTextStructureNavigator(m_subjectBuffer) Dim extent As TextExtent = navigator.GetExtentOfWord(subjectTriggerPoint.Value) Dim searchText As String = extent.Span.GetText() For Each key As String In m_dictionary.Keys Dim foundIndex As Integer = searchText.IndexOf(key, StringComparison.CurrentCultureIgnoreCase) If foundIndex > -1 Then 'applicableToSpan = currentSnapshot.CreateTrackingSpan(querySpan.Start.Add(foundIndex).Position, 9, SpanTrackingMode.EdgeInclusive) applicableToSpan = currentSnapshot.CreateTrackingSpan(extent.Span.Start + foundIndex, key.Length, SpanTrackingMode.EdgeInclusive) Dim value As String = "" m_dictionary.TryGetValue(key, value) If value IsNot Nothing Then qiContent.Add(value) Else qiContent.Add("") End If Exit Sub End If Next applicableToSpan = Nothing End Sub
private bool m_isDisposed; public void Dispose() < if (!m_isDisposed) < GC.SuppressFinalize(this); m_isDisposed = true; >>
Private m_isDisposed As Boolean Public Sub Dispose() Implements IDisposable.Dispose If Not m_isDisposed Then GC.SuppressFinalize(Me) m_isDisposed = True End If End Sub
Реализация поставщика источника QuickInfo
Поставщик источника QuickInfo служит в первую очередь для экспорта в качестве части компонента MEF и создания экземпляра источника QuickInfo. Так как это часть компонента MEF, она может импортировать другие компоненты MEF.
Реализация поставщика источника QuickInfo
- Объявите поставщик источника QuickInfo с именем TestQuickInfoSourceProvider , который реализует IQuickInfoSourceProviderи экспортирует его с NameAttribute помощью источника ToolTip QuickInfo, параметра OrderAttribute Before=»default» и ContentTypeAttribute «text».
[Export(typeof(IQuickInfoSourceProvider))] [Name("ToolTip QuickInfo Source")] [Order(Before = "Default Quick Info Presenter")] [ContentType("text")] internal class TestQuickInfoSourceProvider : IQuickInfoSourceProvider
_ _ _ _ Friend Class TestQuickInfoSourceProvider Implements IQuickInfoSourceProvider
[Import] internal ITextStructureNavigatorSelectorService NavigatorService < get; set; >[Import] internal ITextBufferFactoryService TextBufferFactoryService
Private _NavigatorService As ITextStructureNavigatorSelectorService _ Friend Property NavigatorService() As ITextStructureNavigatorSelectorService Get Return _NavigatorService End Get Set(ByVal value As ITextStructureNavigatorSelectorService) _NavigatorService = value End Set End Property Private _TextBufferFactoryService As ITextBufferFactoryService _ Friend Property TextBufferFactoryService() As ITextBufferFactoryService Get Return _TextBufferFactoryService End Get Set(ByVal value As ITextBufferFactoryService) _TextBufferFactoryService = value End Set End Property
public IQuickInfoSource TryCreateQuickInfoSource(ITextBuffer textBuffer)
Public Function TryCreateQuickInfoSource(ByVal textBuffer As ITextBuffer) As IQuickInfoSource Implements IQuickInfoSourceProvider.TryCreateQuickInfoSource Return New TestQuickInfoSource(Me, textBuffer) End Function
Реализация контроллера QuickInfo
Контроллеры QuickInfo определяют, когда отображается QuickInfo. В этом примере QuickInfo отображается, когда указатель находится над словом, соответствующим одному из имен методов. Контроллер QuickInfo реализует обработчик событий наведения указателя мыши, который активирует сеанс QuickInfo.
Реализация контроллера QuickInfo
- Объявите класс, реализующий IIntellisenseControllerи назовите его TestQuickInfoController .
internal class TestQuickInfoController : IIntellisenseController
Friend Class TestQuickInfoController Implements IIntellisenseController
private ITextView m_textView; private IList m_subjectBuffers; private TestQuickInfoControllerProvider m_provider; private IQuickInfoSession m_session;
Private m_textView As ITextView Private m_subjectBuffers As IList(Of ITextBuffer) Private m_provider As TestQuickInfoControllerProvider Private m_session As IQuickInfoSession
internal TestQuickInfoController(ITextView textView, IList subjectBuffers, TestQuickInfoControllerProvider provider)
Friend Sub New(ByVal textView As ITextView, ByVal subjectBuffers As IList(Of ITextBuffer), ByVal provider As TestQuickInfoControllerProvider) m_textView = textView m_subjectBuffers = subjectBuffers m_provider = provider AddHandler m_textView.MouseHover, AddressOf Me.OnTextViewMouseHover End Sub
private void OnTextViewMouseHover(object sender, MouseHoverEventArgs e) < //find the mouse position by mapping down to the subject buffer SnapshotPoint? point = m_textView.BufferGraph.MapDownToFirstMatch (new SnapshotPoint(m_textView.TextSnapshot, e.Position), PointTrackingMode.Positive, snapshot =>m_subjectBuffers.Contains(snapshot.TextBuffer), PositionAffinity.Predecessor); if (point != null) < ITrackingPoint triggerPoint = point.Value.Snapshot.CreateTrackingPoint(point.Value.Position, PointTrackingMode.Positive); if (!m_provider.QuickInfoBroker.IsQuickInfoActive(m_textView)) < m_session = m_provider.QuickInfoBroker.TriggerQuickInfo(m_textView, triggerPoint, true); >> >
Private Sub OnTextViewMouseHover(ByVal sender As Object, ByVal e As MouseHoverEventArgs) 'find the mouse position by mapping down to the subject buffer Dim point As System.Nullable(Of SnapshotPoint) = m_textView.BufferGraph.MapDownToFirstMatch(New SnapshotPoint(m_textView.TextSnapshot, e.Position), PointTrackingMode.Positive, Function(snapshot) m_subjectBuffers.Contains(snapshot.TextBuffer), PositionAffinity.Predecessor) If point IsNot Nothing Then Dim triggerPoint As ITrackingPoint = point.Value.Snapshot.CreateTrackingPoint(point.Value.Position, PointTrackingMode.Positive) If Not m_provider.QuickInfoBroker.IsQuickInfoActive(m_textView) Then m_session = m_provider.QuickInfoBroker.TriggerQuickInfo(m_textView, triggerPoint, True) End If End If End Sub
public void Detach(ITextView textView) < if (m_textView == textView) < m_textView.MouseHover -= this.OnTextViewMouseHover; m_textView = null; >>
Public Sub Detach(ByVal textView As ITextView) Implements IIntellisenseController.Detach If m_textView Is textView Then AddHandler m_textView.MouseHover, AddressOf Me.OnTextViewMouseHover m_textView = Nothing End If End Sub
public void ConnectSubjectBuffer(ITextBuffer subjectBuffer) < >public void DisconnectSubjectBuffer(ITextBuffer subjectBuffer)
Public Sub ConnectSubjectBuffer(ByVal subjectBuffer As ITextBuffer) Implements IIntellisenseController.ConnectSubjectBuffer End Sub Public Sub DisconnectSubjectBuffer(ByVal subjectBuffer As ITextBuffer) Implements IIntellisenseController.DisconnectSubjectBuffer End Sub
Реализация поставщика контроллера QuickInfo
Поставщик контроллера QuickInfo служит главным образом для экспорта в качестве части компонента MEF и создания экземпляра контроллера QuickInfo. Так как это часть компонента MEF, она может импортировать другие компоненты MEF.
Реализация поставщика контроллера QuickInfo
- Объявите класс с именем TestQuickInfoControllerProvider , реализующий IIntellisenseControllerProviderи экспортируйте его с NameAttribute помощью контроллера QuickInfo ToolTip и ContentTypeAttribute текстового элемента:
[Export(typeof(IIntellisenseControllerProvider))] [Name("ToolTip QuickInfo Controller")] [ContentType("text")] internal class TestQuickInfoControllerProvider : IIntellisenseControllerProvider
_ _ _ Friend Class TestQuickInfoControllerProvider Implements IIntellisenseControllerProvider
[Import] internal IQuickInfoBroker QuickInfoBroker
Private _QuickInfoBroker As IQuickInfoBroker _ Friend Property QuickInfoBroker() As IQuickInfoBroker Get Return _QuickInfoBroker End Get Set(ByVal value As IQuickInfoBroker) _QuickInfoBroker = value End Set End Property
public IIntellisenseController TryCreateIntellisenseController(ITextView textView, IList subjectBuffers)
Public Function TryCreateIntellisenseController(ByVal textView As ITextView, ByVal subjectBuffers As IList(Of ITextBuffer)) As IIntellisenseController Implements IIntellisenseControllerProvider.TryCreateIntellisenseController Return New TestQuickInfoController(textView, subjectBuffers, Me) End Function
Сборка и проверка кода
Чтобы протестировать этот код, создайте решение QuickInfoTest и запустите его в экспериментальном экземпляре.
Создание и тестирование решения QuickInfoTest
- Постройте решение.
- При запуске этого проекта в отладчике запускается второй экземпляр Visual Studio.
- Создайте текстовый файл и введите текст, включающий слова «добавить» и «вычитать».
- Переместите указатель на один из вхождения «add». Подпись и описание add метода должны отображаться.
Связанный контент
IntelliSense в Visual Studio
IntelliSense — это помощь по завершению кода, которая включает ряд функций: список членов, сведения о параметрах, быстрые сведения и полный текст Word. Эти возможности помогают получать дополнительные сведения об используемом коде, отслеживать параметры при вводе и добавлять вызовы свойств и методов путем нескольких нажатий клавиш.
Многие аспекты IntelliSense зависят от конкретного языка. Дополнительные сведения о IntelliSense для разных языков см. в разделах «Связанные материалы «.
Список участников
После ввода символа триггера (например, точки ( . ) в управляемом коде или :: в C++) появляется список допустимых членов типа (или пространства имен). Если продолжить вводить символы, список фильтруется таким образом, чтобы включать только члены, начинающиеся этими символами, или члены, у которых любое слово в имени начинается этими символами. IntelliSense также выполняет сопоставление «верблюжьего» стиля, поэтому вы можете просто ввести первую букву каждого слова с «верблюжьим» стилем в имени члена, чтобы просмотреть список совпадений.
После выбора элемента, его можно вставить в код, нажав клавишу TAB или введя пробел. При выделении элемента и вводе точки элемент отображается с конечной точкой, которая вызывает еще один список членов. При выборе элемента, но перед его вставками вы получите быструю информацию для элемента.
В списке членов значок слева указывает на тип члена, такой как пространство имен, класс, функция или переменная. Список может быть достаточно длинным; перемещаться вверх и вниз по списку можно с помощью клавиш PAGE UP и PAGE DOWN.


Функцию Список членов можно вызывать вручную, нажав клавиши CTRL+J, выбрав пункт Edit>IntelliSense>Список членов или нажав кнопку Список членов на панели инструментов редактора. При вызове в пустой строке или за пределами распознаваемой области в списке отображаются символы глобального пространства имен.
Чтобы отключить список участников по умолчанию (чтобы он не отображался, если оно не было специально вызвано), перейдите в раздел «>Параметры>текста редактора>всех языков» и отмените выбор элементов списка «Авто». Если требуется отключить список членов только для конкретного языка, перейдите к параметрам Общие для этого языка.
Можно также включить режим подсказки, в котором в код будет вставляться только печатаемый текст. Например, если ввести идентификатор, отсутствующий в списке, и нажать клавишу TAB, в режиме завершения введенный идентификатор был бы заменен записью из списка. Для переключения между режимом завершения и режимом подсказки нажмите CTRL+ALT+ПРОБЕЛ или выберите Изменить>IntelliSense>Переключить режим завершения.
Можно также включить режим подсказки, в котором в код будет вставляться только печатаемый текст. Например, если ввести идентификатор, отсутствующий в списке, и нажать клавишу TAB, в режиме завершения введенный идентификатор был бы заменен записью из списка. Чтобы переключиться между режимом завершения и режимом предложения, нажмите клавиши CTRL+ALT+ ПРОБЕЛ или выберите «Изменить>IntelliSense Switch» между автоматическим и табуляционным завершением IntelliSense.>
Сведения о параметрах
Функция «Сведения о параметрах» предоставляет сведения о числе параметров, необходимых методу, параметру атрибута универсального типа (в C#) или шаблону (в C++), а также об именах и типах таких параметров.
Выделение параметра полужирным шрифтом указывает на следующий параметр, необходимый при вводе функции. Для перегруженных функций можно использовать клавиши СТРЕЛКА ВВЕРХ и СТРЕЛКА ВНИЗ для просмотра сведений об альтернативных параметрах для перегрузок функций.


При аннотировании функций и параметров при помощи комментариев XML-документации комментарии будут отображаться в качестве сведений о параметрах. Дополнительные сведения см. в разделе Создание XML-примечаний к коду.
Сведения о параметрах можно вызвать вручную, выбрав Изменить>IntelliSense>Сведения о параметрах, нажав клавиши CTRL+SHIFT+ПРОБЕЛ или кнопку Сведения о параметрах на панели инструментов редактора.
Краткие сведения
Функция «Краткие сведения» отображает полное объявление любого идентификатора в коде.


При выборе члена в поле Список членов для него также отображаются краткие сведения.


Краткие сведения можно открыть вручную, выбрав пункт меню Изменить>IntelliSense>Краткие сведения или нажав клавиши CTRL+K, CTRL+Iили кнопку Краткие сведения на панели инструментов редактора.
Если функция перегружена, IntelliSense может не отображать информацию для всех форм перегрузки.
Чтобы отключить краткие сведения для кода C++, можно перейти в меню Сервис>Параметры>Текстовый редактор>С/С++>Дополнительно и задать для параметра Автоматические краткие сведения значение false .
Завершение слов
Функция «Завершить слово» завершает оставшуюся часть имени переменной, команды или функции после ввода достаточного количества символов для однозначного определения термина. Чтобы вызвать функцию «Завершить слово», можно выбрать пункт меню Изменить>IntelliSense>Завершить слово либо нажать клавиши CTRL+ПРОБЕЛ или кнопку Завершить слово на панели инструментов редактора.
Параметры IntelliSense
Параметры IntelliSense включены по умолчанию. Чтобы отключить их, перейдите к разделу «Параметры >>текста» в текстовом редакторе>«Все языки» и отмените выбор сведений о параметрах или автоматических элементов списка, если вы не хотите использовать функцию «Элементы списка».
Если вы хотите изменить внешний вид элементов пользовательского интерфейса в Visual Studio, перейдите в раздел » >Параметры>параметров среды>» и «Цвета». Дополнительные сведения об этих параметрах и взаимодействии с ними см . в диалоговом окне «Шрифты и цвета», «Среда», «Параметры».
Значки IntelliSense
Значки в IntelliSense могут передавать дополнительные значения с помощью модификаторов значков. Это звезды, сердечки и замки, расположенные поверх значка объекта, которые означают защищенное, внутреннее или закрытое использование соответственно.
| Icon | Специальные возможности | Description |
|---|---|---|
![]() |
Открытый класс | Неограниченный доступ. |
![]() |
Защищенный класс | Доступ ограничен содержащим классом или типами, которые являются производными от содержащего класса. |
![]() |
Защищенный внутренний класс | Доступ ограничен текущей сборкой или типами, которые являются производными от содержащего класса. |
![]() |
Внутренний класс | Доступ ограничен текущей сборкой. |
![]() |
Закрытый класс | Доступ ограничен содержащим классом или типами, которые являются производными от содержащего класса в текущей сборке. (Доступно с версии C# 7.2.) |
Устранение неполадок IntelliSense
В некоторых случаях параметры IntelliSense могут не работать должным образом.
Курсор находится под ошибкой кода. Если в коде над курсором имеется неполная функция или другая ошибка, функция IntelliSense может перестать работать, поскольку ей не удается проанализировать элементы кода. Для устранения этой проблемы можно отметить соответствующий код комментарием.
Курсор находится в комментарии к коду. Если курсор находится в комментарии в файле исходного кода, вы не сможете использовать IntelliSense.
Курсор находится в строковом литерале. Вы не сможете использовать IntelliSense, если курсор находится внутри кавычек, в которые заключен строковый литерал, как показано в следующем примере:
MessageBox( hWnd, "String literal|")
Автоматические параметры отключены. По умолчанию функция IntelliSense работает автоматически, но ее можно отключить. Вы можете вызывать функцию IntelliSense, даже если автоматическое завершение операторов отключено.
Связанный контент
- C# IntelliSense
- Visual Basic IntelliSense
- IntelliSense для JavaScript
- Написание и рефакторинг кода (C++)
- Создание XML-примечаний к коду
Возможности IntelliSense для Visual C++
IntelliSense — это имя, присвоенное набору возможностей, которые делают процесс кодирования более удобным. Технология IntelliSense для C++ доступна для автономных файлов, а также для файлов, являющихся частью проекта C++. В кроссплатформенных проектах некоторые возможности IntelliSense доступны в файлах .cpp и .c в проекте с общим кодом даже в том случае, если вы находитесь в контексте Android или iOS.
В этой статье представлены общие сведения о функциях IntelliSense в C++. Сведения о том, как настроить проект для IntelliSense, а также устранять проблемы, см. в статье Настройка проекта C++ для IntelliSense.
Возможности IntelliSense в C++
IntelliSense — это имя, присвоенное набору возможностей, которые делают процесс кодирования более удобным. У каждого человека существуют свои представления об удобстве, поэтому мы предоставили возможность включать и отключать почти все функции IntelliSense в разделе Текстовый редактор>C/C++>Дополнительно в диалоговом окне Параметры. Диалоговое окно Параметры доступно через пункт Средства в строке меню.

Для доступа к IntelliSense можно использовать пункты меню и сочетания клавиш, показанные на следующем изображении.

Завершение операторов и список элементов
Когда вы набираете на клавиатуре ключевое слово, тип, функцию, имя переменной или другие программные элементы, распознаваемые компилятором, редактор подставляет полное слово.

При первом вызове списка элементов отображаются только те элементы, которые доступны для текущего контекста. Если нажать сочетание клавиш CTRL+J, вы увидите полный список элементов, независимо от их доступности. Если данный список вызвать третий раз, будет показан еще более широкой список программных элементов. Список элементов можно отключить в диалоговом окне Параметры, выбрав Текстовый редактор>C/C++>Общие>Автоматически отображать список членов.

Справка по параметрам
При наборе на клавиатуре открывающей фигурной скобки для вызова функции или угловой скобки в объявлении переменной шаблона класса редактор отображает небольшое окно с типами параметров для каждого события перегрузки функции или конструктора. Параметр current (на основе расположения курсора) имеет полужирный шрифт. Сведения о параметрах можно отключить в диалоговом окне Параметры, выбрав Текстовый редактор>C/C++>Общие>Сведения о параметрах.

Краткие сведения
При наведении курсора мыши на переменную появляется небольшое окно, где отображаются сведения о типе и заголовок, в котором определяется тип. Чтобы увидеть сигнатуру функции, наведите указатель мыши на вызов функции. Краткие сведения можно отключить в диалоговом окне Параметры, выбрав Текстовый редактор>C/C++>Расширенные>Auto Quick Info (Автоматически предоставляемые краткие сведения).

Выделение ошибок
Волнистые линии под программным элементом (переменной, ключевым словом, фигурной скобкой, именем типа и т. д.) указывают на фактическую или возможную ошибку в коде. Зеленая волнистая линия появляется при написании опережающего объявления и напоминает о том, что необходимо написать реализацию. Фиолетовая волнистая линия появляется в общем проекте при наличии ошибки в коде, который не является активным, например, когда вы работаете в контексте Windows, но вводите что-то, что будет ошибкой в контексте Android. Красная волнистая линия указывает на ошибку компилятора или предупреждение в активном коде, с которыми необходимо разобраться.

Выделение кода цветом и шрифты
Используемые по умолчанию цвета и шрифты можно изменить в диалоговом окне Параметры, выбрав Среда>Шрифты и цвета. Здесь можно изменять шрифты не только для редактора, но и для различных окон пользовательского интерфейса. Параметры, относящиеся к C++, начинаются с «C++». Другие параметры относятся ко всем языкам.
Кроссплатформенная технология IntelliSense
В проекте с общим кодом некоторые возможности IntelliSense, например волнистые линии, доступны даже в том случае, если вы работаете в контексте Android. При написании кода, который приводит к ошибке в неактивном проекте, IntelliSense будет по-прежнему отображать волнистые линии, но они будут иметь другой цвет, чем волнистые линии для ошибок в текущем контексте.
Рассмотрим приложение OpenGLES, настроенное для сборки для Android и iOS. На иллюстрации показан редактируемый общий код. На этом изображении активным проектом является iOS.StaticLibrary:

Обратите внимание на следующее.
- Ветвь #ifdef в строке 6 неактивна, что означает неактивный регион, так как __ANDROID__ не определен для проекта iOS.
- Переменная приветствия в строке 11 инициализируется с идентификатором HELLO , теперь подчеркнутым красной волнистой линией. Это вызвано тем, что идентификатор HELLO не определен в активном на данный момент проекте iOS.
- Идентификатор BYE в строке 12 подчеркнут фиолетовой волнистой линией. Этот идентификатор не определен в неактивном на данный момент проекте Android.NativeActivity. Несмотря на то, что эта строка компилируется, когда iOS является активным проектом, она не будет компилироваться, когда Android является активным проектом. Так как это общий код, его следует исправить, даже если он компилируется в активной конфигурации.
Если вы измените активный проект на Android, волнистые линии изменятся:
- Ветвь #else в строке 8 неактивна, что означает неактивный регион, так как __ANDROID__ определяется для проекта Android.
- Переменная приветствия в строке 11 инициализируется с идентификатором HELLO , подчеркнутым фиолетовой волнистой линией. Это вызвано тем, что идентификатор HELLO не определен в неактивном на данный момент проекте iOS.
- Идентификатор BYE в строке 12 подчеркнут красной волнистой линией. Этот идентификатор не определен в активном проекте.
IntelliSense для автономных файлов
При открытии одного файла за пределами любого проекта функции IntelliSense по-прежнему остаются доступными. Отдельные возможности IntelliSense можно включить и (или) отключить в диалоговом окне Параметры, выбрав Текстовый редактор>C/C++>Общие. Чтобы настроить IntelliSense для отдельных файлов, которые не входят в проект, найдите раздел IntelliSense и обозреватель для файлов, не входящих в проект.

По умолчанию в IntelliSense с одним файлом используются только стандартные каталоги включения для поиска файлов заголовка. Чтобы добавить дополнительные каталоги, откройте контекстное меню в узле Решение и добавьте каталог в список Исходный код отладки, как показано на следующей иллюстрации:

Включение и отключение функций
У каждого человека существуют свои представления об удобстве, поэтому мы предоставили возможность включать и отключать почти все функции IntelliSense в разделе Текстовый редактор>C/C++>Дополнительно в диалоговом окне Параметры. Диалоговое окно Параметры доступно через пункт Средства в строке меню.

Связанный контент
- Using IntelliSense
- Настройка проекта C++ для IntelliSense




