本文介绍表示 Visual Studio 编辑器和打开进行编辑的文本文档的扩展性对象模型。 有关使用编辑器扩展功能的简介,请参阅 使用 Visual Studio 编辑器扩展性。
Visual Studio 编辑器的扩展性对象模型由几个整部分组成。 本文介绍 ITextViewSnapshot、 ITextDocumentSnapshot 以及整个文档的其他抽象表示形式。 本文还介绍了 TextPosition 和 TextRange,分别表示文本的位置和范围。
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 相同,并支持大多数相同的方法。
跟踪模式
这些 TextPosition
和 TextRange
类与特定 ITextDocumentSnapshot
类相关联,该类是文档在特定时间的状态。 可以使用这些 TranslateTo
方法将此类位置和范围转换为不同的快照。 此类翻译将考虑在位置或范围之前、之后或中间添加或删除的任何文本。 当任何编辑恰好发生在指定位置或范围边缘时,TextPositionTrackingMode和TextRangeTrackingMode用于确定翻译应该如何运作。
标记
标记器 用于将数据( 标记)与文本范围相关联。 其他 Visual Studio 功能(例如 CodeLens 和 分类)使用此类数据。
相关内容
- 查看 DocumentSelectorSample 中基于编辑器的简单扩展的示例代码。