Класс - это ссылочный тип, а если в нем есть значимые переменные, то под них память выделяется в куче, как под ссылочный (поправьте, если ошибаюсь).
То есть, можно передать переменную 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++;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей