5

我的一位(高级)同事在他的代码中做了一些非常奇怪的事情。

他不是检查变量是否为空,而是检查类型。而且因为

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;

当您阅读您同事的代码时,您是否清楚他正在寻找空值?不,那不是一个好的选择。可能“is”运算符首先要做的就是检查 null 然后返回 false。因此,自己做会变得更干净。或者只使用空合并运算符

于 2012-05-03T17:36:35.157 回答
3

我认为这段代码完全令人困惑,永远不会使用它。 _bar被声明为 astring所以这种类型检查只是在乞求人们不要理解代码。

于 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

如果上述公共财产被声明为 returnobject而不是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 回答