2017-02-13 3 views
-1

Я немного смущен здесь. С structs я не могу напрямую изменять свои поля, поскольку вся структура имеет тип значения. Но как насчет классов с полями типа значения? Если у меня есть общедоступное поле int X, я могу его правильно изменить. Таким образом, единственным проявлением характерного типа его поля было бы то, что при передаче в качестве аргумента это копия?Поля типов значений являются ссылочными типами?

EDIT: Кроме того

Class A 
{ 
    int B=100; //this is a field, so reference type. But it is a value type. 
} 

Обращение к содержанию B хранится в куче, но значение B хранятся в стеке?

+2

вопрос не 100% прозрачный.Можете ли вы предоставить образец кода, чтобы мы могли лучше понять? – peval27

+0

Что заставляет вас думать, что все поля являются ссылочными типами? – Servy

ответ

1

С помощью 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.

-1

Struct дает вам копию исходного поля, так как копия структуры будет принят. Изменение его на класс передало бы ссылку на класс, и поэтому поле изменилось бы, если бы вы его изменили.

0

Адрес для содержимого В хранится в куче, но является ли значение B, хранящимся в стеке?

№ Поле типа значения класса хранится в куче.

Пожалуйста, обратитесь к ответу @Marc Gravell здесь для получения дополнительной информации об этом:

Why value-types are stored onto Stacks?

Вы также можете прочитать в блоге @Eric LIPPERT по теме: https://blogs.msdn.microsoft.com/ericlippert/2010/09/30/the-truth-about-value-types/

В короткое значение типы могут содержать в стеке, но они не всегда хранятся в стеке.

Смежные вопросы