在getter中过滤我的财产

时间:2015-03-03 21:19:36

标签: c# .net get set filtering

这是我的代码:

private Analyst _PrimaryAnalyst;
public Analyst PrimaryAnalyst
{             
    get       
    {
        Analyst activeAnalysts;

        if (this.PrimaryAnalyst.IsActive == true)
        { 
            activeAnalysts = _PrimaryAnalyst;
        }

        return activeAnalysts; //"Use of unassigned local variable"               
    }         
    set
    {              
        SetPropertyValue("PrimaryAnalyst", ref _PrimaryAnalyst, value);                          
    }
}

基本上我试图根据它们是否标记为Active来过滤我的Analyst属性。然后我想只返回活动分析师。 (基于Analyst的bool属性),我在return语句中收到错误,说“使用未分配的局部变量”

但是我明确地在if语句中分配了它?

3 个答案:

答案 0 :(得分:2)

将getter的第一行更改为:

Analyst activeAnalysts = null;

问题在于,如果if语句的计算结果为false,则永远不会设置该值,因此编译器不知道它应该返回什么。

答案 1 :(得分:2)

您收到错误的原因是并非所有代码路径都会导致分配。您应该在if之前初始化变量,或者包含else并将其分配到那里。

此外,您应该检查if语句中的私有变量而不是公共变量(以避免StackOverflowException),并假设Analyst是可空类,在检查IsActive之前,您还应确保它不为空。属性getter不应该抛出异常。

您的getter也可以使用三元分配进行简化:

get
{
    return (_PrimaryAnalyst != null && _PrimaryAnalyst.IsActive) 
        ? _PrimaryAnalyst 
        : null;
} 

答案 2 :(得分:2)

在C#中,在为其赋值之前,不能使用局部变量。

C#语言规范,第1.6.6.2节

  

C#需要在其之前明确分配局部变量   价值可以获得

让我们来看看你的代码

如果this.PrimaryAnalyst.IsActive为假,会发生什么?是的,使用未分配的局部变量

你可以通过初始化局部变量来解决这个问题。

Analyst activeAnalysts = null;

if (this.PrimaryAnalyst.IsActive == true)
{ 
    activeAnalysts = _PrimaryAnalyst;
}
else
{
     activeAnalysts = null;
}

但这里还有另一个问题。你的代码导致StackOverflowException,因为你在自己内部调用一个方法(递归)但是​​没有办法从而导致StackOverflow异常 您应该将行this.PrimaryAnalyst.IsActive == true更改为_PrimaryAnalyst.IsActive == true