2011-10-27 12 views
0

マイクロソフトはジェネリックスを学習するためのバブルソートの例としてこれを示しています。私は76行目と77行目になるまで意味があります。これらの宣言はどのようにして可能ですか? Nodeはクラスです。新しいインスタンスでインスタンス化する必要はありませんか? ソートをどのように最適化しますか?一部は一般的なもので、非一般的なものはどれですか?ジェネリックスノード宣言

1 public class GenericList<T> : System.Collections.Generic.IEnumerable<T> 
2  { 
3   protected Node head; 
4   protected Node current = null; 
5 
6   // Nested class is also generic on T 
7   protected class Node 
8   { 
9    public Node next; 
10    private T data; //T as private member datatype 
11 
12    public Node(T t) //T used in non-generic constructor 
13    { 
14     next = null; 
15     data = t; 
16    } 
17 
18    public Node Next 
19    { 
20     get { return next; } 
21     set { next = value; } 
22    } 
23 
24    public T Data //T as return type of property 
25    { 
26     get { return data; } 
27     set { data = value; } 
28    } 
29   } 
30 
31   public GenericList() //constructor 
32   { 
33    head = null; 
34   } 
35 
36   public void AddHead(T t) //T as method parameter type 
37   { 
38    Node n = new Node(t); 
39    n.Next = head; 
40    head = n; 
41   } 
42 
43   // Implementation of the iterator 
44   public System.Collections.Generic.IEnumerator<T> GetEnumerator() 
45   { 
46    Node current = head; 
47    while (current != null) 
48    { 
49     yield return current.Data; 
50     current = current.Next; 
51     
52    } 
53   } 
54 
55   System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
56   { 
57    return GetEnumerator(); 
58   } 
59  } 
60 
61  public class SortedList<T> : GenericList<T> where T : System.IComparable<T> 
62  { 
63   // A simple, unoptimized sort algorithm that 
64   // orders list elements from lowest to highest: 
65 
66   public void BubbleSort() 
67   { 
68    if (null == head || null == head.Next) 
69    { 
70     return; 
71    } 
72    bool swapped; 
73 
74    do 
75    { 
76     Node previous = null; 
77     Node current = head; 
78 
79     
80     //Console.WriteLine(previous.GetType()); 
81     //Console.ReadLine(); 
82 
83     swapped = false; 
84     
85     
86     //Debug.WriteLine(p); 
87     //Debug.WriteLine("Testing " + current.ToString()); 
88 
89     while (current.next != null) 
90     { 
91      // Because we need to call this method, the SortedList 
92      // class is constrained on IEnumerable<T> 
93      if (current.Data.CompareTo(current.next.Data) > 0) 
94      { 
95       Node tmp = current.next; 
96       current.next = current.next.next; 
97       tmp.next = current; 
98 
99       if (previous == null) 
100       { 
101        head = tmp; 
102       } 
103       else 
104       { 
105        previous.next = tmp; 
106       } 
107       previous = tmp; 
108       swapped = true; 
109      } 
110      else 
111      { 
112       previous = current; 
113       current = current.next; 
114      } 
115     } 
116    } while (swapped); 
117   } 
118  } 

答えて

0

あなたは、それぞれnullheadpreviousnextを割り当てています。これは他のどのようなものと同じように割り当て操作です。実際にオブジェクトの新しいインスタンスを作成していない限り、newを使用する必要はありません。

一般的な部分は、Tを参照するものです。これはクラスがインスタンス化されるときに提供されるジェネリック型です。良い例はList<T>で、タイプTのオブジェクトのリストを作成します。あなたは、インスタンス等の文字列のリストはList<string>、intのリストについてList<int>

2

ようにC#でclass型が宣言と互換性のあるタイプのものであるnullまたは値で初期化することができ、この可能性。ライン76と77は、ここではそう

Node previous = null; 
Node current = head; 

nullが合法である値のように見えます。本質的に「私は価値がない」と言います。 headへの割り当ては、headNodeであるため、合法です。結果は、2つの参照番号headcurrentは、同じNodeオブジェクト値を参照しています。参照の1つを使用してNodeインスタンスを変更すると、他の参照が表示されます。

0

これらは、クラスインスタンスを指すことができ、または単にnullすることができ参照です。

あなたは他の文献への参照を割り当てることができます。

Foo f1 = new Foo(); 
Foo f2 = f1; 
Foo f3 = null; 
0

ませオブジェクトは、そのコードの行76と77でインスタンス化されていません。あなたが言ったように、Nodeはクラスです。参照型の変数の値は、オブジェクト(または何も)に参照ある

  1. :.NETのクラスは常にことを意味するタイプを参照しています。
  2. 参照型の変数には値nullを割り当てることができます。つまり、変数は何も参照しません。
  3. 参照型の1つの変数を参照型の別の変数に割り当てると、オブジェクトではなく参照がコピーされます。