В C ++ я использовал такие конструкции, как
#include "stdafx.h"#include "TestStaticPointer.h"
MyClass* MyClass::myStaticPointer;
int main()
{
ProgrammStart();
return 0;
}
void ProgrammStart()
{
MyClass::myStaticPointer = new MyClass();
}
void SomeProgrammPlace()
{
*MyClass::myStaticPointer = MyClass();
}
Так что я выделил память только один раз в ProgrammStart (), а затем использовал ту же область памяти для повторной инициализации моего статического указателя (без перераспределения по ‘new’), я просто использовал конструкцию «= MyClass ();».
Как я могу сделать это в C #? Берет ли IL всю работу по распределению средств? Всегда ли «новый» означает «новую» ячейку памяти (а не то же место в памяти) в терминах C ++?
Прежде всего, вы ничего не инициализировали заново. То, что вы сделали здесь, назначение. Вы создали новый MyClass
объект и изменил состояние существующего MyClass
Объект должен быть таким же, как новый, вызывая его оператор присваивания.
То же самое произойдет, когда вы назначите struct
в C #:
class Program
{
static void Main(string[] args)
{
MyStruct mc = new MyStruct(10);
// Will print 10
Console.WriteLine(mc.i);
unsafe
{
MyStruct* pmc = &mc;
// Will print the address of mc
Console.WriteLine((IntPtr)pmc);
}
// Assign to mc
mc = new MyStruct(20);
// Will print 20; mc was modified
Console.WriteLine(mc.i);
unsafe
{
MyStruct* p = &mc;
// Will print the same address as above.
// mc was modified in place
// because structs have value semantics
Console.WriteLine((IntPtr)p);
}
}
}
struct MyStruct
{
public MyStruct(int i)
{
this.i = i;
}
public int i;
}
Причина, по которой вы можете делать то, что вы делаете в C ++, заключается в том, что разработчик должен управлять памятью (освободить ее, когда ваша работа закончена) в C ++.
Но в управляемых средах, таких как Dot Net, CLR (общеязыковая среда выполнения) позаботится об управлении памятью (когда и какую память нужно освободить, и это очень хорошо.) Для вас.
Ближайшим ответом на ваш вопрос будет создание слабых ссылок на объекты. так что вы можете вызывать эти ссылки всякий раз, когда это потребуется в будущем. имейте в виду, что объект, имеющий слабые ссылки, не будет собираться сборщиком мусора в обычной ситуации. Слабые ссылки используются в тех случаях, когда для создания конкретного объекта идет тяжелый процесс подъема, в таких ситуациях, чтобы избежать создания объекта с нуля, вокруг этого объекта будут создаваться слабые ссылки. перед тем, как вспомнить ваш WR, вам также необходимо проверить, существует ли объект, а не собран ли GC (в некоторых угловых ситуациях, например при нехватке памяти).
Слабые ссылки следует использовать очень осторожно, иначе они вызовут дополнительные издержки вместо решения вашей проблемы. Лучшее предложение в мире Dot Net — не заниматься управлением памятью самостоятельно и позволить GC справиться с этим. Тем не менее, есть несколько лучших практик, которым нужно следовать, чтобы облегчить жизнь GC.
Если вы хотите узнать больше об управлении памятью в Dot Net, вы можете обратиться Под капотом .NET управления памятью
Сборщик мусора. У управления средой есть то, что называется сборщиком мусора, который позаботится об управлении памятью, выделении, освобождении памяти в наилучшее возможное время.