【发布时间】:2014-09-25 10:45:29
【问题描述】:
我有一种方法,我想初始化一个类的对象(例如获取部门列表)并在 try/catch 块中使用相同的对象(例如返回该部门列表),然后想将其设置为 null。
-
一种方式
public List<Departments> GetAllDepartments() { List<Departments> listDepartments = null; try { listDepartments = IDepartment.GetAllDepartments(); return listDepartments; } catch (System.Exception ex) { throw ex; } finally { listDepartments = null; } } -
另一种方式
public List<Departments> GetAllDepartments() { try { List<Departments> listDepartments = IDepartment.GetAllDepartments(); return listDepartments; } catch (System.Exception ex) { throw ex; } }
哪个最好?如果有任何其他方式,请告诉我。我和我的办公室同事讨论过这个问题,有人告诉我,在一种方法中,我强制编译器初始化对象(这里是 listDepartment),首先设置为 null,然后强制使用数据库对象进行编译。
注意:我无法使用 IDisposable。
很抱歉,我无法在第一次运行时非常清楚地提出问题。这只是部门的一个例子,实际上我的方法中还有许多其他过滤器和其他对象。我主要关心的是,当第一行捕获时,编译器将如何工作,例如 ' List listx = null; ' 和 listx = new xClass();或 listx = [数据库调用]。正如我的办公室同事告诉我的,这是编译器的额外开销。我想在这里清除我的这个疑问。
请忘记上面的问题
我在这里重新定义我的问题。
问题: 我和我的一位办公室同事就初始化对象并在使用后将其设置为 null 进行了辩论。
我建议他使用以下方法来释放该对象:
public string something()
{
Department objDepartment = null;
try
{
objDepartment = new Department();
}
catch
.
.
.
finally
{
objDepartment = null;
}
}
我的办公室同事告诉我,首先在这里我强制 .net 编译器使用 null 初始化 objDepartment,然后在 try 块内我再次强制 .net 编译器使用实际实例初始化 objDepartment。所以根据他的说法,代码应该是:
public string something()
{
try
{
Department objDepartment = new Department();
}
catch
.
.
.
}
所以我的问题是:一旦使用了对象,我如何释放它,因为 objDepartment 在 finally 块中不可用,因为它的范围现在仅在 try 块内。如果有任何其他初始化方式,请使用它并最终释放它。
另一个条件是,我不能使用 IDisposable。
感谢所有参与并给出答案的人。还有一次,我期待您的积极参与。
【问题讨论】:
-
为什么捕获异常只是为了重新抛出它们?这样你会丢失堆栈跟踪。
-
你为什么要创建
listDepartments而不是简单的return IDepartment.GetAllDepartments();? -
为什么要在方法结束时将局部变量设置为 null?你期望它实现什么?为什么你的方法体不只是
return IDepartment.GetAllDepartments();? -
@DenielKelley 谢谢,但如果你提供一些代码示例,那么它真的很有帮助。
-
如果您需要重新抛出异常,请仅使用 throw,这样可以保留堆栈跟踪。