2012-07-25 65 views
0

例如,這兩種方法需要更新count變量:是否存在強制執行操作的C#屬性?

 public void AddFront(T data) { 
      Node<T> newNode = new Node<T>(data, null, null); 
      if (count == 0) { 
       head = tail = newNode; 
      } 
      else { 
       newNode.Next = head; 
       head.Previous = newNode; 
       head = newNode; 
      } 
      // don't forget 
      count++; 
     } 

     public void AddBack(T data) { 
      Node<T> newNode = new Node<T>(data, null, null); 
      if (count == 0) { 
       head = tail = newNode; 
      } 
      else { 
       newNode.Previous = tail; 
       tail.Next = newNode; 
       tail = newNode; 
      } 
      // don't forget 
      count++; 
     } 

不知是有可以強制operation這樣發生的屬性?,否則會觸發一個編譯時間錯誤消息。

+0

你要找的代碼契約: http://research.microsoft.com/en-us/projects/contracts/ – 2012-07-25 22:14:09

+0

在這裏,你會想'Contract.Ensures (Contract.ValueAtReturn(out count)== Contract.OldValue(count)+1);' – 2012-07-25 22:15:36

+0

有趣!感謝您的信息,現在就看看。 – Chan 2012-07-25 22:16:24

回答

2

屬性,無。 (儘管我會閱讀@Michael建議的代碼合同)

但是,您可以重構代碼。有很多共同點。也許創建一個單一的方法,接受作爲附加參數是否添加到頭部或尾部。喜歡的東西(未經測試):

private void Add(T data, bool front) { 
     Node<T> newNode = new Node<T>(data, null, null); 
     if (count == 0) { 
      head = tail = newNode; 
     } 
     else if (front) { 
      newNode.Next = head; 
      head.Previous = newNode; 
      head = newNode; 
     else { 
      newNode.Previous = tail; 
      tail.Next = newNode; 
      tail = newNode; 
     } 
     // don't forget 
     count++; 
    } 

    public void AddFront(T data) { 
     Add(data, true); 
    } 

    public void AddBack(T data) { 
     Add(data, false); 
    } 
+0

我同意這是要走的路,但'添加'應該是私人的,'AddFront'和'AddBack'都是公共的,並且調用到'Add'中。 – 2012-07-25 22:20:28

+0

同意。這使得公共合同更好。 – 2012-07-25 22:32:21