В коде есть комментарии, которые нужно прочитать.
Переменная типа MyClass, когда под неё выделят память будет содержать ссылку на MyClass со значением по умолчанию null.
Данные в полях класса могут быть:
- экземпляры классов -- class; ссылочный тип данных (Reference Type)
- экземпляры структур -- struct, enum; тип значений (Value Type)
Размеры типов значений
Ссылочные типы
Типы значений
using System;
namespace Types
{
public class Person
{
public string FirstName { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
// Так как class это ссылочный тип данных (Reference Type), то
// в стеке создаётся ссылка на экземпляр класса Person,
// под который выделена память в области, называемой кучей (Heap).
var person = new Person
{
FirstName = "John",
Age = 30
};
// Передаём в метод ссылку. Ссылка копируется, а данные
// так и остаются в куче, с ними ничего не происходит.
// Данных может быть хоть мегабайт, они не копируются, а вот
// ссылка копируется и имеет разный размер в зависимости от
// архитектуры x86 или x64, но размер этот крайне маленький (4 байта или 8 байт)
Display(person);
Console.ReadKey();
}
private static void Display(Person person)
{
// Здесь внутри метода находится копия ссылки.
Console.WriteLine($"Name = {person.FirstName}, Age = {person.Age.ToString()}");
}
}
}
-
// Ссылка, так как это class
Person person;
// Ссылка на экземпляр класса, так как мы выделили память в куче.
person = new Person();
using System;
namespace Types
{
class MyClass
{
MyClass my;
}
class Program
{
static void Main(string[] args)
{
// Выделяем память в куче.
// Ссылается на экземпляр класса MyClass, внутри
// которого есть поле типа MyClass со значением null.
MyClass data = new MyClass();
Console.ReadKey();
}
}
}