Это объясняется гораздо более подробно в C# documentation типов, но здесь суть его:
- Типы значений элементы, такие как
int
, bool
, любой struct
и т.д. Эти блоки памяти которые имеют определенную ценность.
- Референтные типы - это такие предметы, как
string
, object
, любые class
и т. Д. Это фактически «ссылки» на блок памяти, сохраняющий их значение.
Если вы передаете тип значения в качестве параметра для метода, это значение по существу копируется в новый блок памяти, а исходное значение не может быть изменено кодом в методе.
public static void Main()
{
int myInt = 5;
Console.WriteLine(myInt);
ChangeMe(myInt);
Console.WriteLine(myInt);
}
public static void ChangeMe(int i)
{
i = 7;
}
// Outputs:
// 5
// 5
Чтобы изменить тип значения, вы должны использовать параметр «ref» или «out».
public static void Main()
{
int myInt = 5;
Console.WriteLine(myInt);
ChangeMe(ref myInt);
Console.WriteLine(myInt);
}
public static void ChangeMe(ref int i)
{
i = 7;
}
// Outputs:
// 5
// 7
Это, однако, не относится к типам, которые уже являются ссылочными типами. Как правило, в структуре сущности вы работаете с типами, которые настроены как объекты class
. По умолчанию это ссылочные типы. Передача ссылочного типа методу не «копирует» его, как тип значения, метод получает доступ к исходному объекту. Это потому, что вы просто передаете место, где живет эта память. Это проявляется в том, что позволяет модифицировать значения класса.
public class MyClass
{
public int MyInt { get; set; }
}
public static void Main()
{
MyClass myclass = new MyClass();
myclass.MyInt = 5;
Console.WriteLine(myclass.MyInt);
ChangeMe(myClass);
Console.WriteLine(myclass.MyInt);
}
public static void ChangeMe(MyClass i)
{
i.MyInt = 7;
}
// Outputs:
// 5
// 7
+1 спасибо. Фактически ошибка, которую я делал, похожа на ваш случай, когда я повторно инициализировал объект MyClass, вместо этого менял только MyInt. Благодаря :) –