10

nullオブジェクトを返さないメソッドがあります。APIのユーザーが次のようなコードを書く必要がないように、明確にしておきたいと思います。

if(Getxyz() != null)
{
  // do stuff
}

この意図をどのように示すことができますか?

4

9 に答える 9

10

残念ながら、C#に組み込まれる方法はありません

この事実を文書化することはできますが、これは自動的にチェックされません。

resharperを使用している場合は、メソッドが[NotNull]属性でマークされているときに、これを適切にチェックするように設定できます。

それ以外の場合は、[Microsoft Contracts] [1]ライブラリを使用して、次のようなものをメソッドに追加できますが、これは、このような単純なアノテーションの場合、非常に多くの余分な表現になります。

Contract.Ensures(Contract.Result<string>() != null)

Spec#は、!を許可することでこの問題を解決しました。タイプの後に、null以外のタイプとしてマークします。例:

string! foo

ただし、Spec#は.NET2をターゲットにするためにのみ使用でき、コードコントラクトライブラリによって使用されています。[1]:http ://research.microsoft.com/en-us/projects/contracts/

于 2009-01-27T18:25:09.827 に答える
6

System.ValueTypeに基づく型を使用していない限り、運が悪いと思います。関数のXML/メタデータコメントでこれを明確に文書化するのがおそらく最善です。

于 2009-01-27T18:21:15.623 に答える
2

APIからこれを行うためのベストプラクティスがあるかどうかはわかりません。これは、防御的にプログラムし、コンシューマーとしてnullをチェックするためです。私は他のコードが常に正しいことをすることを信頼したくない傾向があるので、これはこの場合でもベストプラクティスだと思います。

于 2009-01-27T18:25:44.023 に答える
2

C# オブジェクトが null を返さないことを保証する唯一の型チェック方法は、構造体を使用することです。構造体には null 値を含むメンバーを含めることができますが、それ自体を null にすることはできません。

他のすべての C# オブジェクトは null にすることができます。

コード例:

public struct StructExample
{
    public string Val;
}

public class MyClass
{
    private StructExamle example;

    public MyClass()
    {
        example = null; // will give you a 'Cannot convert to null error
    }

    public StructExample GetXyz()
    {
        return null; // also gives the same error
    }
}

上記の例はコンパイルされません。構造体の使用が許容される場合 (値型になり、スタック上で渡され、サブクラス化できない)、これはうまくいく可能性があります。

于 2009-01-27T19:02:56.570 に答える
1

私はそれを逆に考えるのが好きです。関数がnull値を返す可能性がある場合は、関数のユーザーがそれを知っていることを確認する方がよいでしょう。

于 2009-01-27T18:49:52.867 に答える
0

ユーザーが次のような契約APIによる標準設計を使用するソースコードを持っている場合:http://www.codeproject.com/KB/cs/designbycontract.aspxは物事を明確にすることができます。

それ以外の場合、最善の策はドキュメントを使用することです。

于 2009-01-27T18:22:38.273 に答える
0

うまく文書化するか(おそらく.NET標準の文書化システムを使用して)、ContractAPIを使用する必要があります。ここにいくつかあります:http: //geekswithblogs.net/Podwysocki/archive/2008/01/22/118770.aspx http://www.codeproject.com/KB/cs/designbycontract.aspx

于 2009-01-27T18:25:06.707 に答える
0

Debug.Assert()メソッドを含めることができます。これは確かに条件を強制するものではありませんが、null値が受け入れられないことを(ドキュメントとともに)明確にする必要があります。

于 2009-01-27T18:25:35.630 に答える
0

それを文書化し、ソースコードを提供します。

于 2009-01-27T18:33:07.533 に答える