识别Visual Studio中的一次性对象?

T D*_*yen 22 .net c# intellisense idisposable visual-studio

建议IDisposable对象应该在using声明中或通过调用Dispose()方法处理.我发现在Visual Studio中查找对象是否是一次性的并不直观.

我的问题是:有没有办法识别IDisposableVS中的对象?

And*_*rei 27

如果您想在VS中以不同方式突出显示一次性物体,请查看此文章.我个人更喜欢Resharper的回答,因为我总是使用R#.

如果您只是想知道您的对象是否是某个接口的实例,您可以右键单击变量名称和/ Navigate -> Object BrowserGo to Declaration然后右键单击类名Go to Definition/ Peek Definition.

在此输入图像描述

您可能会喜欢Peek Definition它,因为它显示了您需要的所有内联:

在此输入图像描述

您可以随时检查对象具有哪些方法,如果它有Dispose()方法,则99.9%它是一次性对象.对于那些给方法不好的人:)我会给这个0.01%.


Dam*_*ver 12

我很惊讶没有人提到过这个.如果您的Visual Studio版本支持它,我建议启用Code Analysis for Build.

完成后,选择您喜欢的任何规则集,只要它们确保至少CA2000(丢失范围之前丢弃对象),CA2213(应丢弃一次性字段)和CA2202(不要多次丢弃对象)规则是覆盖.这样,如果您没有正确处理一次性对象,编译器应该对您大喊大叫.

(虽然注意到让编译器标记一次性对象的某些用法然后会变成更大的挑战,因为许多StackOverflow问题可以证明)


Ale*_* L. 8

您可以使用对象浏览器查看已实现接口的类继承层次结构

在此输入图像描述


Tim*_*ter 7

为了完整起见,如果你不问如何在你的代码中检查它,但你只想知道在类型实现类似接口时你可以看到哪里IDisposable,你可以随时查看MSDN.

例如 FileStream

  • 它已经在备注部分提到:

此类型实现IDisposable接口.使用完该类型后,应直接或间接处理.要直接处理类型,请在try/catch块中调用其Dispose方法.要间接处理它,请使用语言构造,例如使用(在C#中)或使用(在Visual Basic中).有关更多信息,请参阅IDisposable接口主题中的"使用实现IDisposable的对象"部分.


如果您想知道如何在Visual Studio中查找接口的实现,这里已经有一个问题可以解答:

你如何找到界面的所有实现?


The*_*der 6

查看类实现的接口以及所有公开的字段,属性,方法等的方法是在代码中转到该类.例如:

Image image = Image.FromFile(path);
Run Code Online (Sandbox Code Playgroud)

确保单击该类,而不是实例,然后按F12.这将带您进入该类的元数据文件.例如:该Image.cs文件具有以下类声明:

public abstract class Image : MarshalByRefObject, ISerializable, ICloneable, IDisposable
Run Code Online (Sandbox Code Playgroud)

然后,您还可以使用F12单击其他类.请注意,这些类通常在Visual Studio中以浅蓝色显示:

屏幕截图显示浅蓝色.

您还可以通过右键单击该类并从下拉列表中选择"转到定义"来获取此元数据文件.


虽然不理想,但你也可以去一个班级的实例,并把它.放在最后.这应该调出intellisense,您将能够Dispsose()在列表中看到该项是否实现了接口.

您也可以只编写myInstance.Dispose();或者using (myInstance = new MyClass()) {}如果它编译该类实现接口,否则它不会.


jim*_*gee 6

作为一个(愚蠢的?)替代 Resharper 及其同类产品的方法,Visual Studio 确实有外部工具的概念(在“工具”菜单中),您可以(ab)使用它来执行以下操作:

  • 标题: Is Disposa&ble
  • 命令: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  • 论据: -Command "&{$i=[Type]::GetType('System.IDisposable');[AppDomain]::CurrentDomain.GetAssemblies()|%{ $_.GetTypes()}|?{$_.FullName.EndsWith('.$(CurText)')}|%{New-Object PSObject -Property @{'Type'=$_;'IDisposable'=$i.IsAssignableFrom($_)}}|ft}"
  • 使用输出窗口: 选中

这将读取您在编辑器中选择的任何字符串,搜索以该字符串作为名称的 .NET 类型,并显示该字符串是否实现 IDisposable 的 True/False。

该工具中的 Powershell 命令只是我可以用来演示这种可能性的最快方法,但它远非完美——它只能查找 Powershell 默认加载的程序集中的类型。如果您想扩展这个想法,您可以构建一个命令行 .NET 应用程序来加载您的项目并扫描项目加载的所有程序集。

Stream例如,如果您在代码中突出显示该单词,并运行外部工具(示例中为ALT+ TALT+ ),它将返回:B

I型一次性
---- ------------
系统.IO.流 True

分解Powershell命令:

&{ $i=[Type]::GetType('System.IDisposable');        # Get the IDisposable interface
   [AppDomain]::CurrentDomain.GetAssemblies() `     # Get all loaded assemblies
    | %{ $_.GetTypes() } `                          # For each assembly, get all types
    | ?{ $_.FullName.EndsWith('.$(CurText)') } `    # Filter types that are named $(CurText) - $(CurText) is a macro within VS External Tools
    | %{ New-Object PSObject -Property @{           # For each type, return an object containing...
         'Type' = $_;                               # ...the type name...
         'IDisposable' = $i.IsAssignableFrom($_)    # ...and whether the IDisposable interface is implemented
       } } `
    | ft }                                          # Format all returned objects as a table
Run Code Online (Sandbox Code Playgroud)