类方法:我应该在访问变量之前一直检查它们吗?

时间:2016-07-08 14:28:49

标签: c# class methods

抱歉这个愚蠢的问题。

我们说我有这个类(代码在C#中):

class Foo {
    public List<string> Bars { get; set; }        
    public Foo() { }
}

现在我想实现一个在 Bars 上执行某些操作的方法,例如 Foo.Translate()

我是否应始终检查我尝试访问/修改的内容是否为空或有效?

class Foo {
    public List<string> Bars { get; set; }        
    public Foo() { }

    public void Translate()
    {
        // Should I check with a null && count > 0?
        if (Bars != null && Bars.Count > 0)
        {
            [...]
        }
    }
}

6 个答案:

答案 0 :(得分:5)

取决于。

如果值为null并且它不应该出现,那么显然出现了问题,无论你做什么现在都是无效的情况,并且无论如何都会给你错误的结果。让它抛出异常。检查日志以找出它为空的原因,并修复该错误。

如果值为null的有效方案,那么做你正在做的事情是合适的。

答案 1 :(得分:0)

在构造函数中验证属性以及它们是否无效以抛出异常是一种很好的做法。 这样你就可以保证每次你访问这个属性都应该没问题。 使用私有setter设置属性也很好,只有构造函数或自定义方法才能更新类属性。

class Foo {
    public List<string> Bars { get; private set; }        
    public Foo(List<string> bars) 
    { 
        if (bars!= null && bars.Count > 0)
        {
         this.Bars = bars
        }
    }
}

答案 2 :(得分:0)

你永远不应该公开集合的setter(它将你的内部暴露给外部并且它违反了封装)。您应该在构造函数中初始化您的集合。那样你知道它永远不会为空。

有一个代码分析警告 - https://msdn.microsoft.com/en-us/library/ms182327.aspx

答案 3 :(得分:0)

这完全取决于您的期望。如果您希望Foo需要Bars集合,请让用户在构造函数中传递它并在那里验证它(并使其成为私有)。

如果您希望在Foo类中填充Bar,则应确保列表始终在构造函数中实例化(并使其成为私有)。这将避免空检查。

如果您希望它有一个计数&gt;在执行某些操作之前0,然后,如您所知,您应该验证计数&gt;在执行该操作之前为0。

答案 4 :(得分:0)

因为代码中有构造函数,所以可以在构造函数中检查值是否为null值。通常,如果预期值不为null,则可以使用:

  $query->orFilterWhere(['like', 'facility_name', $this->facility_name])
        ->orFilterWhere(['like', 'facility_country', $this->facility_country]);

我相信这更快,因为当对象Foo实例化时,会检查任何空值。

答案 5 :(得分:0)

如果在正常情况下不应该null,那么请不要检查。让应用程序抛出异常。否则,如果你检查它是null,你打算做什么?您可以用其他内容替换List<string> Bars,但该值是否正确?

但更好的方法是用铁拳控制你班级的状态。如果null不应为null,请不要为null。不允许对象将自身置于无效状态,并且不允许其他对象将其置于无效状态。如果它不能 null,那么您无需在任何地方进行检查。 class Foo { public List<string> Bars { get; } = new List<string>(); public Foo() { } } 检查到处都是瘟疫,并且表明我们不知道代码的状态是什么。

最简单的形式:

class Foo {
    private readonly List<string> _bars = new List<string>();
    public List<string> Bars { get { return _bars; } }
    public Foo() { }
}

您也可以

_bars

现在Foo在创建_bars时设置为新列表,编译器将阻止您更改_bars。您只能修改其内容。现在,只要您使用此课程,您就不必担心Bars(或者扩展名为null)是null

返回集合或其他对象的方法也是如此。如果没有任何回报,请不要返回select SiteName,status,conformed,total from [Output].SIT_W10_Application_Readiness_overview_siteview 。返回一个空数组或一个“空”对象,接收方法可以无害地工作。