2012-05-03 3 views
5

私の(シニア)同僚の一人が、彼のコードで本当に奇妙なことをしています。nullの代わりに型をチェックするのは妥当な選択ですか?

nullの変数をチェックする代わりに、変数をチェックします。

nullがFooType

実際にfalseを返しているのでそして、これは動作します。

public class Foo 
{ 
    private string _bar = null; 

    public string Bar 
    { 
     get 
     { 
      // strange way to check for null 
      return (_bar is string) ? _bar : ""; 
     } 
     set { _bar = value; } 
    } 
} 

これは悪いコーディングであり、Resharperは私に同意しているようだと思います。このように小切手を書く理由はありますか?

変数をチェックする有効な方法ですか?あるいは、これは悪いスタイルと見なされることもあれば、特別な場合には有害である可能性もありますか?

これは実際には意味をなさないと確信していない限り、私は彼と対峙したくありません。

+1

空の文字列を返す場合は、シニア同僚は何時でもVBの背景を持っていますか? – Seph

+0

そうだと思います。または少なくともvbscript。これはVBでよく使われる式ですか? – magnattic

+0

古いバージョンのVBは、便利な省略表現の演算子にはほとんど欠けていたので、上記は簡略版でした。 – Seph

答えて

10

これは良い方法ではありません。より良い方法は次のようなものです:

return _bar ?? string.Empty; 

nullを探している同僚のコードを読んだときは明確ですか?いいえ、それは良い選択ではありません。おそらく、 "is"演算子はまずnullをチェックしてからfalseを返します。それで、あなた自身でそれを行うのははるかにクリーンになります。またはヌル合体演算子を使用してください

+0

"彼がnullを探している同僚のコードを読んだときは明らかですか?"いいえ、しかし、彼が明確にチェックしている変数が文字列であるときに、他に何を確認することができますか? – magnattic

+2

@atticaeそれはそれを有効に利用していますか? –

+0

申し訳ありませんが、わかりません。彼がチェックする変数(上記の "_bar")は常にタイプ文字列であるため、彼はnullをチェックすることしかできないと仮定しました。 – magnattic

3

私はこのコードは完全に混乱していると思うし、それを使用しません。 _barstringと宣言されているので、この型チェックはコードを理解できないように人々に頼んでいるだけです。

3

これはちょっと奇妙です。理由だけで書かないで:

return _bar ?? "" ; 

を、私はこのような何かをする必要があるとき、私はこれらの詳細を扱うには少しクラスを持っている:

public class DefaultableValue<T> 
{ 
    private T m_Value = default(T); 
    public T Value 
    { 
     get 
     { 
      if (IsInvalidPredicate(m_Value)) 
      { 
       m_Value = IfDefaultValueFunc(); 
      } 
      return m_Value; 
     } 
    } 
    private Predicate<T> IsInvalidPredicate { get; set; } 
    private Func<T> IfDefaultValueFunc { get; set; } 
    public static implicit operator T(DefaultableValue<T> property) 
    { 
     return property.Value; 
    } 
    public DefaultableValue(Predicate<T> isInvalidPredicate,Func<T> ifDefaultFunc) 
     : this(default(T), isInvalidPredicate, ifDefaultFunc) 
    { 
    } 
    public DefaultableValue(T initValue, Predicate<T> isInvalidPredicate, Func<T> ifDefaultFunc) 
    { 
     this.m_Value = initValue; 
     this.IsInvalidPredicate = isInvalidPredicate; 
     this.IfDefaultValueFunc = ifDefaultFunc; 
    } 
} 

その後、私のクラスは

class Test 
{ 
    DefaultableValue<string> AString { get; set; } 

    public Test(string initialValue) 
    { 
     this.AString = new DefaultableValue<string>(initialValue, 
      (value) => string.IsNullOrWhiteSpace(value), 
      () => string.Empty); 
    } 
} 

.... 
var test = new Test(null); 
var someString = test.AString; // = "" not null 
+0

「??」という言葉を聞いたことのない人があまりにも多いです。 –

0

のように見えます上記のパブリックプロパティがstringの代わりにobjectを返すと宣言されている場合、上記は意味をなさないでしょう。しかし、文字列を返すので、そのタイプのチェックは意味をなさない。

public class Foo 
{ 
    private string _bar = null; 

    public string Bar 
    { 
     get 
     { 
      return (String.IsNullOrWhitespace(_bar)) ? "": _bar; 
     } 
     set { _bar = value; } 
    } 
} 
関連する問題