在公共属性getter中使用私有变量

本文关键字:变量 属性 getter | 更新日期: 2023-09-27 18:13:04

如果我有一个只有getter的公共属性,使用私有变量来分配值然后返回该值是否正确,或者我应该使用return而不是设置userID的值?在未来,我们计划添加更多使用userID字段的功能,并且将在该类中添加使用userID字段的方法。这两种方式有什么好处吗?有其他的方法可以做到吗?

    private string userID;
    public string ID
    {
        get
        {
            if (System.Web.HttpContext.Current.Request.Headers.AllKeys.Contains("UID"))
            {
                userID = System.Web.HttpContext.Current.Request.Headers["UID"].ToString();
            }
            else
            {
                userID = "0000";
            }
            return userID;
        }
    }

在公共属性getter中使用私有变量

现在getter的编码方式不需要赋值,因为后续调用会忽略前面方法设置的值。但是,您可以缓存结果,如下所示:

private string userID;
public string ID {
    get {
        if (userID == null) {
            if (System.Web.HttpContext.Current.Request.Headers.AllKeys.Contains("UID")) {
                userID = System.Web.HttpContext.Current.Request.Headers["UID"].ToString();
            } else {
                userID = "0000";
            }
        }
        return userID;
    }
}

这个实现通过在私有实例变量中缓存初始检索结果来避免重复读取"UID"

可以这样做,但在这种情况下,我个人会选择使用函数。

原因很简单:当调用function时,期望在其中可能发生一些计算。

相反,当一个人调用property时,这不是他期望发生的事情。当您调用一个属性时,您认为您调用了一些内部field包装器。

重复,你所做的可能做到的,但从架构的角度来看,这不是很好。

所以,我的建议,对于这种情况:使用function

使用return

您在get

中设置了userID

public string ID
    {
        get
        {
            if (System.Web.HttpContext.Current.Request.Headers.AllKeys.Contains("UID"))
            {
                 return System.Web.HttpContext.Current.Request.Headers["UID"].ToString();
            }
            else
            {
                return "0000";
            }
        }
    }

在本例中,您没有持久化任何数据,因此拥有userID的后备字段是没有意义的。

因为您使用的是公共属性,所以您可以随时更改实现。没有userID变量是无用的,如果您将来需要它,您可以随时添加它。