对象引用机制中容易被忽略的编码错误
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();
}
}
}
输出如下:
{
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();
}
}
}
输出如下:
相关文章推荐
- 【.NET深呼吸】清理对象引用,有一个问题容易被忽略
- “对象被多次指定;已忽略多余的指定”并伴有"无法解析的外部符号 "xxx",该符号在函数 "xxx"中被引用的错误"
- 详谈CSS网页布局中容易发生的错误编码
- url重写(urlrewriter)引起的"未将对象引用设置到对象的实例"错误发生的原因
- SQL错误:无法删除对象 '****',因为该对象正由一个 FOREIGN KEY 约束引用。
- 使用JNDI的一个容易忽略的错误
- 中文机器做source code时编码错误问题---perl的引用文件大红叉错误
- 网站发布后,出现错误“应用程序中的服务器错误”未将对象引用设置到对象的实例
- SQL错误:无法删除对象 '****',因为该对象正由一个 FOREIGN KEY 约束引用。
- 重复定义造成未将对象引用设置到对象的实例错误
- Android开发容易忽略的小错误记录整理
- 在发布程序时重新编译,报错“未将对象引用设置到对象的实例”的错误
- java中基本变量、对象、对象引用等在堆与栈中存储、按值传递机制、栈中对象共享机制
- 深入分析Win7的对象引用跟踪机制
- System.NullReferenceException:未将对象引用设置到对象的实例,这是一个新鸟,中鸟,老鸟都避不开的错误
- 详谈CSS网页布局中容易发生的错误编码
- C# DataTable 对象转换成Json时 出现 序列化类型为“System.Reflection.Module”的对象时检测到循环引用 的错误!
- 开启时“意外错误,保存方案” --未将对象引用设置到对象的实例怎么解决
- Windows Form 和 UserControl的“未将对象引用设置到一个对象实例”错误(转)
- SQL Server 致程序员(容易忽略的错误)