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, ITextDocumentSnapshot e 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 da un punto nel tempo o versione.
- Questo oggetto non è modificabile e non cambierà mai dopo la creazione.
ITextDocumentSnapshot
non può essere modificato direttamente. Tutte le modifiche vengono richieste tramite mutazione. Vedere Apportare modifiche in un documento di testo da un'estensione.
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 l'accesso al testo.
Procedure consigliate:
- È possibile usare Position e Span per rappresentare le sottostringhe nel documento senza copiare o allocare stringhe in sospeso. La maggior parte delle API opera in termini di queste primitive.
- È possibile usare la sintassi dell'indicizzatore,
textDocument[0]
, per leggere il carattere in base al carattere nel documento senza copiarlo in una stringa. - Se è necessario creare una stringa come per l'uso come chiave del dizionario, usare l'overload che accetta un
Span
oggetto per evitare di creare una stringa di recapito di grandi dimensioni dall'intera riga o documento. - Evitare di presupporre che righe o documenti siano brevi. Molte lingue si minificano in righe enormi o utilizzano 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 relativo
TranslateTo()
metodo in modo che la versione precedenteITextDocumentSnapshot
possa essere sottoposto a Garbage Collection.
- 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 relativo
Position
Rappresenta una posizione all'interno del documento di testo. Invece delle int
posizioni, il tipo Position è a conoscenza dell'oggetto ITextDocumentSnapshot da cui proviene e supporta GetChar()
per ottenere direttamente il carattere in quel punto.
Se si ha familiarità con le estensioni legacy di Visual Studio, Position è quasi identico a SnapshotPoint e supporta la maggior parte degli stessi metodi.
Span
Rappresenta una sottostringa contigua di caratteri all'interno di un oggetto 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 comprenderlo in una stringa in modo posticipato.
Se si ha familiarità con le estensioni legacy di Visual Studio, Position
è quasi identico a SnapshotSpan e supporta la maggior parte degli stessi metodi.
Contenuto correlato
Esaminare il codice di esempio per una semplice estensione basata su editor: