Когда вы имеете дело со структурами, вы имеете дело со значениями.
В классе «это» является ссылкой на текущий экземпляр. Это позволяет вам мутировать экземпляр класса, задав свойства/поля в классе.
Однако, если вы находитесь в структуре, все действует по-другому. Когда вы находитесь в методе struct, «this» позволяет вам мутировать структуру. Однако, если вы используете это в методе, вы почти всегда имеете дело с копией «оригинальной» структуры.
Например:
struct Test
{
int i;
void Mutate() {
this.i += 1;
}
}
При использовании этого:
void MutateTest(Test instance)
{
instance.Mutate();
}
{
Test test = new Test();
test.i = 3;
Console.WriteLine(test.i); // Writes 3
test.Mutate(); // test.i is now 4
Console.WriteLine(test.i); // Writes 4
MutateTest(test); // MutateTest works on a copy.. "this" is only part of the copy itself
Console.WriteLine(test.i); // Writes 4 still
}
Теперь незнакомец часть - это справедливо, и что это цитата говорит:
struct Test
{
public Test(int value)
{
this.i = value;
}
int i;
void Mutate(int newValue) {
this = new Test(newValue); // This wouldn't work with classes
}
}
///
{
Test test = new Test();
test.i = 3;
Console.WriteLine(test.i); // Writes 3
test.Mutate(4);
Console.WriteLine(test.i); // Writes 4
Я чувствовал большое волнение в Силе, так как если миллионы голосов внезапно закричали в ужасе и призывали к состязательности. Пожалуйста, не показывайте это моим сотрудникам на C++. :-) –
Eh, const в C++ - это ложь. В C++ const часто означает «я обещаю не изменять эту вещь», а не «у меня есть гарантия, что эта вещь неизменна». –
Хороший пример Jon. Здесь вы демонстрируете, что хотя структура может быть неизменной, переменная *, которая содержит структуру, не является. Эта переменная может по-прежнему меняться; поэтому его называют переменной. Это просто ужасный способ сделать его разным. –