在公共属性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的编码方式不需要赋值,因为后续调用会忽略前面方法设置的值。但是,您可以缓存结果,如下所示:
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变量是无用的,如果您将来需要它,您可以随时添加它。