2009-07-17 21 views

答えて

1

は何もありませんが、(例えば)LinFuに実装されますが、「契約による設計」のコンセプトで見ることができます。

+2

これはVisual Studio 2010 Beta 1のC#4.0でも実装されています。 –

+0

DBCは、引数がnullかどうかをチェックし、ArgumentNullException f.iをスローします。引数がnullの場合 –

+0

機能的には、実際にはありません。しかし構文的には、メソッドの外部インタフェースから適切な属性で修飾して意図を明確にします。 –

3

基本的にはできません。おそらくAOP(PostSharpなど)を使用して、属性やコンパイル時のチェックを可能にする4.0のコード契約を使って、あなたのためにその一部を行うことができます。 "nullable value-type"などと比較するための "nullable reference-type"はありません。少なくとも:フィールドはどのように初期化されますか?デフォルト(...)になるのは何ですか?

(実際にはヌルチェックをしていますが)何かを手伝ってもらうよう要請がありましたが、それは起こっていません。次のようなものがあります。

public void Foo (string! myRequiredString nullable) {...} 
1

コード契約:InfoQ: .NET 4 Feature Focus: Code Contractsを使用できます。

現在のところ、他のすべてのソリューションにはランタイムコードチェックが含まれています。 PostSharpのようなAOPフレームワークを使用してコードをメソッドに挿入できますが、すべてメソッドのコードになります。

+0

.NET 3.5/VS2008ワークでコード契約を使用しています。http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx –

1

エキスパートでありながら危険なもので、あなたの質問に本当に答えることはできません。

残念ながら、あなたが行うことができる最善のことは、ヌルを渡さないよう警告するIntellisenseのコメントをコードに追加することです。

/// <summary> 
    /// This Foo method does Bar to something. 
    /// </summary> 
    /// <param name="myRequiredString">required, do NOT pass nulls. I really really mean it!</param> 
    public void Foo(String myRequiredString) 
    { 
     if (myRequiredString == null) 
     { 
      throw new ArgumentNullException("myRequiredString", "It said required in the name of the argument, dummy!"); 
     } 
    } 

Visual Studioは、あなたが「フー(ヌル)」を入力させないようにと警告するために、人々は一般的なNonNullable構造体を実装しているが、一番下の行は、あなたが望むものであるそこにいくつかのhackish solutionsがありますされていますコンパイラのエラーを出すか、何かを渡すと、何かがnull可能ではないはずのメソッド呼び出しの99.99%の場合、== nullチェックをしてArgumentNullExceptionをスローする必要があります。実行時まで引数がnullであることを知らない。少なくとも、コンパイラがnullチェックを追加してそこにArgumentNullExceptionをスローする必要がある場合でも、C#で探しているものがあったとしても。

私はあなたが探しているものは、あなたの指をいくつかの動きを保存するための "構文的な砂糖"だと思います。今のところあなたが入力するのがうんざりなら、コードスニペットの作成をお勧めします。

+0

.NET 4.0のコードコントラクトライブラリは、.NET 3.5およびVS2008で公開されています。 http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx –

0

現在、このトピックはC#で作業しています。 .NETには値型のNullable <T>がありますが、逆の機能は参照型には存在しません。

リファレンスタイプのためにNotNullable <T>を作成し、その問題をデータ型ドメインに移しました。しかし、これにより、アプリケーションはコンパイル時ではなく実行時に例外をスローさせますが、それでも私にとっては非常に便利です。

関連する問題