c# - C# 在不使用的情况下处理异常资源
问题描述
我正在编写一个包含套接字操作的类库。我不想依赖消费者在完成后或抛出异常时处理资源。
通常我会使用“using”语句,但这在本地范围之外不起作用。就我而言,我正在上课并且在许多公共方法中使用 Socket。连接结束时处理 Socket 很容易,但是在没有“使用”块的情况下抛出异常时如何处理它?
这是我想出的:基本上我用try catch块封装了用户可以访问的每个方法。如果发生异常,我会在向用户抛出异常之前处理资源。
但我想知道是否有更好的选择。如果我对图书馆消费者隐藏这种自动处理,这很糟糕。
public class Foo
{
Socket _socket;
public void method1()
{
try
{
// some work with _socket
}
catch
{
_socket.Dispose();
throw;
}
}
}
解决方案
您有2 个选择:
要么使用标准IDisposable
实现
public class Foo : IDisposable {
Socket _socket;
...
public void method1() {
// working with _socket
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
if (_socket != null) {
_socket.Dispose();
_socket = null;
}
}
}
public void Dispose() {
Dispose(true);
}
}
或者_socket
变成局部变量:
public void method1() {
using (Socket _socket = new Socket(...)) {
// working with _socket
}
}
推荐阅读
- regex - Google Sheet REGEXEXTRACT 提取文本
- flutter - 如何格式化 DateTime.now().toIso8601String()
- javascript - TypeError [ERR_INVALID_ARG_TYPE]:第一个参数必须是 string、Buffer、ArrayBuffer、Array 或 Array-like Object 类型之一
- c# - C#更改嵌套类的方法修饰符
- sql-server - 从 SQL 到 Oracle
- numpy - numpy中的一些数组索引
- python - 使用 xarray 保存多个 netCDF 文件时,笔记本内核死机
- mapkit - 如何让用户在地图上添加图钉并在 SwiftUI 中获取坐标?
- c# - 使用 navlink 时未触发 Blazor ASP.Net Core(服务器端)中的自定义 URL 重写规则
- node.js - 为什么我的 React 应用程序没有在 Heroku 上构建?