Почему ссылочные типы в C# ведут себя по-разному?

Обучаюсь языку C#. В процессе его "ковыряния" возник вопрос: почему при передаче массива в метод его изменение отображается во внешнем контексте, а у строки нет, хотя и то и другое - ссылочные типы?

Изменение Массива

Изменение строки


Ответы (1 шт):

Автор решения: A K

Поменять массив внутри метода не получится, посмотрите:

void Main()
{
    var arr = new int[] { 1, 2, 3 };
    Test1(arr);
    arr.Dump();
}

private void Test1(int[] arr)
{
    arr = null;
}

Выведет:

введите сюда описание изображения

А вот в вашем примере вы меняете не массив, а его элементы - а внутри массива у вас значимый тип (int), он заменяется.

Аналогично и с другими ссылочными типами:

void Main()
{
    var book = new Book { Id = 1, Title = "asdf"}; 
    Test1(book);
    book.Dump();
}

private void Test1(Book book)
{
    book.Id = 2;
    book = null;
}

public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
}

введите сюда описание изображения

Со строками такой вариант не проходит, потому что строки в C# - неизменяемый тип.

→ Ссылка