2010-11-25 11 views
5

システムをアップグレードしていて、別の開発者コード(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オブジェクト以外に設定すると、コードはコンパイルされません。私は何かが欠けまたはAMだけ使用することによって、私は右これを達成することができると思うしています:

set 
{ 
    Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
} 
+0

:)なぜ私は、プロパティ値がセッション変数に格納されているのかと心配しています。私がここに何かを紛失していない限り。 –

+0

これは悪い練習IMOです。誰もあなたが自分に尋ねたことをしてはならないと決めるsmartassプロパティが好きで、それについても通知しません。 – Groo

答えて

3

元のコードは、設定またはプロパティにまたはから取得されることからReferralSearchFilterResultsのいずれかのサブクラスを防ぐことができます。 value.GetType()は、valueで参照されるオブジェクトの実際のTypeを返します。そのTypeがReferralSearchFilterResultsのサブクラスである場合、それはtypeof(ReferralSearchFilterResults)と等しくありません。

私はここにあなたの文脈がわからないので、正しい動作であるかどうかはわかりません。それが意図された振る舞いであれば、サブクラスの割り当てを黙って無視するので少し汚れてしまいます。しかし、私は本当にそれ以上の文脈で判断することはできません。

+0

私はサブクラスが親クラスの型のプロパティに設定できることを知りませんでした。私はそれがもう一方の方法であると思っていました。とにかく、私はこの答えから何かを学んだので、答えとして受け入れました。 – Jamie

+0

プロパティは、継承と多相を処理する方法において特別なものではありません。ローカル変数やフィールドと同様に、その基底型の参照にサブクラスを割り当てることができます。 –

3

は、私はあなたが正しいと思う - 暗黙的にキャストできないの何かを提供する場合はセッターがコンパイルべきではありませんReferralSearchFilterResults

0

私はgetビットの型チェックを理解できますが、あなたが言うように、setterでは、コンパイル時にコードが失敗するため、ReferralSearchFilterResults以外のものを渡すことはできません。

あなたは

return Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] as ReferralSearchFilterResults; 

これは、それがReferralSearchFilterResultsにキャストできるかどうかの値を返し、そうでない場合はnull使用することができ、get部分について

+0

実際、その人は弱い型の言語をたくさん使っていたようです。 –

3

(いくつかの古い習慣、他の開発者が持っていたのだろう)。

1

Jamieあなたは正しいですか?この場合、セッターのタイプチェックは不要です。valueである必要があります。ReferralSearchFilterResultsです。

Typeのオブジェクトを比較する代わりに、isasというキーワードを使用することも考えられます。

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

Rikが指摘したように、ゲッターのように使うことができます。 –

+0

@Nathan Taylor:私は例外部分を理解していません。 'FilterResults fr = null as FilterResults'と書くことができ、例外をスローしません。そのため、最初に 'as'キーワードを使用しています。この例外はどこでスローされますか? – Groo

+0

@Nathan:「初期化されていない」オブジェクトとは何ですか?そして、どんな例外がスローされるのでしょうか? – Groo

1

セッション変数はオブジェクト型であるため、その中には何も格納できません。しかし、この場合、セッター自体は、プログラマがReferralSearchFilterResultsおよび派生オブジェクト以外のオブジェクトタイプを割り当てるのを防止します。 あなたが指摘したように、そのチェック自体は不必要です。さらに、プログラマがReferralSearchFilterResultsから派生したオブジェクトを割り当てることはできません。

しかし変数をnullに設定するのではなくSession.Removeを使用します。これは、nullに設定されている場合にのみセッション変数がHTTPコンテキストに存在するためです。だから、

set 
{ 
     if (value == null) 
      Session.Remove(SESSION_REFERRAL_SEARCHFILTERRESULTS); 
     else 
      Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
}