Если все встроенные типы неизменны в C #, не означает ли это, что после присвоения им нового значения их расположение в памяти должно измениться? - PullRequest
0 голосов
/ 15 февраля 2019

Я борюсь с пониманием концепции изменчивых и неизменяемых типов в C # Я думал, что их нельзя изменить «на месте», только эта новая переменная (с тем же именем?) Создается и ей присваивается отредактированное значение.Разве это не означает, что у него должно быть другое место в памяти?Я экспериментировал с ним в VS2015, но, похоже, нет ...

unsafe
{
    int a = 7;
    int* test = &a;

    Console.WriteLine(a);                
    Console.WriteLine((int)test);
    a+=5;
    test = &a;
    Console.WriteLine(a);
    Console.WriteLine((int)test);
    Console.ReadKey();
}

Он выводит:

7
107604264
12
107604264

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Объект является неизменным, если его состояние не изменяется после создания объекта.

Это примерно состояние , и это точка,Изменчивость / неизменяемость IMO связана не с типом, а с экземпляром, поэтому экземпляр является изменяемым или неизменным.Как правило, если вы указываете, что тип является неизменяемым, это означает, что все экземпляры этого типа являются неизменяемыми.Путаница может возникнуть из-за типов reference против value, но в целом оба могут быть изменяемыми или неизменяемыми, даже если настоятельно рекомендуется сохранять неизменными типы value.


public class Immutable
{
    public int X {get; private set;}

    public Immutable(int x)
    {
        X = x;
    }
}

public class Mutable
{
    public int X {get; set;}

    public Mutable(int x)
    {
        X = x;
    }
}

никтофактически мешает вам изменить ссылку на объект неизменяемого класса, он все еще неизменен, потому что вы на самом деле не можете изменить состояние .

//the state can be changed Mutable
Mutable m = new Mutable(1);
m.X = 2; 

//the state cannot be changed
Immutable obj1 = new Immutable(1);
Immutable obj2 = new Immutable(2);
obj1 = obj2;

0 голосов
/ 15 февраля 2019

Я думаю, что проблема в том, что вы путаете переменные со значениями.Переменная - это просто имя места, в котором может храниться значение (для типов значений) или ссылка на значение (для ссылочных типов).Для целей нашего обсуждения здесь не имеет значения, как / где хранится эта переменная, поскольку мы говорим об неизменности значений .

Когда вы присваиваете значение '7'целочисленной переменной, то значение' 7 'всегда будет' 7 '.В вашем коде вы ничего не можете сделать, чтобы он когда-либо отличался от '7'.Что бы это значило, если бы оно было изменчивым?Это было бы похоже на изменение «7» на «12», а затем на любую другую переменную в вашей программе, которая ранее содержала «7», теперь вместо «12».

Это немного понятнее, если вывместо этого посмотрите на неизменяемый ссылочный тип, например «string».Если я установлю a = "Test", b = a, a = "Test2", значение b все равно будет "Тест".Обычно невозможно изменить содержимое строки (не нарушая инвариантов, выполняя такие вещи, как тайный доступ к частной памяти), поэтому мы называем строковые значения неизменяемыми.Вы можете полагаться на тот факт, что после сохранения ссылки на строку в переменной значение строки, на которое она ссылается, никогда не изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...