5

私の(上級)同僚の1人が、彼のコードで本当に奇妙なことをしています。

変数の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は私に同意しているようです。このように小切手を書く理由はありますか?

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

これが実際に意味をなさないと確信しない限り、私は彼に立ち向かいたくありません。

4

4 に答える 4

10

これは良い方法ではありません。より良い方法は、次のことです。

return _bar ?? string.Empty;

同僚のコードを読んだときに、彼がnullを探していることは明らかですか?いいえ、それは良い選択ではありません。おそらく、「is」演算子が最初に行うことは、nullをチェックしてから、falseを返すことです。したがって、それを自分で行う方がはるかにクリーンになります。または、null合体演算子を使用します

于 2012-05-03T17:36:35.157 に答える
3

このコードは完全に紛らわしく、決して使用しないと思います。 _barはとして宣言されているstringので、このタイプチェックはコードを理解しないように人々に懇願しているだけです。

于 2012-05-03T17:36:41.710 に答える
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
于 2012-05-03T17:36:48.067 に答える
0

上記の公有財産がobjectの代わりに返還することが宣言された場合、上記stringは理にかなっている可能性があります。ただし、文字列を返すため、このタイプのチェックは意味がありません。空の文字列を返したい場合は、次のようにすることができます。

public class Foo 
{ 
    private string _bar = null; 

    public string Bar 
    { 
        get 
        {  
            return (String.IsNullOrWhitespace(_bar)) ? "": _bar; 
        } 
        set { _bar = value; } 
    } 
} 
于 2012-05-03T17:44:17.257 に答える