2016-08-29 9 views
0

こんにちは私は、VBでByrefとByValを使って何かをしようとしています。メソッドを通してオブジェクトを渡しています。オブジェクトの値ですが、私は明確ではありません誰も私はこの2つの概念をはっきりと理解するのを助けることができますしてください。下は私がarr Listの値を変更しようとしているメソッドですが、列挙操作が実行されないことがあります.BevalとByrefのこのロジックを理解するのを助けてください。値渡し、参照渡し、汎用リストのオブジェクトの値の変更VB

Public Function arrayReturn() As List(Of Object) 
     Dim arr As List(Of Object) 
     arr = New List(Of Object) 
     For index As Integer = 1 To 5 
      arr.Add(index) 
      Debug.Write(index.ToString & " ") 
     Next 
     For Each i As Object In arr 
      arr.Add(intReturn(i)) 
     Next 
     Return arr 
    End Function 
    Public Function intReturn(ByRef i As Object) As Integer 
     i += i 
     Return i 
    End Function 
    Sub Main() 
     Dim obj As List(Of Object) 
     obj = New List(Of Object) 
     obj = arrayReturn() 
     For Each obj2 As Object In obj 
      Console.WriteLine(obj2) 
     Next 
    End Sub 

私の問題は、私はイベントオブジェクトをretriveしようとするとイベントのリストにそれを入れています、ここでこの方法を使用することですが、私はそうここ

Public Function GetIcalForAppointments(nxtMonth As Integer, prevMonth As Integer, strStaffAPIKey As String) As Ical.NET.Calendar 
     Dim objDTOIcallApt As DTOICallAppt 
     objDTOIcallApt = New DTOICallAppt 
     Dim lst As List(Of DOAppointment) 

     objDTOIcallApt = GetAllAppointmentsForIcal(nxtMonth, prevMonth, strStaffAPIKey) 
     lst = objDTOIcallApt.Appointments 
     Dim timeZoneName As String = objDTOIcallApt.UserTimezone 
     Dim calendar As Ical.NET.Calendar 
     calendar = New Ical.NET.Calendar() 
     Dim timeZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName) 
     calendar.AddTimeZone(New Ical.NET.VTimeZone(timeZoneName)) 
     Dim evt As Ical.NET.Event 
     For Each appt As DOAppointment In lst 
      GetIcalForAppointment(appt, objDTOIcallApt, calendar, evt) 
     Next 
     Return calendar 

    End Function 


Public Function GetIcalForAppointment(app As DOAppointment, objResponse As DTOICallAppt, calendar As Ical.NET.Calendar, ByRef evt As Ical.NET.Event) As Ical.NET.Event 

     evt = calendar.Create(Of Ical.NET.Event)() 
     evt.Start = getCalDateTime(app.StartDate, calendar) 
     evt.End = getCalDateTime(app.EndDate, calendar) 
     evt.Description = app.FullSubject 
     evt.Location = app.AppointmentInOrgName 
     evt.IsAllDay = False 
     evt.Created = getCalDateTime(app.CreatedDatetime, calendar) 
     If objResponse.UserEmail <> "" AndAlso objResponse.UserEmail.Contains("@") = True Then 
      evt.Organizer = New Organizer("MAILTO:" + objResponse.UserEmail) 
     End If 

     Select Case app.AppointmentStatus 
      Case "Cancelled" 
       evt.Status = Ical.NET.EventStatus.Cancelled 
       Exit Select 
      Case "NoShow" 
       evt.Status = Ical.NET.EventStatus.Cancelled 
       Exit Select 
      Case "Scheduled" 
       evt.Status = Ical.NET.EventStatus.Tentative 
       Exit Select 
      Case Else 

       evt.Status = Ical.NET.EventStatus.Confirmed 
       Exit Select 
     End Select 

     evt.Categories.Add("Work") 
     evt.Comments.Add(app.CreatedDetails) 
     evt.Resources.Add(app.Resource1Name) 
     evt.Resources.Add(app.Resource2Name) 
     Dim strSummary As String = app.FullSubject 
     If app.IsPatConsentRequired = True Then 
      If app.IsPatConsentGiven = True Then 
       strSummary = strSummary & Convert.ToString(" | Consent given") 
      Else 
       strSummary = strSummary & Convert.ToString(" | Consent Pending") 
      End If 
     End If 

     If app.PatMedicalHistoryCasesheetID <> "" Then 
      If app.IsMedicalHistoryFilled = True Then 
       strSummary = strSummary & Convert.ToString(" | Medical History filled") 
      Else 
       strSummary = strSummary & Convert.ToString(" | Medical History pending") 
      End If 
     End If 

     evt.Summary = strSummary 
     evt.Uid = app.ID 
     Dim alarm As New Ical.NET.Alarm 
     alarm.Action = Ical.NET.AlarmAction.Display 
     alarm.Summary = "Appointment with " + app.AppointmentWithFullName + " at " + app.AppointmentInOrgName 
     alarm.Trigger = New Trigger(TimeSpan.FromMinutes(-30)) 
     evt.Alarms.Add(alarm) 
     Return evt 

    End Function 

を右だかwheter私はなっておりません私は単一のイベントオブジェクトを取得し、毎回イベントリストにプッシュしようとしているのがわかります

+0

2番目のforループでは、既存のものを変更する代わりに新しい要素を追加します。 'arr(i)= intReturn(i)'は動作するはずです。 – Turamarth

+0

と、他の方法ではなくforeachループのためのオブジェクトの取得方法... @ turamarth – Tanmay

+2

唯一の問題が例外であれば、@Turamarthは正しいです。さらに助けが必要な場合は、答えを書き換えて特定の問題を述べるか、問題ごとに複数の質問を書く必要があります。 byrefとbyvalが何であるかを説明するマニュアルが必要な場合は、[こちら](https://msdn.microsoft.com/en-us/library/ee478101(v = vs.84).aspx)は –

答えて

1

まず、ByValとByRefがあなたの問題と関係するとは思わない。それらについての詳細を読むhere あなたの問題は、使用しているロジックに関連していると思います。 のは、何が起こっているかを見るためにあなたのarrayReturn機能を分解してみましょう:

Public Function arrayReturn() As List(Of Object) 
    Dim arr As List(Of Object) 
    arr = New List(Of Object) 

あなたが宣言され、オブジェクトのジェネリックリストをインスタンス化し、それは大丈夫です。ところで、このコードを1行で短縮するには、新しいリスト(Of Object)としてDim arrを使用します。

For index As Integer = 1 To 5 
     arr.Add(index) 
     Debug.Write(index.ToString & " ") 
    Next 

あなたがリストに5つのオブジェクトを追加する

、ここで間違って何もありません。

For Each i As Object In arr 

は、ここで重要なポイントです。このステートメントは実際にあなたとVBの間の契約ですが、ここで何を言っているのですか?の5つのオブジェクトのうち、どれもが何かをしています。つまり、この非常に特定の時点で、リスト内のオブジェクトの現在の合計のすべてのオブジェクトに対して、リスト内の5つのオブジェクトのそれぞれについて何かを行うか、より具体的にするようにVBに指示しています。内部で何VB

ここ5

 arr.Add(intReturn(i)) 

この場合には、リスト内のすべてのオブジェクトを反復処理するための環境を準備することであるあなたが契約を壊しているところです。リストに別のオブジェクトが追加されているため、5つのオブジェクトがなくなり、VBで5つのオブジェクトに対して6つではなく5つのオブジェクトが準備されたため、繰り返し処理を続行できません。

これは正しい動作です。リスト期間を反復しているときのオブジェクトの数。しかし、例の揺れに対して、あなたがそれを行うことができたとしましょう。その場合は、リスト内の各オブジェクトに対してアクションを実行するように、そしてアイテムを追加するたびにVBに言いますので、ループは完了しません。その項目が考慮されるならば、 "each"は無限になり、ループは無限になります。私はあなたが私はあなたのコードから理解していますが、あなたは持っているそれが本当ならば、あなたがこのケース5には、現在そこにあるものと、リスト内のオブジェクトの同じ量を追加したいということです

Next 
    Return arr 
End Function 

ポイントを得る願っています

Public Function arrayReturn() As List(Of Object) 
    Dim arr As New List(Of Object) 

    For index As Integer = 1 To 5 
     arr.Add(index) 
     Debug.Write(index.ToString & " ") 
    Next 

    Dim c as Integer = arr.Count 

    For i As Integer = 0 to c - 1 
     arr.Add(intReturn(arr(i))) 
    Next 

    Return arr 
End Function 

ただし、これは予定のアプリのスコープには不都合がありません。たとえば、他の予定内にサブ予定がある場合は、ツリーのような別の記憶域構造が必要で、再帰的にアクセス/操作できます。

これが役に立ちます。

+0

ありがとうそのコードはちょうど私がオブジェクトを渡して実際に何をしようとしているのかをリストに戻そうとしているダミーです。イベントを作成しようとする各apptオブジェクトの次のコードにあります。イベントリストを取得しますが、そのためにはオブジェクトを参照として渡す必要があります。そのため、イベントのリストの最初のオブジェクトは1つのイベントで、次に次に来る – Tanmay

関連する問題