gpt4 book ai didi

c# - 具有函数作用域的变量

转载 作者:行者123 更新时间:2023-11-30 14:02:36 25 4
gpt4 key购买 nike

如果抛出异常,CLR 如何处理具有函数作用域的局部变量。是必须使用 finally block 还是一旦流离开函数就释放变量

下面是一个小例子

    protected void FunctionX()
{
List<Employee> lstEmployees;
try
{
lstEmployees= new List<Employee>();
int s = lstEmployees[1].ID; // code intended to throw exception
}
catch (Exception ex)
{
ManageException(ex, ShowMessage); //exception is thrown here
}
finally { lstEmployees= null; } // Is the finally block required to make sure the list is cleaned
}

最佳答案

要回答您的具体问题,不,finally不需要您列出的 block 。

正在分配 null引用变量实际上 任何事情,因为垃圾收集是不确定的。作为一个简单的解释,垃圾收集器会不时地检查堆中的对象以确定是否有对它们的任何事件引用(这称为“有根”)。如果没有事件引用,则这些引用符合垃圾回收条件。

您分配给 null不需要,因为一旦函数退出,lstEmployees变量将超出范围,不再被视为对您在 try 中创建的实例的事件引用 block 。

某些类型(在 .NET 和第三方库中)实现了 IDisposable通过 Dispose() 接口(interface)并公开一些确定性的清理程序功能。使用这些类型时,您应该始终调用Dispose()当你完成类型时。如果实例的生命周期不应超出函数的生命周期,那么您可以使用 using() { } block ,但这仅在类型实现 IDisposable 时才需要,这List<T> (如您在示例中使用的那样)没有。

关于c# - 具有函数作用域的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5622911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com