2016-11-28 4 views
2

Swiftプログラミング言語から来て、私はoptional valuesというパラダイムに慣れてきました。この言語機能には多くの面白い点がありますが、特にC#に同等の処理方法があるかどうかは疑問です。これはnil関数の戻り値です。例えば、与えられたキーの値を返す単純な検索関数を考えてみましょう。 Swiftでは、欠落しているキーを処理する慣用的な方法は、単にnilを返すことです。実際には、これはプログラマーが大部分のケースでエラーを投げたりエラー処理をしなくても済むようにし、非常に上手く機能します。同様に、Javascriptでは、ちょうどundefinedを返すかもしれません。C#の慣用的なオプションの戻り値

私がMSDNで読んだところでは、C#プログラマは通常このような場合に古典的な例外を優先し、try catchブロックで処理するようです。これは一般的なケースですか?たとえば、整数戻り値をNullableオブジェクトにラップし、関数呼び出し側がその値がnullかどうかをチェックすることは珍しいでしょうか?これらの状況に対する正統的なアプローチは何でしょうか?

答えて

3

例外は例外的なシナリオであり、通常のプログラムフローではありません。私たちは同じ側にいると思う。

可用性のためのあなたの方法の両方のチェックがリソースをフェッチするときにのみnullのような追加の戻り値「タイプ」必要があります。ファイルの内容を取得するために、例えばコードを取る:

if (File.Exists(...)) 
{ 
    return false; 
} 

string contents = File.ReadAllText(...); 
... 
return true; 

これには例外やnull戻り値を必要とせず、ファイルがファイルをチェックして開くの間に削除された場合は、考えることができています例外的なシナリオ。

しかし、データベースからエンティティを取得しようとするときは、可用性チェックとリソースの取得を組み合わせて、1つのクエリだけが必要になります。実際にはnullを返すプログラマーがたくさんいますが、C#の法律がないので、どのメソッドが何をしているのかを把握するのは難しいです。

私は個人的にbool TryGet(int id, out Entity entity)スタイルが好きです。これは、利用可能性チェックを行い、見つかった場合はリソースを取得することを明確に示しています。 nullを返すことを好んで、あなたの関数が何をしているかをもっと明示したい場合は、Entity GetOrDefault(int id)を命名規則として使用できます。いくつかのフレームワークメソッド(すなわち、Linq)はそのように名付けられます。

値型を返す場合は、Nullable<>を返すと、おそらくあなたのメソッドが何をしているかがわかります。サークルを完成させるために、C#7は(私が知る限り)non-nullable reference typesを追加します。

最終的には、どのような大会を好むかはあなた(そしてあなたのチーム)次第です。

+0

ありがとうございました。私は特にTryGetの提案に感謝します。それだけで物事が私にははっきりと分かります。 –

0

C#ではオプションの型はありませんが、F#ではC#で乱用できるオプションの型があります。 Using F# option types in C#

またはそれを行うにはC#の方法をC.Evenhuisポストを参照してください。

は、詳細な説明はこちらを参照してください。

関連する問題