2009-04-30 4 views
1

私はユーザーコントロールのコレクションを返すf(x)を持っています。 .Netでは、私はf(x)の名前をコレクションとして扱うことができます。そうすることに何か問題がありますか?後に続いてが.netにあり、関数がオブジェクトを返す場合は、関数_as_をオブジェクトとして使うのは間違っていますか?

EX)

Private Function GetCcB() As Collection(Of Reports_ucColumn) 
    Dim cc As New Collection(Of Reports_ucColumn) 
    cc.Add(Me.ucColumn0) 
    cc.Add(Me.ucColumn1) 
    cc.Add(Me.ucColumn2) 
    Return cc 
End Function 

、すべてこのように、コレクション内のオブジェクトのプロパティを使用します。

For i As Integer = 0 To csB.Count - 1 
     If csB(i).Contains("Invalid") Or csB(i).Contains("Duplicate") Then 
      GetCcB.Item(i).isValid = False 
      GetCcB.Item(i).title = csB(i) 
      If csB(i).Contains("Invalid") Then : GetCcB.Item(i).errCode = "005W" 
      Else : GetCcB.Item(i).errCode = "005W" 'todo - chg this once we get a duplicate col err code 
      End If 
     Else 
      GetCcB.Item(i).isValid = True 
      GetCcB.Item(i).title = csB(i) 
      GetCcB.Item(i).errCode = String.Empty 
     End If 

答えて

1

コレクションを使用するたびにメソッドを呼び出すことにより、どのようなコードが効果的にやっていることは次のとおりです。

For i As Integer = 0 To csB.Count - 1 
    Dim cc As Collection(Of Reports_ucColumn) 
    If csB(i).Contains("Invalid") Or csB(i).Contains("Duplicate") Then 
     cc = New Collection(Of Reports_ucColumn) 
     cc.Add(Me.ucColumn0) 
     cc.Add(Me.ucColumn1) 
     cc.Add(Me.ucColumn2) 
     cc.Item(i).isValid = False 
     cc = New Collection(Of Reports_ucColumn) 
     cc.Add(Me.ucColumn0) 
     cc.Add(Me.ucColumn1) 
     cc.Add(Me.ucColumn2) 
     cc.Item(i).title = csB(i) 
     If csB(i).Contains("Invalid") Then 
     cc = New Collection(Of Reports_ucColumn) 
     cc.Add(Me.ucColumn0) 
     cc.Add(Me.ucColumn1) 
     cc.Add(Me.ucColumn2) 
     cc.Item(i).errCode = "005W" 
     Else 
     cc = New Collection(Of Reports_ucColumn) 
     cc.Add(Me.ucColumn0) 
     cc.Add(Me.ucColumn1) 
     cc.Add(Me.ucColumn2) 
     cc.Item(i).errCode = "005W" 'todo - chg this once we get a duplicate col err code 
     End If 
    Else 
     cc = New Collection(Of Reports_ucColumn) 
     cc.Add(Me.ucColumn0) 
     cc.Add(Me.ucColumn1) 
     cc.Add(Me.ucColumn2) 
     cc.Item(i).isValid = True 
     cc = New Collection(Of Reports_ucColumn) 
     cc.Add(Me.ucColumn0) 
     cc.Add(Me.ucColumn1) 
     cc.Add(Me.ucColumn2) 
     cc.Item(i).title = csB(i) 
     cc = New Collection(Of Reports_ucColumn) 
     cc.Add(Me.ucColumn0) 
     cc.Add(Me.ucColumn1) 
     cc.Add(Me.ucColumn2) 
     cc.Item(i).errCode = String.Empty 
    End If 
Next 

ますでしょうあなたは、そのようなコードを書くことはありませんでしょうか?

この機能を遅延初期化のプロパティに変更することができます。コレクションは、一度だけ作成されるよう、それは、何度も繰り返し、それを使用しても大丈夫です。

Private _cc As Collection(Of Reports_ucColumn) 

Private Property CcB As Collection(Of Reports_ucColumn) 
    Get 
     If _cc Is Nothing Then 
     _cc = New Collection(Of Reports_ucColumn) 
     _cc.Add(Me.ucColumn0) 
     _cc.Add(Me.ucColumn1) 
     _cc.Add(Me.ucColumn2) 
     End If 
     Return _cc 
    End Get 
End Property 

(理想的にはプロパティは、クラスと_cc変数で、パブリックでなければなりませんprivateである必要があり、唯一のように、クラスの中にカプセル化プロパティはそれにアクセスすることができます)。

意味的にはこれもうまくいきます。関数は一般的には少し作業を行います。結果を何度も使用したい場合は、関数を何度も呼び出すべきではありません。一方、プロパティは通常、多くの作業をしません。結果に何らかの処理を作成する必要がある場合、プロパティは通常、作業が必要以上に実行されていないことを確認するために、遅延初期化や事前初期化のような処理を行います。

+0

クール。入力とアドバイスをありがとうございました。 – aape

1

さて、あなたはメモリにするたびに新しいコレクションを作成しておきますGetCcBを呼び出すので、代わりに変数を使用することをお勧めします。 =)

編集:本質的にGetCcBが返すオブジェクト(コレクション)は、呼び出すたびに(コンテンツには関係なく)異なるものであり、ガベージコレクタによって収集される必要があるヒープ上の追加メモリを占有しますそれは合格する。変数としてコレクションを取得し、それを使用するほうがよいでしょう。

+0

ありがとうございました。私はそれが良い選択になるにはあまりにもきちんとしたとprogammy見えたと思った。 – aape

+0

かなりコードが間違いなく常に最高のパフォーマンスを発揮するとは限りません。 =) –

1

代わりにsingletonを使用します。これはクラスのプライベートフィールドを返すプロパティを持つ静的クラスです。

+0

非常にきれいです。私が学ぶべき新しいグループを開設してくれてありがとう。 – aape

関連する問題