gpt4 book ai didi

c# - 构造函数抛出异常,实例和内存分配发生了什么?

转载 作者:太空狗 更新时间:2023-10-30 00:09:58 25 4
gpt4 key购买 nike

我有这样的课。 (这只是例子)

    public class NewTest
{
public int I { get; set; }
public NewTest()
{
I = 10;
throw new ApplicationException("Not Possible");
}
}

现在如果我像这样使用类

 NewTest t = new NewTest();

在上一行中,NewTest 构造函数抛出异常变量 t 从不分配任何值,因为在构造函数完成之前它抛出异常,但根据测试和其他问题 (Why throwing exception in constructor results in a null reference?) 创建对象。

现在这个对象是在堆中创建的,但它不包含任何根变量以供引用,所以它是否会给垃圾收集带来问题?还是内存泄漏?


以下示例帮助我消除了困惑。另一个例子

 namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
NewMethod();
System.GC.Collect();
Console.WriteLine("Completed");
Console.ReadLine();
}

private static void NewMethod()
{
Object obj = null;
try
{
Console.WriteLine("Press any key to continue");
Console.ReadLine();
NewTest t = new NewTest(out obj);
}
catch
{
Console.WriteLine("Exception thrown");
}

try
{
Console.WriteLine("Press any key to continue");
Console.ReadLine();
NewTest1 t = new NewTest1();
}
catch
{
Console.WriteLine("Exception thrown");
}

Console.WriteLine("Press any key to continue");
Console.ReadLine();

System.GC.Collect();

Console.WriteLine("Press any key to continue");
Console.ReadLine();

}
}

public class NewTest1
{
public int I { get; set; }
public NewTest1()
{
I = 10;
throw new ApplicationException("Not Possible");
}
}

public class NewTest
{
public int I { get; set; }
public NewTest(out Object obj)
{
obj = this;
I = 10;
throw new ApplicationException("Not Possible");
}
}
}

最佳答案

其他答案正确;我将向他们添加一个有趣的事实,即其构造函数抛出的可终结对象仍然是最终确定的。这意味着终结器可以对其构造函数未正常完成的对象进行操作。 终结器不得假定对象在终结时就已初始化。这是难以编写正确的终结器的众多原因中的另一个原因。

关于c# - 构造函数抛出异常,实例和内存分配发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40692553/

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