2012-07-25 32 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

相关问题