LinkedList与lt;T>;和LinkedListNode<;T>;在C#中实现?
首先,让我们定义一个节点:LinkedList与lt;T>;和LinkedListNode<;T>;在C#中实现?,c#,.net,C#,.net,首先,让我们定义一个节点: LinkedListNode<int> node = new LinkedListNode<int>(43); 此时,属性节点.List将发生更改,以包含对链接列表的引用。类似地,如果将其他节点添加到链接列表,则将更新下一个和上一个属性,以反映链接列表的结构,即使这些属性不公开公共集访问器 这种行为是如何实现的 我知道如何使用内部,但有更好的方法吗?例如,假设我有一个包含许多类型的程序集,而不仅仅是LinkedList和LinkedListN
LinkedListNode<int> node = new LinkedListNode<int>(43);
此时,属性节点.List
将发生更改,以包含对链接列表的引用。类似地,如果将其他节点添加到链接列表
,则将更新下一个
和上一个
属性,以反映链接列表的结构,即使这些属性不公开公共集
访问器
这种行为是如何实现的
我知道如何使用内部,但有更好的方法吗?例如,假设我有一个包含许多类型的程序集,而不仅仅是LinkedList
和LinkedListNode
。通过为节点属性列表
、上一个
和下一个
创建设置器,我将这些设置器公开给整个程序集,这是不需要的
这种行为是如何实现的
不看源代码,我猜这些属性的setter或backing字段被标记为internal
,因此可以从LinkedList
访问,因为它们都位于同一个程序集中
但是有更好的办法吗
不是真的。让我详细说明一下。还有其他选择
您可以使LinkedListNode
成为LinkedList
中定义的内部类。这是一个选择,但对打电话的人来说是个负担
您可以将LinkedList
和LinkedListNode
切割到它们自己的程序集中。这显然是用户的负担,可能很快会导致维护失败
我认为这两个都不是更好的解决方案
这种行为是如何实现的
不看源代码,我猜这些属性的setter或backing字段被标记为internal
,因此可以从LinkedList
访问,因为它们都位于同一个程序集中
但是有更好的办法吗
不是真的。让我详细说明一下。还有其他选择
您可以使LinkedListNode
成为LinkedList
中定义的内部类。这是一个选择,但对打电话的人来说是个负担
您可以将LinkedList
和LinkedListNode
切割到它们自己的程序集中。这显然是用户的负担,可能很快会导致维护失败
我认为这两种方法都不是更好的解决方案。我通过ILSpy检查过,只读属性由内部
字段支持
internal LinkedListNode<T> next;
public LinkedListNode<T> Next {
get {
if (this.next != null && this.next != this.list.head) {
return this.next;
}
return null;
}
}
下一步是内部LinkedListNode;
公共LinkedListNode下一步{
得到{
if(this.next!=null&&this.next!=this.list.head){
把这个还给我,下一个;
}
返回null;
}
}
至于如何做得不同,以及讨论您是否想要查看及其答案。我与ILSpy进行了检查,只读属性由内部
字段支持
internal LinkedListNode<T> next;
public LinkedListNode<T> Next {
get {
if (this.next != null && this.next != this.list.head) {
return this.next;
}
return null;
}
}
下一步是内部LinkedListNode;
公共LinkedListNode下一步{
得到{
if(this.next!=null&&this.next!=this.list.head){
把这个还给我,下一个;
}
返回null;
}
}
至于如何做的不同,以及讨论你是否想看,以及它的答案。杰森是正确的。我查看了源代码,LinkedListNode
有内部支持字段
一种方法是使用嵌套类。我不知道这是否是一种“更好”的方式,但它确实避免了内部设置器/字段。我省略了一些实现,因此您可以看到结构的概要:
public class Node<T>
{
private List list;
private Node<T> prev, next;
public List List { get { return list; } }
// other accessors.
public abstract class List
{
Node<T> head;
internal List() { }
public AddFirst(Node<T> node)
{
// node adding logic.
node.list = this;
}
// implementation elided for brevity
}
}
public class MyLinkedList<T> : Node<T>.List { }
公共类节点
{
私人名单;
私有节点prev,next;
公共列表{get{return List;}}
//其他访问者。
公共抽象类列表
{
节点头;
内部列表(){}
公共AddFirst(节点)
{
//节点添加逻辑。
node.list=this;
}
//为简洁起见省略了实现
}
}
公共类MyLinkedList:Node.List{}
现在,您可以声明一个MyLinkedList
并向其中添加节点,但是节点上没有内部访问器Jason是正确的。我查看了源代码,LinkedListNode
有内部支持字段
一种方法是使用嵌套类。我不知道这是否是一种“更好”的方式,但它确实避免了内部设置器/字段。我省略了一些实现,因此您可以看到结构的概要:
public class Node<T>
{
private List list;
private Node<T> prev, next;
public List List { get { return list; } }
// other accessors.
public abstract class List
{
Node<T> head;
internal List() { }
public AddFirst(Node<T> node)
{
// node adding logic.
node.list = this;
}
// implementation elided for brevity
}
}
public class MyLinkedList<T> : Node<T>.List { }
公共类节点
{
私人名单;
私有节点prev,next;
公共列表{get{return List;}}
//其他访问者。
公共抽象类列表
{
节点头;
内部列表(){}
公共AddFirst(节点)
{
//节点添加逻辑。
node.list=this;
}
//为简洁起见省略了实现
}
}
公共类MyLinkedList:Node.List{}
现在,您可以声明一个MyLinkedList
并向其中添加节点,但是Node
上没有内部访问器,一些实现使Node类成为链接列表的内部类;这是解决问题的另一种方法。嗯,这会增加其他问题。我不认为这是一种更好的方式。通常,链表中的节点是用户根本不需要知道的实现细节,这通常是此类实现的设计方式。我个人认为这样更好。节点没有任何理由是公共的。@Servy:哦,你的意思是作为private
内部类。是的,这一点我完全同意,我一直很困惑,LinkedListNote
是public
。我的答案是在LinkedListNode
公开的情况下,因为问题是关于LinkedListNode
的属性是如何使用的机制