编辑器扩展性概念

本文介绍表示 Visual Studio 编辑器和打开进行编辑的文本文档的扩展性对象模型。 有关使用编辑器扩展功能的简介,请参阅 使用 Visual Studio 编辑器扩展性

Visual Studio 编辑器的扩展性对象模型由几个整部分组成。 本文介绍 ITextViewSnapshotITextDocumentSnapshot 以及整个文档的其他抽象表示形式。 本文还介绍了 TextPositionTextRange,分别表示文本的位置和范围。

ITextViewSnapshot

ITextViewSnapshot 类包含获取 ITextDocumentSnapshot 类和文本视图的某些属性(如选择)所需的 URI 和版本信息。

  • 此对象是不可变的,在创建后永远不会更改。
  • 可以使用 ITextViewSnapshot.GetTextDocumentAsync() 从文档获取内容。 调用此方法的成本很高,仅当需要文档内容时,才应执行此作。
  • ITextViewSnapshot无法直接更改该类。 所有更改均通过变异请求。 有关详细信息,请参阅 从扩展对文本文档中进行更改

ITextDocumentSnapshot

ITextDocumentSnapshot 类包含来自时间点或版本的文本文档的内容。

  • 此对象是不可变的,在创建后永远不会更改。
  • ITextDocumentSnapshot无法直接更改该类。 所有更改均通过变异请求。 有关详细信息,请参阅 从扩展对文本文档中进行更改

如果熟悉旧版 Visual Studio 扩展,ITextDocumentSnapshot 几乎与 ITextSnapshot 相同,并且支持访问文本的大多数相同方法。

最佳做法

  • 使用位置和范围来表示文档中的子字符串,而无需通过复制或分配字符串来消耗资源。 大多数 API 在这些基元中运行。
  • 使用索引器语法, textDocument[0]在文档中按字符读取字符,而无需将其复制到字符串。
  • 如果必须创建字符串(例如用作字典键),请使用重载 Range ,避免从整个行或文档中创建大型抛出字符串。
  • 避免假设行或文档较短。 多种语言会简化成包含大量数据的行,或消耗大量文件。
  • ITextDocumentSnapshot 类引用大型数据结构,如果存储了足够旧的版本,可能会消耗内存。 最佳做法是定期通过TranslateTo()方法将您长期存储的位置和范围更新为最新文档版本,这样旧版本ITextDocumentSnapshot就可以被垃圾回收。

位置

TextPosition 类表示文本文档中的位置。 与int 位置不同,该TextPosition 类型了解其来源的 ITextDocumentSnapshot 类,并支持GetChar() 在该点直接获取字符。

如果你熟悉旧版 Visual Studio 扩展,则几乎与 TextPosition 相同,并且支持大多数相同的方法。

范围

TextRange 类表示 ITextDocumentSnapshot 类中字符的连续子字符串。 与使用 string.Substring()ITextDocumentSnapshot.CopyToString()创建的字符串相反,创建 TextRange 类不需要任何分配或额外的内存。 稍后,可以调用 CopyToString() 以延迟的方式将其实现为字符串。

如果熟悉旧的 Visual Studio 扩展,TextRange 几乎与 SnapshotSpan 相同,并支持大多数相同的方法。

跟踪模式

这些 TextPositionTextRange 类与特定 ITextDocumentSnapshot 类相关联,该类是文档在特定时间的状态。 可以使用这些 TranslateTo 方法将此类位置和范围转换为不同的快照。 此类翻译将考虑在位置或范围之前、之后或中间添加或删除的任何文本。 当任何编辑恰好发生在指定位置或范围边缘时,TextPositionTrackingModeTextRangeTrackingMode用于确定翻译应该如何运作。

标记

标记器 用于将数据( 标记)与文本范围相关联。 其他 Visual Studio 功能(例如 CodeLens分类)使用此类数据。