4

このような状況を考えると:

using (var foo = CreateFoo()) {
    if (foo != null) {
        // do stuff
    }
}

ネストされた if は避けたいと思います。残念ながら、以下を使用すると break が機能しないため、明らかな解決策は不可能です。

using (var foo = CreateFoo()) {
    if (foo == null) {
        break;
    }
    // do stuff
}

によって引き起こされる追加のインデントを回避するパターンはありif != nullますか?

4

8 に答える 8

6

返されるクラスを十分に制御できる場合は、 Nullオブジェクトを実装して、実際のNULL値の代わりにこれを返すCreateFoo()ことができます。

于 2011-09-22T13:06:59.683 に答える
3

ラムダを取るヘルパー メソッドを導入します。したがって、コードは次のようになります。

UsingIfNotNull(CreateFoo(), foo => {
  //do stuff
});

必要なインデントがあります。UsingIfNotNull の定義は次のとおりです。

public static void UsingIfNotNull<T>(T item, Action<T> action) where T : class, IDisposable {
  if(item!=null) {
    using(item) {
      action(item);
    }
  }
}
于 2011-09-22T13:58:35.973 に答える
3

私は明確に名前が付けられた小さなメソッドを好みます。

public void DoWhatEver()
{
   using (var foo = CreateFoo())
   {
     if (foo == null) return;

     //DoWhatEver
   }
}
于 2011-09-22T13:01:12.990 に答える
0

個人的には、あなたが投稿したコードをそのままにしておくと思います。

ただし、あなたが尋ねたので(そして、このしばしば悪意のある言語機能への反対票にさらされるリスクを冒して)、いつでも「goto」を使用できます。

using (var foo = CreateFoo()) {
    if (foo == null) {
        goto SkipUsingBlock;
    }
    // do stuff
}

SkipUsingBlock:
// the rest of the code...
于 2011-09-22T13:06:02.533 に答える
0

C# コンパイラは、次の using(var foo = CreateFoo()) ステートメントを扱います。

try
{
var foo = CreateFoo();
}
finally
{
  ((IDisposable) foo).Dispose();
}

メソッド CreateFoo が使い捨てオブジェクトを返さない場合は、using をまったく使用しないでください。それ以外の場合は、次のように記述できます。

try
{
var foo = CreateFoo();
//do stuff like foo.SomeMethod (if foo == null exception will be thrown and stuff will not be done)
}
finally
{
  ((IDisposable) foo).Dispose();
}
于 2011-09-22T13:18:25.853 に答える
0

これは醜いハックですが、追加の識別を回避します。

do using (var foo = CreateFoo()) {
    if (foo == null) {
        break;
    }
    // do stuff
} while (false);

(いいえ、これを行うことはお勧めしません。これは、それが可能であることを示す概念実証にすぎません。)

可能であれば、代わりにコードをリファクタリングすることをお勧めします。

 using (var foo = CreateFoo()) {
    if (foo != null) {
        doSomethingWith(foo);  // only one line highly indented
    }
}
于 2011-09-22T13:01:08.040 に答える
0

そのような一般的な意味では、using をブロックでラップしtry...catch、オブジェクトが null の場合は例外をスローすると思いますが、それは個人的な好みです。

于 2011-09-22T12:59:05.160 に答える