Condividi tramite


Concetti di estendibilità dell'editor

Questo articolo descrive il modello a oggetti di estendibilità che rappresenta l'editor di Visual Studio e il documento di testo aperto per la modifica. Per un'introduzione all'uso della funzionalità di estensione dell'editor, vedere Usare l'estendibilità dell'editor di Visual Studio.

Il modello a oggetti di estendibilità di Visual Studio Editor è costituito da alcune parti integrali. Questo articolo illustra ITextViewSnapshot, ITextDocumentSnapshote altre rappresentazioni astratte dell'intero documento, nonché Position e Span, che rappresentano rispettivamente la posizione e gli intervalli di testo.

ITextViewSnapshot

ITextViewSnapshot contiene le informazioni sull'URI e sulla versione necessarie per acquisire un ITextDocumentSnapshot e alcune proprietà della visualizzazione testo, ad esempio le selezioni.

  • Questo oggetto non è modificabile e non cambierà mai dopo la creazione.
  • È possibile usare ITextViewSnapshot.GetTextDocumentAsync() per ottenere il contenuto dal documento. La chiamata a questo metodo è costosa e deve essere eseguita solo se è necessario il contenuto del documento.
  • ITextViewSnapshot non può essere modificato direttamente. Tutte le modifiche vengono richieste tramite mutazione. Vedere Apportare modifiche in un documento di testo da un'estensione.

ITextDocumentSnapshot

ITextDocumentSnapshot contiene il contenuto del documento di testo a partire da un certo punto nel tempo o da una certa versione.

Se si ha familiarità con le estensioni legacy di Visual Studio, ITextDocumentSnapshot è quasi uguale a ITextSnapshot e supporta la maggior parte degli stessi metodi per accedere al testo.

Procedure consigliate:

  • È possibile usare Position e Span per rappresentare le sottostringhe nel documento senza spendere risorse per copiare o allocare stringhe. La maggior parte delle API opera in termini di queste primitive.
  • È possibile usare la sintassi dell'indicizzatore, textDocument[0], per leggere carattere per carattere nel documento senza copiarlo in una stringa.
  • Se è necessario creare una stringa, ad esempio per l'uso come chiave del dizionario, usi l'overload che accetta un Span, per evitare di creare una grande stringa inutile dall'intera riga o documento.
  • Evitare di presupporre che righe o documenti siano brevi. Molte lingue si riducono in lunghi tratti di codice o consumano file molto grandi
    • ITextDocumentSnapshot fa riferimento a strutture di dati di grandi dimensioni che possono utilizzare memoria se è archiviata una versione sufficientemente recente. La procedura consigliata consiste nell'aggiornare periodicamente le posizioni e gli intervalli archiviati a lungo termine alla versione più recente del documento tramite il metodo TranslateTo(), affinché la versione precedente ITextDocumentSnapshot possa essere rimossa automaticamente dalla memoria.

Posizione

Rappresenta una posizione all'interno del documento di testo. Invece di int posizioni, il tipo Position è a conoscenza del ITextDocumentSnapshot proviene e supporta GetChar() per ottenere direttamente il carattere a quel punto.

Se si ha familiarità con le estensioni legacy di Visual Studio, Position è quasi uguale a SnapshotPoint e supporta la maggior parte degli stessi metodi.

Ampiezza

Rappresenta una sottostringa contigua di caratteri all'interno di un ITextDocumentSnapshot. Anziché una stringa creata con string.Substring() o ITextDocumentSnapshot.CopyToString(), la creazione di un oggetto Span non richiede allocazioni o memoria aggiuntiva. In seguito è possibile chiamare Span.GetText() per convertirlo in una stringa in modo differito.

Se si ha familiarità con le estensioni legacy di Visual Studio, Position è quasi uguale a snapshotSpan e supporta la maggior parte degli stessi metodi.

Esaminare il codice di esempio per una semplice estensione basata su editor: