【问题标题】:Filtering my property in a getter在吸气剂中过滤我的财产
【发布时间】:2015-05-04 17:04:22
【问题描述】:

这是我的代码:

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);                          
    }
}

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

但是我在 if 语句中清楚地分配了它?

【问题讨论】:

  • 并非所有代码路径都会导致分配。您应该在if 之前初始化变量,或者包含else 并将其分配给那里的其他东西。

标签: c# .net get set filtering


【解决方案1】:

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

C# 语言规范,第 1.6.6.2 节

C# 要求一个局部变量在它之前被明确赋值 可以得到值

让我们来看看你的代码

如果this.PrimaryAnalyst.IsActive 为假怎么办?是的,使用未分配的局部变量

您可以通过初始化局部变量来解决此问题。

Analyst activeAnalysts = null;

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

但是这里还有另一个问题。您的代码导致StackOverflowException,因为您在其内部调用了一个方法(递归),但没有办法摆脱它,所以它导致StackOverflowException 您应该将行 this.PrimaryAnalyst.IsActive == true 更改为 _PrimaryAnalyst.IsActive == true

【讨论】:

    【解决方案2】:

    将getter的第一行改为:

    Analyst activeAnalysts = null;
    

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

    【讨论】:

    • 你的 if 子句也会导致无限递归,因为它会一遍又一遍地调用 getter。
    【解决方案3】:

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

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

    您的 getter 也可以使用三元赋值来简化:

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

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 1970-01-01
      • 2013-01-20
      • 2018-11-16
      • 2012-09-16
      • 2018-04-05
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      相关资源
      最近更新 更多