【发布时间】:2017-07-04 11:27:37
【问题描述】:
有人可以详细说明一下下面的场景吗,如果说明包括内存分配及其对三种情况的参考会更方便:
- 三种情况下的流程是如何执行的?
- 为什么三种情况下的流量不同?
- 虽然两个类之间存在循环依赖关系,但为什么在其余案例失败的情况下单独执行案例 1?
案例一
namespace CircularDependency_1
{
class Program
{
static void Main(string[] args)
{
A a = new A();
Console.WriteLine("executed");
Console.ReadLine();
}
}
public class B
{
public static A a = new A();
public B()
{
Console.WriteLine("Creating B");
}
}
public class A
{
public static B b = new B();
public A()
{
Console.WriteLine("Creating A");
}
}
}
输出
Creating A
Creating B
Creating A
executed
案例二
namespace CircularDependency_1
{
class Program
{
static void Main(string[] args)
{
A a = new A();
Console.WriteLine("executed");
Console.ReadLine();
}
}
public class B
{
public static A a;
public B()
{
a = new A();
Console.WriteLine("Creating B");
}
}
public class A
{
public static B b;
public A()
{
b = new B();
Console.WriteLine("Creating A");
}
}
}
输出 进程因 StackOverflowException 而终止。
案例三
namespace CircularDependency_1
{
class Program
{
static void Main(string[] args)
{
A a = new A();
Console.WriteLine("executed");
Console.ReadLine();
}
}
public class B
{
public A a;
public B()
{
a = new A();
Console.WriteLine("Creating B");
}
}
public class A
{
public B b;
public A()
{
b = new B();
Console.WriteLine("Creating A");
}
}
}
输出 进程因 StackOverflowException 而终止。
【问题讨论】:
-
为什么要包含
java标签? -
@svasa 我认为这个问题更多是关于 OOPS 而不是面向语言的
-
@RealSkeptic 这不是家庭作业,我也不是学生。我更想知道事情是如何/为什么会以这种方式发生的。我也知道对于案例 1:ObjectA 是从 classB 创建的,ObjectB 是从 classA 创建的,而 ObjectA 是从 main 方法创建的。但问题是为什么在第一种情况下独自一人?
-
您是否尝试过使用调试器执行您的测试用例? (对于那些抛出异常的,您应该能够检查堆栈顶部以查看发生了什么)。