下面是相关的代码,有疑问的代码用红色表示。主要是对代码执行的顺序有疑问,所以理解不了。
public sealed class EventHandlerList : IDisposable
{
// Fields
private ListEntry head;
private Component parent; // Methods
public EventHandlerList()
{
} internal EventHandlerList(Component parent)
{
this.parent = parent;
} public void AddHandler(object key, Delegate value)
{
ListEntry entry = this.Find(key);
if (entry != null)
{
entry.handler = Delegate.Combine(entry.handler, value);
}
else
{
this.head = new ListEntry(key, value, this.head);//就是这句
//既然是给字段head赋值(当然,是把对象引用赋给它),但是,在对象实例化的构造函数中,又使用了head字段。那,岂不是字段head还属于null?
}
} public void AddHandlers(EventHandlerList listToAddFrom)
{
for (ListEntry entry = listToAddFrom.head; entry != null; entry = entry.next)
{
this.AddHandler(entry.key, entry.handler);
}
} public void Dispose()
{
this.head = null;
} private ListEntry Find(object key)
{
ListEntry head = this.head;
while (head != null)
{
if (head.key == key)
{
return head;
}
head = head.next;
}
return head;
} public void RemoveHandler(object key, Delegate value)
{
ListEntry entry = this.Find(key);
if (entry != null)
{
entry.handler = Delegate.Remove(entry.handler, value);
}
} // Properties
public Delegate this[object key]
{
get
{
ListEntry entry = null;
if ((this.parent == null) || this.parent.CanRaiseEventsInternal)
{
entry = this.Find(key);
}
if (entry != null)
{
return entry.handler;
}
return null;
}
set
{
ListEntry entry = this.Find(key);
if (entry != null)
{
entry.handler = value;
}
else
{
this.head = new ListEntry(key, value, this.head);
}
}
} // Nested Types
private sealed class ListEntry
{
// Fields
internal Delegate handler;
internal object key;
internal EventHandlerList.ListEntry next; // Methods
public ListEntry(object key, Delegate handler, EventHandlerList.ListEntry next)
{
this.next = next;
this.key = key;
this.handler = handler;
}
}
}
public sealed class EventHandlerList : IDisposable
{
// Fields
private ListEntry head;
private Component parent; // Methods
public EventHandlerList()
{
} internal EventHandlerList(Component parent)
{
this.parent = parent;
} public void AddHandler(object key, Delegate value)
{
ListEntry entry = this.Find(key);
if (entry != null)
{
entry.handler = Delegate.Combine(entry.handler, value);
}
else
{
this.head = new ListEntry(key, value, this.head);//就是这句
//既然是给字段head赋值(当然,是把对象引用赋给它),但是,在对象实例化的构造函数中,又使用了head字段。那,岂不是字段head还属于null?
}
} public void AddHandlers(EventHandlerList listToAddFrom)
{
for (ListEntry entry = listToAddFrom.head; entry != null; entry = entry.next)
{
this.AddHandler(entry.key, entry.handler);
}
} public void Dispose()
{
this.head = null;
} private ListEntry Find(object key)
{
ListEntry head = this.head;
while (head != null)
{
if (head.key == key)
{
return head;
}
head = head.next;
}
return head;
} public void RemoveHandler(object key, Delegate value)
{
ListEntry entry = this.Find(key);
if (entry != null)
{
entry.handler = Delegate.Remove(entry.handler, value);
}
} // Properties
public Delegate this[object key]
{
get
{
ListEntry entry = null;
if ((this.parent == null) || this.parent.CanRaiseEventsInternal)
{
entry = this.Find(key);
}
if (entry != null)
{
return entry.handler;
}
return null;
}
set
{
ListEntry entry = this.Find(key);
if (entry != null)
{
entry.handler = value;
}
else
{
this.head = new ListEntry(key, value, this.head);
}
}
} // Nested Types
private sealed class ListEntry
{
// Fields
internal Delegate handler;
internal object key;
internal EventHandlerList.ListEntry next; // Methods
public ListEntry(object key, Delegate handler, EventHandlerList.ListEntry next)
{
this.next = next;
this.key = key;
this.handler = handler;
}
}
}
解决方案 »
- 看看这个简单的“WINDOWS服务“程序代码为何不执行?
- DataGridView控件中DataGridViewCheckBoxColumn选中问题
- 基类居然能赋值给子类,为什么?
- 有没有winform里面的文本编辑器,例如文本编辑器FCKeditor的使用?
- 在c#里如何让一个程序只运行一次,再运行该程序则选中第一次运行界面
- 问一个关于软件测试的问题?
- 小菜鸟碰到一个问题:怎么把DataSet中的内容有选择性的加到数据库
- 这里有做过电子杂志制作器的高人吗,现金购买源码
- 关于在webform中嵌入winform的。给点建议。
- 读中文文本文件,并分割的问题
- winform 打包,怎么可以双击运行包里面的dotnetfx.exe
- 在一个窗体上,用GDI+显示了一图片,还有一个工具栏,当图片大于窗体大小时,拖动滚动条后,工具栏也跟着一起滚动?如何让工具栏不动?
通过 new ListEntry(key, value, this.head);
this.head 添加 ListEntry的第一个 节点
其实我想就是一个简单的链表节点的添加和删除的功能
这好像是一个链表
不知道理解正确不