Главный вопрос заключается в том, какие последствия позволяют изменять это ключевое слово в отношении полезности и памяти; и почему это разрешено в спецификациях языка C#?Назначить это ключевое слово в C#
На другие вопросы/субчасти может быть дан ответ или нет, если вы решите это сделать. Я думал, что ответы на них помогут прояснить ответ на главный вопрос.
я наткнулся на это как ответ на What's the strangest corner case you've seen in C# or .NET?
public struct Teaser
{
public void Foo()
{
this = new Teaser();
}
}
Я пытался обернуть вокруг головы, почему спецификации # языка C бы даже допустить. Подраздел 1. есть ли что-нибудь, что могло бы оправдать наличие ? можно изменить? Это все полезно?
Один из комментариев к этому ответу был
От CLR через C#: Причина они сделали это потому, что вы можете вызвать без параметров конструктору структуры в другой конструктор. Если вы хотите только инициализировать одно значение struct и хотите, чтобы другие значения были равны нулю/null (по умолчанию), вы можете написать public Foo (int bar) {this = new Foo(); specialVar = bar;}. Это не эффективный и не совсем обоснованный (специальныйVar назначается дважды), но просто FYI. (Вот почему в книге, я не знаю, почему мы не должны просто сделать общественный Foo (INT-бар): это())
Sub-часть 2. Я не конечно, я следую этим рассуждениям. Может кто-то уточнить, что он имел в виду? Может быть, конкретный пример того, как он будет использоваться?
EDIT (Не считайте стек или кучу основной точки в отношении выделения памяти или сбора мусора. Вместо 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 на этот вопрос, даже если у меня есть победитель, выбранный в моем сознании, поскольку, как я думаю, для ответа на этот вопрос потребуется разумная работа.
4 вопроса в 1 не подходят для переполнения стека. Один вопрос * должен быть одним вопросом. * –
@ AnthonyPegram. В этом случае я считаю его приемлемым, так как эти вопросы являются подзапросами по отношению к основному вопросу, как работают структуры. – Polity
Мои извинения не уверены, как переписать все это в одном. Главный вопрос, который, я полагаю, можно суммировать, каковы побочные эффекты, позволяющие изменить это ключевое слово? Вопросы 3-4 являются побочными эффектами, которые, как я думал, могут быть возможны. Если кто-то имеет право редактировать вопрос, кроме меня, и думает, что они могут попросить его лучше, пожалуйста, не стесняйтесь делать это. Или оставить комментарий, предлагающий лучший вопрос, и я начну с нуля. –