我正在升级系统并正在浏览另一个开发人员代码(C#中的ASP.NET)。
我遇到了这个:
private ReferralSearchFilterResults ReferralsMatched
{
get
{
if (Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] == null || Session[SESSION_REFERRAL_SEARCHFILTERRESULTS].GetType() != typeof(ReferralSearchFilterResults))
return null;
else
return (ReferralSearchFilterResults)Session[SESSION_REFERRAL_SEARCHFILTERRESULTS];
}
set
{
if (value == null)
{
Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value;
}
else if (value.GetType() == typeof(ReferralSearchFilterResults))
{
Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value;
}
}
}
检查设置器上的类型是否不必要?当然,如果我将属性设置为ReferralSearchFilterResults
对象之外的其他东西,代码甚至不会编译?我是否遗漏了某些内容,或者我认为只需使用以下内容即可实现:
set
{
Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value;
}
答案 0 :(得分:3)
我认为你是对的 - 如果提供者不能隐式地转换为ReferralSearchFilterResults
,那么setter就不应该编译。
答案 1 :(得分:3)
对于get
部分,您可以使用
return Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] as ReferralSearchFilterResults;
如果值可以转换为ReferralSearchFilterResults
,则会返回该值,否则为null
。
答案 2 :(得分:3)
原始代码阻止设置或进出属性的任何子类的ReferralSearchFilterResults。这是因为value.GetType()
将返回Type
引用的对象的实际value
。如果该类型是ReferralSearchFilterResults的子类,那么它将不等于typeof(ReferralSearchFilterResults)
。
我不确定你的背景,所以我不能告诉你这是否是正确的行为。如果它是预期的行为,它确实闻起来有点脏,因为它会默默地忽略任何子类的赋值。但如果没有更多的背景,我无法判断。
答案 3 :(得分:1)
value
必须是ReferralSearchFilterResults。
您可能考虑的另一个更改是使用is
和as
关键字代替比较Type
个对象。
private ReferralSearchFilterResults ReferralsMatched
{
get
{
if (Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] == null || !(Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] is ReferralSearchFilterResults))
return null;
else
return Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] as ReferralSearchFilterResults;
}
set
{
Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value;
}
}
答案 4 :(得分:1)
会话变量属于object类型,因此您可以在其中存储任何内容。但在这种情况下,setter本身会阻止程序员分配除ReferralSearchFilterResults和派生对象之外的其他对象类型。 因此,正如您所指出的那样,检查本身是不必要的。另外,它不允许程序员分配一个派生自ReferralSearchFilterResults的对象。
但是我会使用Session.Remove而不是仅仅将变量设置为null,因为如果只设置为null,会话变量仍然存在于http上下文中。
所以:
set { if (value == null) Session.Remove(SESSION_REFERRAL_SEARCHFILTERRESULTS); else Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; }
答案 5 :(得分:0)
我可以理解get位中的类型检查,但正如你所说,在setter中,你不能传递任何不是ReferralSearchFilterResults的东西,因为代码在编译时会失败。
(可能是一些旧习惯,其他开发者有)