Класс - это ссылочный тип, а если в нем есть значимые переменные, то под них память выделяется в куче, как под ссылочный (поправьте, если ошибаюсь).
То есть, можно передать переменную 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);
}
}
Немного неправильно. Память под x
действительно выделяется в куче, НО когда вызывается метод и переменная передается без ключевого слова ref
, на стеке создается копия значения этой переменной. При модификации значения параметра изменяться будет параметр на стеке, а не в куче. После завершения вызова стек очищается. Поэтому все изменения над этой переменной будут не видны вне метода.
В C# параметры можно передавать по ссылке и по значению. И способ передачи никак не зависит от того, где выделяется память.
В данном случае вы передаете в метод не ссылку, а значение типа int
. Ваше предположение бы работало, если вы передавали бы в метод переменную типа A
(она будет хранить адрес области памяти, и значение будет браться из этой области):
public void F1(A a)
{
a.x++;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пишу клиент-сервер, где один клиент пишет в файл, а другие клиенты просматривают измененияХочу достичь чего-то вроде Google Document
В приложении XamarinForms под Android необходимо вводить и отображать числа с одним знаком после запятой
В приложении XamarinForms под Android для хранения данных используется база данных SQLite