Как ставить фигурные скобки в visual studio
Перейти к содержимому

Как ставить фигурные скобки в visual studio

  • автор:

Добавление фигурных скобок (IDE0011)

Это правило стиля определяет использование фигурных скобок < >вокруг блоков кода.

Варианты

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

Дополнительные сведения о настройке параметров см. в разделе Формат параметра.

csharp_prefer_braces

Свойство Значение Описание
Имя параметра csharp_prefer_braces
Значения параметра true Предпочитать фигурные скобки даже для одной строки кода
false Не выбирайте фигурные скобки, если это разрешено
when_multiline Предпочитать фигурные скобки на нескольких линиях
Значение параметра по умолчанию true
// csharp_prefer_braces = true if (test) < this.Display(); >// csharp_prefer_braces = false if (test) this.Display(); // csharp_prefer_braces = when_multiline if (test) this.Display(); else

Отключение предупреждений

Если вы хотите подавить только одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и снова включить правило.

#pragma warning disable IDE0011 // The code that's violating the rule is on this line. #pragma warning restore IDE0011 

Чтобы отключить правило для файла, папки или проекта, задайте для его серьезности none значение в файле конфигурации.

[*.] dotnet_diagnostic.IDE0011.severity = none 

Чтобы отключить все правила в стиле кода, задайте серьезность для категории Style none в файле конфигурации.

[*.] dotnet_analyzer_diagnostic.category-Style.severity = none 

См. также раздел

  • Правила языка для стиля кода
  • Справочник по правилам стиля кода

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

The .NET documentation is open source. Provide feedback here.

Обратная связь

Отправить и просмотреть отзыв по

Сменить дефолтное расположение фигурных скобок

Как в Visual Studio настроить расположение фигурных скобок по умолчанию?
Доброго времени суток! Заинтересовал такой вопрос. Visual Studio автоматически расставляет.

Опция настройки принадлежности фигурных скобок
Добрый день! Помогите найти в настройках такую опцию, уже весь гугл облазил ничего не нашел, просто.

Как в eclipse настроить расположение фигурных скобок?
Как в eclipse настроить расположение фигурных скобок? То есть я хочу чтобы классы и методы.

Экранирование фигурных скобок
Столкнулся с такой проблемой: Пытаюсь разобрать текст из файла, а там есть фигурные скобки.

Пошаговое руководство. Отображение сопоставленных фигурных скобок

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

Реализуйте функции на основе языка, такие как сопоставление фигурных скобок, определив фигурные скобки, которые вы хотите сопоставить, и добавьте тег текстового маркера в соответствующие скобки, когда курсор находится на одном из фигурных скобок. Фигурные скобки можно определить в контексте языка, определить собственное расширение имени файла и тип контента, а также применить теги только к такому типу или применить теги к существующему типу контента (например, «текст»). В следующем пошаговом руководстве показано, как применить теги сопоставления фигурных скобок к типу контента «text».

Необходимые компоненты

Начиная с Visual Studio 2015, вы не устанавливаете пакет SDK Visual Studio из центра загрузки. Она включена в качестве необязательной функции в настройке Visual Studio. Пакет SDK для VS можно установить и позже. Дополнительные сведения см. в разделе «Установка пакета SDK для Visual Studio».

Создание проекта Managed Extensibility Framework (MEF)

Создание проекта MEF
  1. Создайте проект классификатора редактора. Назовите решение BraceMatchingTest .
  2. Добавьте в проект шаблон элемента классификатора редактора. Дополнительные сведения: Создание расширения с помощью шаблона элемента редактора.
  3. Удалите файлы существующих классов.

Реализация тега сопоставления фигурных фигурных скобок

Чтобы получить эффект выделения фигурных скобок, похожий на тот, который используется в Visual Studio, можно реализовать тег типа TextMarkerTag. В следующем коде показано, как определить теггер для пар фигурных скобок на любом уровне вложения. В этом примере пары фигурных скобок [] и <> определены в конструкторе тегов, но в полной реализации языка соответствующие пары фигурных скобок будут определены в спецификации языка.

Реализация тега сопоставления фигурных

  1. Добавьте файл класса и назовите его BraceMatching.
  2. Импортируйте следующие пространства имен.
using System; using System.Linq; using System.Collections.Generic; using System.ComponentModel.Composition; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Text.Tagging; using Microsoft.VisualStudio.Utilities; 
Imports System.ComponentModel.Composition Imports Microsoft.VisualStudio.Text Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.Text.Tagging Imports Microsoft.VisualStudio.Utilities 
internal class BraceMatchingTagger : ITagger
Friend Class BraceMatchingTagger Implements ITagger(Of TextMarkerTag) 
ITextView View < get; set; >ITextBuffer SourceBuffer < get; set; >SnapshotPoint? CurrentChar < get; set; >private Dictionary m_braceList; 
Private _View As ITextView Private Property View() As ITextView Get Return _View End Get Set(ByVal value As ITextView) _View = value End Set End Property Private _SourceBuffer As ITextBuffer Private Property SourceBuffer() As ITextBuffer Get Return _SourceBuffer End Get Set(ByVal value As ITextBuffer) _SourceBuffer = value End Set End Property Private _CurrentChar As System.Nullable(Of SnapshotPoint) Private Property CurrentChar() As System.Nullable(Of SnapshotPoint) Get Return _CurrentChar End Get Set(ByVal value As System.Nullable(Of SnapshotPoint)) _CurrentChar = value End Set End Property Private m_braceList As Dictionary(Of Char, Char) 
internal BraceMatchingTagger(ITextView view, ITextBuffer sourceBuffer) < //here the keys are the open braces, and the values are the close braces m_braceList = new Dictionary(); m_braceList.Add(''); m_braceList.Add('[', ']'); m_braceList.Add('(', ')'); this.View = view; this.SourceBuffer = sourceBuffer; this.CurrentChar = null; this.View.Caret.PositionChanged += CaretPositionChanged; this.View.LayoutChanged += ViewLayoutChanged; > 
Friend Sub New(ByVal view As ITextView, ByVal sourceBuffer As ITextBuffer) 'here the keys are the open braces, and the values are the close braces m_braceList = New Dictionary(Of Char, Char)() m_braceList.Add(""c) m_braceList.Add("["c, "]"c) m_braceList.Add("("c, ")"c) Me.View = view Me.SourceBuffer = sourceBuffer Me.CurrentChar = Nothing AddHandler Me.View.Caret.PositionChanged, AddressOf Me.CaretPositionChanged AddHandler Me.View.LayoutChanged, AddressOf Me.ViewLayoutChanged End Sub 
public event EventHandler TagsChanged; 
Public Event TagsChanged As EventHandler(Of SnapshotSpanEventArgs) _ Implements ITagger(Of TextMarkerTag).TagsChanged 
void ViewLayoutChanged(object sender, TextViewLayoutChangedEventArgs e) < if (e.NewSnapshot != e.OldSnapshot) //make sure that there has really been a change < UpdateAtCaretPosition(View.Caret.Position); >> void CaretPositionChanged(object sender, CaretPositionChangedEventArgs e) < UpdateAtCaretPosition(e.NewPosition); >void UpdateAtCaretPosition(CaretPosition caretPosition)
Private Sub ViewLayoutChanged(ByVal sender As Object, ByVal e As TextViewLayoutChangedEventArgs) If e.NewSnapshot IsNot e.OldSnapshot Then 'make sure that there has really been a change UpdateAtCaretPosition(View.Caret.Position) End If End Sub Private Sub CaretPositionChanged(ByVal sender As Object, ByVal e As CaretPositionChangedEventArgs) UpdateAtCaretPosition(e.NewPosition) End Sub Private Sub UpdateAtCaretPosition(ByVal caretPosition As CaretPosition) CurrentChar = caretPosition.Point.GetPoint(SourceBuffer, caretPosition.Affinity) If Not CurrentChar.HasValue Then Exit Sub End If RaiseEvent TagsChanged(Me, New SnapshotSpanEventArgs(New SnapshotSpan(SourceBuffer.CurrentSnapshot, 0, SourceBuffer.CurrentSnapshot.Length))) End Sub 
public IEnumerable> GetTags(NormalizedSnapshotSpanCollection spans) < if (spans.Count == 0) //there is no content in the buffer yield break; //don't do anything if the current SnapshotPoint is not initialized or at the end of the buffer if (!CurrentChar.HasValue || CurrentChar.Value.Position >= CurrentChar.Value.Snapshot.Length) yield break; //hold on to a snapshot of the current character SnapshotPoint currentChar = CurrentChar.Value; //if the requested snapshot isn't the same as the one the brace is on, translate our spans to the expected snapshot if (spans[0].Snapshot != currentChar.Snapshot) < currentChar = currentChar.TranslateTo(spans[0].Snapshot, PointTrackingMode.Positive); >//get the current char and the previous char char currentText = currentChar.GetChar(); SnapshotPoint lastChar = currentChar == 0 ? currentChar : currentChar - 1; //if currentChar is 0 (beginning of buffer), don't move it back char lastText = lastChar.GetChar(); SnapshotSpan pairSpan = new SnapshotSpan(); if (m_braceList.ContainsKey(currentText)) //the key is the open brace < char closeChar; m_braceList.TryGetValue(currentText, out closeChar); if (BraceMatchingTagger.FindMatchingCloseChar(currentChar, currentText, closeChar, View.TextViewLines.Count, out pairSpan) == true) < yield return new TagSpan(new SnapshotSpan(currentChar, 1), new TextMarkerTag("blue")); yield return new TagSpan(pairSpan, new TextMarkerTag("blue")); > > else if (m_braceList.ContainsValue(lastText)) //the value is the close brace, which is the *previous* character < var open = from n in m_braceList where n.Value.Equals(lastText) select n.Key; if (BraceMatchingTagger.FindMatchingOpenChar(lastChar, (char)open.ElementAt(0), lastText, View.TextViewLines.Count, out pairSpan) == true) < yield return new TagSpan(new SnapshotSpan(lastChar, 1), new TextMarkerTag("blue")); yield return new TagSpan(pairSpan, new TextMarkerTag("blue")); > > > 
Public Function GetTags(ByVal spans As NormalizedSnapshotSpanCollection) As IEnumerable(Of ITagSpan(Of TextMarkerTag)) Implements ITagger(Of Microsoft.VisualStudio.Text.Tagging.TextMarkerTag).GetTags If spans.Count = 0 Then 'there is no content in the buffer Exit Function End If 'don't do anything if the current SnapshotPoint is not initialized or at the end of the buffer If Not CurrentChar.HasValue OrElse CurrentChar.Value.Position >= CurrentChar.Value.Snapshot.Length Then Exit Function End If 'hold on to a snapshot of the current character Dim currentChar__1 As SnapshotPoint = CurrentChar.Value 'if the requested snapshot isn't the same as the one the brace is on, translate our spans to the expected snapshot If spans(0).Snapshot IsNot currentChar__1.Snapshot Then currentChar__1 = currentChar__1.TranslateTo(spans(0).Snapshot, PointTrackingMode.Positive) End If 'get the current char and the previous char Dim currentText As Char = currentChar__1.GetChar() Dim lastChar As SnapshotPoint = If(CInt(currentChar__1) = 0, currentChar__1, currentChar__1 - 1) 'if currentChar is 0 (beginning of buffer), don't move it back Dim lastText As Char = lastChar.GetChar() Dim pairSpan As New SnapshotSpan() If m_braceList.ContainsKey(currentText) Then 'the key is the open brace Dim closeChar As Char m_braceList.TryGetValue(currentText, closeChar) If BraceMatchingTagger.FindMatchingCloseChar(currentChar__1, currentText, closeChar, View.TextViewLines.Count, pairSpan) = True Then Exit Function End If ElseIf m_braceList.ContainsValue(lastText) Then 'the value is the close brace, which is the *previous* character Dim open = From n In m_braceList _ Where n.Value.Equals(lastText) _ Select n.Key If BraceMatchingTagger.FindMatchingOpenChar(lastChar, CChar(open.ElementAt(0)), lastText, View.TextViewLines.Count, pairSpan) = True Then Exit Function End If End If End Function 
private static bool FindMatchingCloseChar(SnapshotPoint startPoint, char open, char close, int maxLines, out SnapshotSpan pairSpan) < pairSpan = new SnapshotSpan(startPoint.Snapshot, 1, 1); ITextSnapshotLine line = startPoint.GetContainingLine(); string lineText = line.GetText(); int lineNumber = line.LineNumber; int offset = startPoint.Position - line.Start.Position + 1; int stopLineNumber = startPoint.Snapshot.LineCount - 1; if (maxLines >0) stopLineNumber = Math.Min(stopLineNumber, lineNumber + maxLines); int openCount = 0; while (true) < //walk the entire line while (offset < line.Length) < char currentChar = lineText[offset]; if (currentChar == close) //found the close character < if (openCount >0) < openCount--; >else //found the matching close < pairSpan = new SnapshotSpan(startPoint.Snapshot, line.Start + offset, 1); return true; >> else if (currentChar == open) // this is another open < openCount++; >offset++; > //move on to the next line if (++lineNumber > stopLineNumber) break; line = line.Snapshot.GetLineFromLineNumber(lineNumber); lineText = line.GetText(); offset = 0; > return false; > 
Private Shared Function FindMatchingCloseChar(ByVal startPoint As SnapshotPoint, ByVal open As Char, ByVal close As Char, ByVal maxLines As Integer, ByRef pairSpan As SnapshotSpan) As Boolean pairSpan = New SnapshotSpan(startPoint.Snapshot, 1, 1) Dim line As ITextSnapshotLine = startPoint.GetContainingLine() Dim lineText As String = line.GetText() Dim lineNumber As Integer = line.LineNumber Dim offset As Integer = startPoint.Position - line.Start.Position + 1 Dim stopLineNumber As Integer = startPoint.Snapshot.LineCount - 1 If maxLines > 0 Then stopLineNumber = Math.Min(stopLineNumber, lineNumber + maxLines) End If Dim openCount As Integer = 0 While True 'walk the entire line While offset < line.Length Dim currentChar As Char = lineText(offset) If currentChar = close Then 'found the close character If openCount >0 Then openCount -= 1 Else 'found the matching close pairSpan = New SnapshotSpan(startPoint.Snapshot, line.Start + offset, 1) Return True End If ElseIf currentChar = open Then ' this is another open openCount += 1 End If offset += 1 End While 'move on to the next line If System.Threading.Interlocked.Increment(lineNumber) > stopLineNumber Then Exit While End If line = line.Snapshot.GetLineFromLineNumber(lineNumber) lineText = line.GetText() offset = 0 End While Return False End Function 
private static bool FindMatchingOpenChar(SnapshotPoint startPoint, char open, char close, int maxLines, out SnapshotSpan pairSpan) < pairSpan = new SnapshotSpan(startPoint, startPoint); ITextSnapshotLine line = startPoint.GetContainingLine(); int lineNumber = line.LineNumber; int offset = startPoint - line.Start - 1; //move the offset to the character before this one //if the offset is negative, move to the previous line if (offset < 0) < line = line.Snapshot.GetLineFromLineNumber(--lineNumber); offset = line.Length - 1; >string lineText = line.GetText(); int stopLineNumber = 0; if (maxLines > 0) stopLineNumber = Math.Max(stopLineNumber, lineNumber - maxLines); int closeCount = 0; while (true) < // Walk the entire line while (offset >= 0) < char currentChar = lineText[offset]; if (currentChar == open) < if (closeCount >0) < closeCount--; >else // We've found the open character < pairSpan = new SnapshotSpan(line.Start + offset, 1); //we just want the character itself return true; >> else if (currentChar == close) < closeCount++; >offset--; > // Move to the previous line if (--lineNumber < stopLineNumber) break; line = line.Snapshot.GetLineFromLineNumber(lineNumber); lineText = line.GetText(); offset = line.Length - 1; >return false; > 
Private Shared Function FindMatchingOpenChar(ByVal startPoint As SnapshotPoint, ByVal open As Char, ByVal close As Char, ByVal maxLines As Integer, ByRef pairSpan As SnapshotSpan) As Boolean pairSpan = New SnapshotSpan(startPoint, startPoint) Dim line As ITextSnapshotLine = startPoint.GetContainingLine() Dim lineNumber As Integer = line.LineNumber Dim offset As Integer = startPoint - line.Start - 1 'move the offset to the character before this one 'if the offset is negative, move to the previous line If offset < 0 Then line = line.Snapshot.GetLineFromLineNumber(System.Threading.Interlocked.Decrement(lineNumber)) offset = line.Length - 1 End If Dim lineText As String = line.GetText() Dim stopLineNumber As Integer = 0 If maxLines >0 Then stopLineNumber = Math.Max(stopLineNumber, lineNumber - maxLines) End If Dim closeCount As Integer = 0 While True ' Walk the entire line While offset >= 0 Dim currentChar As Char = lineText(offset) If currentChar = open Then If closeCount > 0 Then closeCount -= 1 Else ' We've found the open character pairSpan = New SnapshotSpan(line.Start + offset, 1) 'we just want the character itself Return True End If ElseIf currentChar = close Then closeCount += 1 End If offset -= 1 End While ' Move to the previous line If System.Threading.Interlocked.Decrement(lineNumber) < stopLineNumber Then Exit While End If line = line.Snapshot.GetLineFromLineNumber(lineNumber) lineText = line.GetText() offset = line.Length - 1 End While Return False End Function 

Реализация поставщика тегов сопоставления фигурных скобок

Помимо реализации тегов, необходимо также реализовать и экспортировать поставщика тегов. В этом случае тип контента поставщика — text. Таким образом, сопоставление фигурных скобок будет отображаться во всех типах текстовых файлов, но полная реализация применяет фигурные скобки только к конкретному типу контента.

Реализация поставщика тегов сопоставления фигурных скобок

  1. Объявите поставщик тегов, наследующий от IViewTaggerProvider, присвойте ему имя BraceMatchingTaggerProvider и экспортируйте его с текстом ContentTypeAttribute и элементом TagTypeAttributeTextMarkerTag.
[Export(typeof(IViewTaggerProvider))] [ContentType("text")] [TagType(typeof(TextMarkerTag))] internal class BraceMatchingTaggerProvider : IViewTaggerProvider 
 _ _ _ Friend Class BraceMatchingTaggerProvider Implements IViewTaggerProvider 
public ITagger CreateTagger(ITextView textView, ITextBuffer buffer) where T : ITag < if (textView == null) return null; //provide highlighting only on the top-level buffer if (textView.TextBuffer != buffer) return null; return new BraceMatchingTagger(textView, buffer) as ITagger; > 
Public Function CreateTagger(Of T As ITag)(ByVal textView As ITextView, ByVal buffer As ITextBuffer) As ITagger(Of T) Implements IViewTaggerProvider.CreateTagger If textView Is Nothing Then Return Nothing End If 'provide highlighting only on the top-level buffer If textView.TextBuffer IsNot buffer Then Return Nothing End If Return TryCast(New BraceMatchingTagger(textView, buffer), ITagger(Of T)) End Function 

Сборка и проверка кода

Чтобы протестировать этот код, создайте решение BraceMatchingTest и запустите его в экспериментальном экземпляре.

Создание и тестирование решения BraceMatchingTest
  1. Постройте решение.
  2. При запуске этого проекта в отладчике запускается второй экземпляр Visual Studio.
  3. Создайте текстовый файл и введите текст, включающий соответствующие фигурные скобки.
hello < goodbye><>

См. также

Совет Visual Studio. Где идет открытая фигурная скобка?

Хотите начать борьбу между двумя кодировщиками? Спросите их, идет ли открытая фигурная скобка в новой строке или в конце объявления метода! К счастью, вы можете настроить Visual Studio, чтобы поместить фигурную скобку в любом расположении, которое вы предпочитаете. Перейдите к быстрому запуску и введите "формат" вы найдете множество отличных вариантов для управления форматированием кода по умолчанию в Visual Studio. После того как у вас будут нужные параметры, просто используйте сочетание клавиш CTRL+K+D для переформатирования любого существующего кода. Просмотрите форматирование в действии в этом коротком видео.

Хотите начать борьбу между двумя кодировщиками? Спросите их, идет ли открытая фигурная скобка в новой строке или в конце объявления метода! К счастью, вы можете настроить Visual Studio, чтобы поместить фигурную скобку в любом расположении, которое вы предпочитаете. Перейдите к быстрому запуску и введите "формат" вы найдете множество отличных вариантов для управления форматированием кода по умолчанию в Visual Studio. После того как у вас будут нужные параметры, просто используйте сочетание клавиш CTRL+K+D для переформатирования любого существующего кода. Просмотрите форматирование в действии в этом коротком видео.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *