Под значимые переменные в классе память выделяется в куче?

175
02 февраля 2020, 12:00

Класс - это ссылочный тип, а если в нем есть значимые переменные, то под них память выделяется в куче, как под ссылочный (поправьте, если ошибаюсь).

То есть, можно передать переменную x в метод F1 и она должна передаться по ссылке без использования ref. Тогда непонятно, почему программа выводит 5, а не 6.

class A
{
    public int x = 5;
    public void F1(int var)
    {
        var++;
    }
}
class Program
{
    static void Main()
    {
        A a = new A();
        a.F1(a.x);
        System.Console.WriteLine(a.x);
    }
}
Answer 1

Немного неправильно. Память под x действительно выделяется в куче, НО когда вызывается метод и переменная передается без ключевого слова ref, на стеке создается копия значения этой переменной. При модификации значения параметра изменяться будет параметр на стеке, а не в куче. После завершения вызова стек очищается. Поэтому все изменения над этой переменной будут не видны вне метода.

В C# параметры можно передавать по ссылке и по значению. И способ передачи никак не зависит от того, где выделяется память.

В данном случае вы передаете в метод не ссылку, а значение типа int. Ваше предположение бы работало, если вы передавали бы в метод переменную типа A (она будет хранить адрес области памяти, и значение будет браться из этой области):

public void F1(A a)
{
    a.x++;
}
READ ALSO
Одновременное чтение и запись в файл

Одновременное чтение и запись в файл

Пишу клиент-сервер, где один клиент пишет в файл, а другие клиенты просматривают измененияХочу достичь чего-то вроде Google Document

158
Проблема с вводом чисел с десятичной запятой в приложении Xamarin.Forms

Проблема с вводом чисел с десятичной запятой в приложении Xamarin.Forms

В приложении XamarinForms под Android необходимо вводить и отображать числа с одним знаком после запятой

182
Проблема с базой данных SQLite в приложении Xamarin.Forms

Проблема с базой данных SQLite в приложении Xamarin.Forms

В приложении XamarinForms под Android для хранения данных используется база данных SQLite

172