.Net - LinkedListNode <t>的属性如何分配给?</t>

时间:2014-09-21 09:27:36

标签: c# .net vb.net

根据.Net LinkedListNode<T>课程的文档和元数据,其ListNextPrevious属性均为get-only。但是,LinkedList<T>以某种方式设法改变这些属性。

LinkedList<T>如何实现这一目标?

是使用反射还是使用内部制定者作弊?

3 个答案:

答案 0 :(得分:2)

以下是the fields of LinkedListNode<T>

public sealed class LinkedListNode<T> {
    internal LinkedList<T> list;
    internal LinkedListNode<T> next;
    internal LinkedListNode<T> prev;
    internal T item;

    // ...
}

正如您所看到的,这些字段是内部字段,因此它们可以由LinkedList<T>(或System程序集中的任何其他类来操纵),但您可以'从你的代码做到这一点。

An example

private void InternalInsertNodeBefore(LinkedListNode<T> node, LinkedListNode<T> newNode) {
    newNode.next = node;
    newNode.prev = node.prev;
    node.prev.next = newNode;
    node.prev = newNode;            
    version++;
    count++;
}

答案 1 :(得分:1)

list中的字段prevnextLinkedListNode<T>标有内部访问修饰符。内部类型/成员只能访问同一程序集中的其他类型。在这种情况下,LinkedListNode<T>LinkedList<T>都位于系统程序集中。

如果我们看一下它们的实际定义:

public sealed class LinkedListNode<T>
{
  internal LinkedList<T> list;
  internal LinkedListNode<T> next;
  internal LinkedListNode<T> prev;
  internal T item;
  ....
}

答案 2 :(得分:-1)

即使是get-only属性为

,也可以随时更改同一类中的数据

参考下面的例子:

class Property
{
    private string _name = "_name";
    public string Name
    {
        get
        {
            return _name;
        }
    }

    public void Foo()
    {
        _name = "foo";
    }


    static void Main(string[] args)
    {
        Property prop = new Property();

        Console.WriteLine(prop.Name);  // prints _name

        prop.Foo();

        Console.WriteLine(prop.Name); // prints foo
    }
}