2017-04-25 83 views
-1

我以毫秒爲單位定期獲得新的時間值,並且需要像「00h 00m 00s」這樣的形式,所以考慮使用TimeSpan,因爲它非常易於使用。有沒有辦法改變TimeSpan對象的值?

TimeSpan t = TimeSpan.FromMilliseconds(timeValue);

但我現在擔心的是GC。我不認爲每次都致電FromMilliseconds()是個好主意,因爲它似乎總是創建一個新實例。 我需要每隔0.1秒更新一次時間值,所以如果有辦法直接修改TimeSpan對象的值,它對我的​​情況可能非常有用。否則,我認爲我需要自己創建一個方法。

這可能嗎?

+5

'TimeSpan'是不可變的,所以您每次都需要一個新的。 – DavidG

+2

'TimeSpan'是struct(值類型)。它將被放置在堆棧上。 –

+4

不,這是不可能的。你是否確信**(聲稱的)性能下降*真的很重要? –

回答

2

A TimeSpan是不可變的。

如果要更改其值,則必須創建一個新的TimeSpan實例。正如你可以從​​看到的,所有的屬性都是隻能得到的。

但是不要擔心GC!只有在實際遇到性能問題時才擔心。 TimeSpan佔據我認爲很少的空間。

+2

實際上,它包含了一個「長」的蜱蟲值。試圖修改(即替換)該值將使用相同的空間替換TimeSpan –

+0

感謝您的回答! – Jenix

2

...所以如果有辦法直接修改TimeSpan對象的值,它對我的​​情況可能非常有用。 ...

這可能嗎?

不,不可能修改TimeSpan的實例,它是不可變的struct

否則,我想我需要我自己創造的方法..

更可能你真的。您是否確定現有的TimeSpan對您的應用程序的性能影響真的很重要?您是否分析了應用程序以驗證創建TimeSpan的新實例是否導致性能問題。而且即使那就是的情況(不太可能)你肯定你的自己代碼會更好嗎? .NET框架旨在被廣泛使用;雖然不完美,但通常相當不錯。

+0

謝謝!順便說一下,我的意思是,創建一種方法直接創建一個結果字符串,而不是TimeSpan-ish的東西,所以它不是「編寫比.NET框架更好的方法」,而是更多地關於「爲我的具體情況創建一個方法」。正如你所提到的,TimeSpan將被廣泛使用,這意味着有時候感覺太多或太重。我的應用程序已經有太多的開銷,所以這就是爲什麼我擔心GC。一點一點的增量可能會導致我的遊戲中出現更多的幀丟失,而IT真的很重要。當然,如你所說,我需要比較它們。 – Jenix

+0

@Jenix你很可能用'TimeSpan'吠叫錯誤的樹;正如其他評論所說,它只是包裝一個「長」,所以它不是「重」。 –

+0

你永遠不會明白我在說什麼..我需要的僅僅是每0.1秒一個「MM:SS」字符串,而不是TimeSpan或任何類似的與Time相關的對象。在這種情況下,我可能一開始就這麼想,特別是當你堅持TimeSpan不會一直放在堆棧上的時候。我必須從TimeSpan中創建一個新字符串,這就是爲什麼我計劃從一開始就創建字符串的原因。爲什麼我應該在這種情況下創建一個long對象?這就是爲什麼我說它可能會感覺「沉重」。你也會知道很多字符串對象本身已經可以導致GC。 – Jenix

0

想像它改變int的價值。如果你這樣做

int x; 
x = 5; 
x++; 

你永遠不會改變int的價值。您正在更改x的值。

這可能聽起來像分裂毛髮,但它聽起來像你想要做的是改變一個變量的值,包含一個TimeSpan,而不是改變一個實際的TimeSpan

這可能會採取多種形式,但是,您可以做到這一點。它看起來非常類似於修改整型變量。

var t = new TimeSpan(1,0,0); // One day 
t += TimeSpan.FromMinutes(1); // Add one minute 
+0

問題是,FromMinutes()將返回一個新的實例,所以它最終的開銷大致相同。除此之外,我真的很感激+ =操作符。在某些情況下它可能會有用。謝謝! – Jenix

相關問題