您的位置:首页 > 移动开发

对象引用机制中容易被忽略的编码错误

2008-01-08 10:29 302 查看
 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();
                      }
           }
  }

输出如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐