Это избыточный код? - PullRequest
       4

Это избыточный код?

5 голосов
/ 25 ноября 2010

Я обновляю систему и прохожу другой код разработчика (ASP.NET в C #).

Я сталкивался с этим:

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 ]

3 голосов
/ 25 ноября 2010

Исходный код запрещает устанавливать любые подклассы ReferralSearchFilterResults или получать их из свойства. Это потому, что value.GetType() вернет фактический Type объекта, на который ссылается value. Если этот Тип является подклассом ReferralSearchFilterResults, то он не будет равен typeof(ReferralSearchFilterResults).

Я не уверен в вашем контексте, поэтому не могу сказать вам, правильное ли это поведение или нет. Если это предполагаемое поведение, оно пахнет немного грязно, так как он будет молча игнорировать любые назначения подклассов. Но я не могу судить без большего контекста.

3 голосов
/ 25 ноября 2010

Для части get вы можете использовать

return Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] as ReferralSearchFilterResults;

. Возвращает значение, если оно может быть приведено к ReferralSearchFilterResults, в противном случае null.

3 голосов
/ 25 ноября 2010

Я думаю, что вы правы - установщик не должен компилироваться, если ему предоставляется что-то такое, что не может быть неявно приведено к ReferralSearchFilterResults.

1 голос
/ 25 ноября 2010

Переменные сессии имеют тип объекта, так что вы можете хранить в них что угодно.Но в этом случае сам установщик не позволяет программисту назначить объект другого типа, кроме ReferralSearchFilterResults и производных объектов.Таким образом, проверка, как вы указали, сама по себе не нужна.Кроме того, он не позволяет программисту назначать объект, производный от ReferralSearchFilterResults.

Но я бы использовал Session.Remove вместо того, чтобы просто установить для переменной значение NULL, поскольку переменная сеанса все еще существует в контексте http, если толькоустановить на ноль.

Итак:

set
{
      if (value == null)
            Session.Remove(SESSION_REFERRAL_SEARCHFILTERRESULTS);
      else
            Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value;
}
1 голос
/ 25 ноября 2010

Джейми, ты прав. В этом случае проверка типа в установщике не требуется, поскольку 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;
    }

}
0 голосов
/ 25 ноября 2010

Я могу понять проверку типа в бите get, но, как вы говорите, в установщике вы не можете передать ничего, кроме ReferralSearchFilterResults, так как код не будет выполнен во время компиляции.

(может быть какая-то старая привычка, у другого разработчика)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...