菊池 Blog

移転しました 続・菊池 和彦の足跡

AILight Banner
AILight Blog

プロフィール

菊池 Blog

目次

Blog 利用状況

記事分類

過去の記事

タグ

なんでラムダの仮パラメータ省略できないんだろう

ちょっと思いつきで C#3.0 周りをつついてみた。

 public static class ContractChecker
 {
  public static void CheckContract<Target>( this Target t,Func<Target,bool> func )
  {
   if(!func(t))
   {
    throw new ContractViolationException();
   }
  }
 }

 public class ContractViolationException : ApplicationException
 {
 }

 public class MyStack<T>
 {
  T[] buffer;
  int _MaxCount;
  int count;
  
  public MyStack( int MaxCount )
  {
   _MaxCount = MaxCount;
   buffer = new T[MaxCount];
   count = 0;
   
   this.CheckContract( s => _MaxCount>0 );
  }
  
  public void Push(T value)
  {
   this.CheckContract( s => count<_MaxCount );
   buffer[count] = value;
   count++;
  }
  
  public T Pop()
  {
   this.CheckContract( s => count!=0 );
   count--;
   return buffer[count];
  }
 }

どの方向へ向かっているかはコードを見たらすぐわかるでしょう。

契約指向プログラミングの可能性の模索です。

CheckContractは拡張メソッドになっているので、どのクラスからでも呼べます。

んで、CheckContractで契約が満たされているか確認し、ダメなら投げるって事ですね。

Linq PreviewはMay 2006を使っているのですが、これって不具合なのか、書き方が悪いのか…

んで、ちょっと試した感じでは、属性にExpressionTreeはC#3.0でも書けないみたいで

ContractAttribute :Attribute で ContractAttribute( Expression< Func<bool> > ) を定義しても

[Contract( 0<=count && count<=_MaxCount )]
class MyStack<T>
{
    [ Contract( maxCount >0 ) ]
    public MyStack( int maxCount )
    {
    }
}

みたいなコードはかけそうにないですね。(属性では定数式かtypeof、または配列しか書けませんエラー)、

Expression Treeを定数式に認めてくれるとうれしいんだけどね。

ちょっと残念

投稿日時 : 2006年9月17日 20:48


コメントを追加

タイトル
名前
URL
コメント