Сведения о вопросе

Henry

11:22, 21st August, 2020

Теги

В чем разница между struct и class в .NET?

Просмотров: 566   Ответов: 4

В чем разница между struct и class in?NET?



  Сведения об ответе

+-*/

23:20, 26th August, 2020

В .NET существует две категории типов: ссылочные типы и типы значений .

Структуры - это типы значений , а классы- ссылочные типы .

Общее различие заключается в том, что ссылочный тип живет в куче, а тип значения живет встраиваемый, то есть везде, где определена ваша переменная или поле.

Переменная, содержащая тип значения, содержит все значение типа значения. Для структуры это означает, что переменная содержит всю структуру со всеми ее полями.

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

Это имеет одно преимущество, для начала:

  • типы значений всегда содержат значение
  • ссылочные типы могут содержать null-ссылку, что означает, что они вообще ни на что не ссылаются в данный момент

Внутренне ссылочные типы s реализуются как указатели, и зная это, а также зная, как работает назначение переменных, существуют другие поведенческие паттерны:

  • копируя содержимое переменной типа значения в другую переменную, вы копируете все содержимое в новую переменную, делая их различными. Другими словами, после копирования изменения в одном не повлияют на другое
  • копируя содержимое переменной ссылочного типа в другую переменную, копируется ссылка, что означает, что теперь у вас есть две ссылки на одно и то же место хранения фактических данных. Другими словами, после копирования изменение данных в одной ссылке будет влиять и на другую, но только потому, что вы действительно просто смотрите на одни и те же данные в обоих местах

Когда вы объявляете переменные или поля, вот как отличаются эти два типа:

  • переменная: тип значения живет в стеке, ссылочный тип живет в стеке как указатель на то место в памяти кучи, где живет фактическая память (хотя обратите внимание на серию статей Эрика Липпертса: стек-это деталь реализации .)
  • class/struct-field: тип значения живет полностью внутри типа, ссылочный тип живет внутри типа как указатель на то место в памяти кучи, где живет фактическая память.


  Сведения об ответе

P_S_S

00:19, 27th August, 2020

Краткое описание каждого из них:

Только Классы:

  • Может поддерживать наследование
  • Это ссылка (указатель) типы
  • Ссылка может быть null
  • Есть накладные расходы памяти на каждый новый экземпляр

Только Структуры:

  • Не поддерживают наследование
  • Являются ли типы значений
  • Передаются по значению (как целые числа)
  • Не может иметь ссылку null (если не используется Nullable)
  • Не нужно накладных расходов памяти на каждый новый экземпляр-если только 'boxed'

Как классы, так и структуры:

  • Являются ли составные типы данных обычно используемыми для того чтобы содержать несколько переменных которые имеют некоторую логическую связь
  • Может содержать методы и события
  • Может поддерживать интерфейсы


  Сведения об ответе

ЯЯ__4

07:38, 15th August, 2020

В .NET объявления структуры и класса различают ссылочные типы и типы значений.

Когда вы проходите вокруг ссылочного типа, фактически сохраняется только один. Весь код, который обращается к экземпляру, обращается к одному и тому же экземпляру.

При передаче Вокруг типа значения каждый из них является копией. Весь код работает на своей собственной копии.

Это можно показать на примере:

struct MyStruct 
{
    string MyProperty { get; set; }
}

void ChangeMyStruct(MyStruct input) 
{ 
   input.MyProperty = "new value";
}

...

// Create value type
MyStruct testStruct = new MyStruct { MyProperty = "initial value" }; 

ChangeMyStruct(testStruct);

// Value of testStruct.MyProperty is still "initial value"
// - the method changed a new copy of the structure.

Для класса это было бы по-другому

class MyClass 
{
    string MyProperty { get; set; }
}

void ChangeMyClass(MyClass input) 
{ 
   input.MyProperty = "new value";
}

...

// Create reference type
MyClass testClass = new MyClass { MyProperty = "initial value" };

ChangeMyClass(testClass);

// Value of testClass.MyProperty is now "new value" 
// - the method changed the instance passed.

Классы могут быть ничем - ссылка может указывать на null.

Структуры являются фактическим значением - они могут быть пустыми, но никогда null. По этой причине структуры всегда имеют конструктор по умолчанию без параметров - им нужен 'starting value'.


  Сведения об ответе

dump

02:26, 22nd August, 2020

В дополнение ко всем отличиям описанным в других ответах:

  1. Структуры не могут иметь явный конструктор без параметров, в то время как класс может
  2. Структуры не могут иметь деструкторов, в то время как класс может
  3. Структуры не могут наследовать от другой структуры или класса, в то время как класс может наследовать от другого класса. (Как структуры, так и классы могут реализовываться из интерфейса.)

Если вы ищете видео, объясняющее все различия, вы можете проверить Часть 29 - учебник C# - разница между классами и структурами в C# .


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться