簡體   English   中英

日期時間是否在 C# 中通過引用傳遞? 如果不是,為什么我的 object 在我更改變量時會更新?

[英]Are DateTimes passed by reference in C#? If not, why is my object updating as I change a variable?

我遇到了一個我根本無法理解的問題。 當我調試程序時,我可以看到程序運行良好——這是奇怪的部分。

我面臨的問題是,當我使用新的 object 將 append 加入列表時 - 它似乎完全改變了。 讓我通過顯示我的代碼來更好地解釋。

        System.DateTime timeNow = System.DateTime.Now;

        List<Train> trainsOnNet = new List<Train>();

        for(int i = 1; i <= 3; i++)
        {
            Train t = new Train();

            t.NewCarrige(true, "A"[0]);
            t.NewCarrige(false, "B"[0]);

            t.addStation(App.Stations.FirstOrDefault(x => x.GetShortCode().Equals("MTG")));
            t.addStation(App.Stations.FirstOrDefault(x => x.GetShortCode().Equals("BNS")));
            t.addStation(App.Stations.FirstOrDefault(x => x.GetShortCode().Equals("BSH")));

            int minsToAdd = 5;

            t.GetStations().ForEach(x =>
            {
                timeNow = timeNow.AddMinutes(minsToAdd);
                x.SetArrivalTime(timeNow);
                minsToAdd += 10;
            });

            timeNow = timeNow.AddMinutes(15);

            trainsOnNet.Add(t);

        }

當我將t添加到trainsOnNet列表時,時間似乎更改為循環生成的最后一次,甚至在它生成之前。

如果我在這條線上放置一個停止器,我可以看到t實例具有正確的時間變量(即,從當前執行時間開始 5 分鍾,然后每個時間間隔 10 分鍾)。 但是,當我按下繼續並檢查trainsOnNet列表時。 這個時間已經改成下一班火車的時間了。

在我看來timeNow是通過引用傳遞的,並且隨着循環增加時間,存儲的時間會更新,直到我剩下 3 列火車都在同一時間。

例如,如果我在 1951 年使用trainsOnNet.Add(t)上的停止器執行程序,我可以看到t包含 3 個站,其中第一個站到達時間是 19:56,第二個是 20:11 和 20: 26. 完美的。 然后我點擊繼續並檢查新添加的 object 到我的列表中。 經檢查, t實例到達時間屬性現在已更改為:

20:56、21:11、21:36

對我的代碼進行數學運算,下一班火車應該在上一班火車到達終點站后 20 分鍾到達。 這讓我到了 20:46。 因此認為更令人困惑的是為什么第一列火車在第二列火車的預期時間之后被改變,更不用說在沒有說明的情況下更新了。

任何想法都會得到極大的應用。

在第一次執行時停止在線: 在此處輸入圖像描述

停止在同一行,按繼續后(更改屬性): 在此處輸入圖像描述

如您所見,值正在更改? 在這種情況下,整整一個小時?

System.DateTime是一種“值類型”。 您可以通過在 Visual Studio 中查看您的智能感知或在文檔中查看它被聲明為struct ,而不是class (后者是引用類型)來檢查這一點。

但是,您的問題與此無關。

目前尚不清楚您到底打算做什么,並且該缺陷可能出在您的邏輯實現中。

1 - 您對所有迭代重復使用相同的變量timeNow ,很難(至少對我而言)跟蹤它應該是多少以及經過幾次“心理”迭代后的值是多少。

2 - 您將minsToAdd設置為 5,然后在循環中將其增加 10。 因此,在內部循環的幾次迭代之后, minsToAdd得到這些值:15、25、35、45 等......

然后,將其添加到timeNow ,因此想象timeNow開始時是 00:00,在內部循環中它獲取值

00:05,
00:05 + 15min = 00:20
00:20 + 25min = 00:55
00:55 + 35min = 01:30
etc... 

在內部循環之后,您將 15 分鍾添加到最后一個值。

這是你所期望的嗎?

嘗試更改這兩行:

timeNow = timeNow.AddMinutes(minsToAdd);
x.SetArrivalTime(timeNow);

只是:

x.SetArrivalTime(timeNow.AddMinutes(minsToAdd));

正如其他人所解釋的那樣,您將在每次迭代時覆蓋timeNow變量。 此更改應為您提供預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM