С помощью structs я не могу напрямую изменять свои поля, поскольку вся структура имеет тип значения.
Вы не можете изменить поля в ситуациях, когда C# делает копию struct
для вас. В других ситуациях вы можете изменять поля struct
. Вот небольшая демонстрация разницы:
struct Foo {
public int A {get;set;}
public void SetA(int a) {
A = a;
}
}
class Bar {
Foo f;
public Foo F {
get{return f;}
set {f = value;}
}
public void SetFooA(int x) {
f.SetA(x);
}
}
public static void Main() {
Bar b = new Bar();
b.F.SetA(123); // b.F makes a copy, so changing A fails
Console.WriteLine("{0}", b.F.A);
b.SetFooA(456); // Inside Bar, f.SetA is called directly, so the change works fine
Console.WriteLine("{0}", b.F.A);
b.F = new Foo { A = 112233 }; // This also works, because the whole F is assigned
Console.WriteLine("{0}", b.F.A);
}
Если у меня есть открытое поле int X
, я могу изменить его должным образом.
То же правило применяется к пользовательским struct
с, если вы его полностью модифицируете. Вы не можете модифицировать часть int
, потому что она не является составной. Модификация struct
отлично работает при назначении всего struct
сразу. Другими словами, назначение
b.F = new Foo { A = 112233 };
в моем примере заменяет назначение
B = 100;
в вашем примере.
Demo.
вопрос не 100% прозрачный.Можете ли вы предоставить образец кода, чтобы мы могли лучше понять? – peval27
Что заставляет вас думать, что все поля являются ссылочными типами? – Servy