class SubObject
{
protected Wrapper _wrapper;
protected string _name;
public override string ToString()
{
return _name;
}
public SubObject(string name)
{
_name = name;
}
public void SetWrapper(Wrapper wrapper)
{
_wrapper = wrapper;
_wrapper.SetContext(this);
}
public Wrapper GetWrapper()
{
return _wrapper;
}
}
class Wrapper
{
protected SubObject _subObject;
public SubObject GetConext()
{
return _subObject;
}
public void SetContext(SubObject subObject)
{
_subObject = subObject;
}
public void Debug()
{
Console.WriteLine(_subObject.ToString());
}
}
class Application
{
[STAThread]
static void Main(string[] args)
{
Test1();
Test2();
Console.Read();
}
static void Test1()
{
Console.WriteLine("错误的编码方式,出现了subjects[0]和subjects[1]之间共有的wrapper变量引用,所以Debug输出依赖于最后一次SetWrapper操作");
SubObject[] subjects = new SubObject[]{new SubObject("子对象1"),new SubObject("子对象2")};
Wrapper wrapper = new Wrapper();
subjects[0].SetWrapper(wrapper);
subjects[1].SetWrapper(wrapper);
foreach(SubObject obj in subjects)
{
obj.GetWrapper().Debug();
}
}
static void Test2()
{
Console.WriteLine("正确的编码方式,切断了subjects[0]和subjects[1]之间共有地址引用,所以Debug输出体现了原本真实的意图");
SubObject[] subjects = new SubObject[]{new SubObject("子对象1"),new SubObject("子对象2")};
subjects[0].SetWrapper(new Wrapper());
subjects[1].SetWrapper(new Wrapper());
foreach(SubObject obj in subjects)
{
obj.GetWrapper().Debug();
}
}
}
输出如下: