Ответ 1
У вас есть класс (DispatcherTimer
), который имеет поле типа TimeSpan
, а TimeSpan
- это структура.
Так как это структура - она "встроена" в экземпляр DispatcherTimer
. Таким образом, экземпляр DispatcherTimer
выглядит в памяти следующим образом:
<various metadata>...<contents of timespan>...
Если бы это был класс (ссылочный тип), он выглядел бы так:
<various metadata>...<reference to timespan>...
Когда вы это сделаете
dt.Interval = new TimeSpan( 0, 0, 0, 0, 50);
В этом случае экземпляр TimeSpan
выделяется (в стеке) и копируется в область памяти экземпляра DispatcherTimer
выделенную для Interval
, перезаписывая то, что было до этого.
Таким образом, мы
<various metadata>...<contents of timespan 1>
и теперь у нас есть
<various metadata>...<contents of timespan 2>
Это означает, что старый интервал времени просто перезаписан, он не будет собираться сборщиком мусора, потому что нет ничего, что можно было бы собрать (вопреки тому, что принято в ответах).
По этой причине выполнение этого в замкнутом цикле также не является проблемой (хотя, конечно, нет причин). Рассмотрим этот код:
class ClassWithRefField {
public TestClass Field;
}
class ClassWithStructField {
public TestStruct Field;
}
class TestClass {
public TestClass(int payload) {
Payload = payload;
}
public int Payload;
}
struct TestStruct {
public TestStruct(int payload)
{
Payload = payload;
}
public int Payload;
}
Тогда, если вы это сделаете:
static void Main(string[] args) {
var f = new ClassWithRefField();
while (true) {
f.Field = new TestClass(1);
}
}
И наблюдайте память процесса даже в проводнике процессов в окнах - вы увидите, что память постоянно растет и падает. Эти экземпляры TestClass
создаются в куче и собираются сборщиком мусора.
Однако, если вы это сделаете:
static void Main(string[] args) {
var f = new ClassWithStructField();
while (true) {
f.Field = new TestStruct(1);
}
}
Память в проводнике процесса останется неизменной, потому что тот же регион памяти постоянно перезаписывается, поэтому собирать нечего. Этот цикл может работать вечно.
И да - это нормально делать так, как вы делаете.