none
关于泛型示例的问题? RRS feed

  • 问题

  • 微软泛型介绍(C# 编程指南)中http://msdn.microsoft.com/zh-cn/library/0x6a29h6.aspx的演示示例中

    private Node next;
            public Node Next
            {
                get { return next; }
                set { next = value; }
            }
    是什么意思,为啥在自己类里面将自己类的类型定义字段,并封装成属性?


    万物皆变,规则永恒。
    2011年4月18日 8:43

答案

  • 这是数据结构“线性表”的“链表”实现方式。

    在这种实现下,“线性表”本身并不保存所有的表成员,而只是保存表头结点header。表头结构点会“指引”下一个结点,下一个结点又再指引下下个结点……,这就是所谓的“链”表。

    所以你这里的Node不但包括结点自身的值,还包括下一个结点的引用即Next,它不是指向自己的,而是指向下一个Node的

    • 已建议为答案 廖斌 2011年4月19日 5:29
    • 已标记为答案 wavetekgroup 2011年4月19日 12:51
    2011年4月19日 5:26
  • 首先要了解静态与实例的区别:

    1. 静态字段为类所有,可被该类的所有实例共享
    2. 而实例变量只为该实例自身所有

    对于链表中的节点,每个节点都必需指引它的下一个节点在哪,这十分显然每个节点的后续节点都不相同,因此必为实例变量。 

    2011年4月19日 15:24

全部回复

  • 公有属性是在任何外部类都可访问到的,如果有人不怀好意就会随意的修改的public字段,很危险的,但是如果改成private,就不能擅自修改,只能通过属性,而在属性里是可以加代码来判断别人付的值是否符合你的要求,不符合的可以直接拒绝赋值,这样就增加了安全性


    Ellis_Wong
    2011年4月18日 9:25
  • 根据设计准则,所有的私有字段是不能被公开访问的,因此需要借助属性来访问和设置私有字段。这就是面向对象中的最简单的封装,这种特性称之为封装性。
    Mark Zhou
    2011年4月18日 10:12
  • 你们没弄明白我的意思,我不是问字段的封装和属性!请看链接示例http://msdn.microsoft.com/zh-cn/library/0x6a29h6.aspx
    我问的是下面Node类里面怎么又拿Node类本身作类型设置字段next,并且封装成属性Next,这是什么意思,这不回造成访问死循环吗?
    // type parameter T in angle brackets
    public class GenericList<T>
    {
        // The nested class is also generic on T.
        private class Node
        {
            // T used in non-generic constructor.
            public Node(T t)
            {
                next = null;
                data = t;
            }

            private Node next;
            public Node Next
            {
                get { return next; }
                set { next = value; }
            }

            // T as private member data type.
            private T data;

            // T as return type of property.
            public T Data 
            {
                get { return data; }
                set { data = value; }
            }
        }

        private Node head;

        // constructor
        public GenericList()
        {
            head = null;
        }

        // T as method parameter type:
        public void AddHead(T t)
        {
            Node n = new Node(t);
            n.Next = head;
            head = n;
        }

        public IEnumerator<T> GetEnumerator()
        {
            Node current = head;

            while (current != null)
            {
                yield return current.Data;
                current = current.Next;
            }
        }
    }


    万物皆变,规则永恒。
    2011年4月18日 12:05
  • 你好!

    首先上面的代码不存在死循环,属性 Next 是为实现迭代器 GetEnumerator 服务的,即示例 foreach 代码块中下一个遍历的对象


    知识改变命运,奋斗成就人生!
    2011年4月18日 13:50
    版主
  • 你好,谢谢

    但偶还是没明白,有没有这方面的详细资料?


    万物皆变,规则永恒。


    2011年4月19日 1:27
  • 你把完整的代码复制下来,打上断点一步一步的跟踪有助于你对这个程序的设计与运行过程的理解。
    知识改变命运,奋斗成就人生!
    2011年4月19日 2:22
    版主
  • 这是数据结构“线性表”的“链表”实现方式。

    在这种实现下,“线性表”本身并不保存所有的表成员,而只是保存表头结点header。表头结构点会“指引”下一个结点,下一个结点又再指引下下个结点……,这就是所谓的“链”表。

    所以你这里的Node不但包括结点自身的值,还包括下一个结点的引用即Next,它不是指向自己的,而是指向下一个Node的

    • 已建议为答案 廖斌 2011年4月19日 5:29
    • 已标记为答案 wavetekgroup 2011年4月19日 12:51
    2011年4月19日 5:26
  • 为啥不用一个静态字段或方法呢?
    万物皆变,规则永恒。
    2011年4月19日 7:57
  • 首先要了解静态与实例的区别:

    1. 静态字段为类所有,可被该类的所有实例共享
    2. 而实例变量只为该实例自身所有

    对于链表中的节点,每个节点都必需指引它的下一个节点在哪,这十分显然每个节点的后续节点都不相同,因此必为实例变量。 

    2011年4月19日 15:24