这是多余的代码吗?

时间:2010-11-25 14:13:59

标签: c# asp.net properties

我正在升级系统并正在浏览另一个开发人员代码(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;
}

6 个答案:

答案 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)

杰米,你是对的。在这种情况下,不需要对Setter进行类型检查,因为value 必须是ReferralSearchFilterResults。

您可能考虑的另一个更改是使用isas关键字代替比较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的东西,因为代码在编译时会失败。

(可能是一些旧习惯,其他开发者有)