Во-первых (и это только практическое правило) struct
s должно быть Неизменным .Сейчас в Интернете тысячи блогов, которые обсуждают это и почему, и лучше всего прочитать об этом.
Однако по умолчанию они изменчивы.Тем не менее, говоря об этом, в структуре используется много изменяемых структур, таких как Point
, Size
, Rectangle
.Эти struct
являются полностью изменяемыми.Это сделано (вопреки руководящим принципам) для повышения производительности, поскольку позволяет избежать необходимости создавать новые значения для операций модификации.
... Все это в стороне, если вы передаете изменяемую struct
впараметр (в отличие от ссылочного типа), который вы получаете, является копией.Ничто из того, что вы делаете, не будет иметь никакого значения, если вы не пройдете мимо ref
.
Учитывая Изменчивый struct
public struct Student
{
public Student(string name, int studentId, string major)
{
Name = name;
StudentId = studentId;
Major = major;
}
public string Name { get; set; }
public int StudentId { get; set; }
public string Major { get; set; }
public override string ToString() => Name + ", " + StudentId + ", " + Major;
}
Вы можете просто пройтипо ссылке
private void MutateStudent(ref Student student)
{
student.Name = "asd";
student.StudentId = 234;
student.Major = "ertyt";
}
или
private Student AbetterMutateStudent(Student student)
{
// this is actually a copy
student.Name = "asd";
student.StudentId = 234;
student.Major = "ertyt";
return student;
}
Пример
var student = new Student("SomeName",1,"SomeMajor");
Console.WriteLine(student);
MutateStudent(ref student);
Console.WriteLine(student);
var student2 = AbetterMutateStudent(student);
Console.WriteLine(student2);
Выход
SomeName, 1, SomeMajor
ByrRefName, 2, ByrRefMajor
ByCopyName, 3, ByCopyMajor