Основной вопрос заключается в том, какие последствия позволяют изменять это ключевое слово в отношении полезности и памяти; и почему это разрешено в спецификациях языка С#?
На другие вопросы/подстроки можно ответить или нет, если вы решите это сделать. Я думал, что ответы на них помогут прояснить ответ на главный вопрос.
Я столкнулся с этим как ответ на Какой самый странный угловой случай, который вы видели на С# или .NET?
public struct Teaser
{
public void Foo()
{
this = new Teaser();
}
}
Я пытался оборачивать голову, почему спецификации языка С# даже позволяют это. Подчасти 1. есть ли что-нибудь, что оправдывало бы модификацию этого? Все это полезно?
Один из комментариев к этому ответу был
От CLR через С#: причина, по которой они это сделали, состоит в том, что вы может вызвать конструктор без параметров в другой конструктор. Если вы хотите инициализировать только одно значение структуры и хотите, чтобы другие значения были равны нулю /null (по умолчанию), вы можете писать общедоступные Foo (int bar) {this = new Foo(); specialVar = bar;}. Это не эффективный и не оправданный (specialVar назначается дважды), но просто FYI. (Что причина, данная в книге, я не знаю, почему мы не должен просто публиковать Foo (int bar): this())
Подчасти 2. Я не уверен, что следую этим рассуждениям. Может кто-то уточнить, что он имел в виду? Может быть, конкретный пример того, как он будет использоваться?
РЕДАКТИРОВАТЬ (игнорировать стек или кучу основной точки в отношении выделения памяти или сбора мусора. Вместо int [] вы можете заменить это на 262144 общедоступных int-полях) Также из моего понимания структуры создаются в стеке, а не в куче, если эта структура должна иметь 1 бит байтового массива, инициализированное таким образом
public int[] Mb = new int[262144];
Подчасти 3. удаляет ли это из стека при вызове Foo? Мне кажется, что структура никогда не выходила из сферы действия, она не будет удалена из стека. У меня нет времени сегодня, чтобы создать тестовый пример, но, возможно, я буду для этого завтра.
В приведенном ниже коде
Teaser t1 = new Teaser();
Teaser tPlaceHolder = t1;
t1.Foo();
Под-часть 4. Являются ли t1 и tPlaceHolder занимающими одно и то же или другое адресное пространство?
Извините, что поднял 3-летний пост, но у этого действительно была голова.
Первый вопрос FYI о stackoverflow, поэтому, если у меня что-то не так с вопросом, добровольно опубликуйте комментарий, и я отредактирую.
Через 2 дня я поставлю щедрость 50 по этому вопросу, даже если у меня есть победитель, выбранный в моем сознании уже, поскольку я думаю, что ответ потребует разумной работы для объяснения вопросов.