В чем разница между структурой и классом в .NET?

Если вы используете eclipse для подключения oracle без SID. Есть два драйвера для выбора, т. Е. Драйвер Oracle thin, а другой - другой драйвер. Выберите другие драйверы и введите имя службы в столбце базы данных. Теперь вы можете напрямую подключиться, используя имя службы без SID.

615
задан Mark Amery 16 December 2017 в 22:41
поделиться

7 ответов

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

значения

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

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

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

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

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

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

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

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

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

  • переменная: тип значения живет на стеке, ссылочный тип жизни на стеке как указатель на где-нибудь в памяти "кучи", где фактическая память живет (хотя примечание ряд статьи Eric Lipperts: Стек Является Деталью Реализации .)
  • class/struct-field: тип значения живет полностью в типе, ссылочный тип жизни в типе как указатель на где-нибудь в памяти "кучи", где фактическая память живет.
971
ответ дан Lasse Vågsæther Karlsen 16 December 2017 в 22:41
поделиться

Экземпляры классов хранятся на управляемой "куче". Все переменные, 'содержащие' экземпляр, являются просто ссылкой на экземпляр на "куче". Передача объекта к методу приводит к копии передаваемой ссылки, не сам объект.

Структуры (технически, типы значения) хранятся везде, где они используются, во многом как тип примитива. Содержание может быть скопировано временем выполнения в любое время и не вызывая специализированного конструктора копии. Передача типа значения к методу включает копирование всего значения, снова не вызывая настраиваемого кода.

различие сделано лучше C++ / имена CLI: "касательно класса" класс, как описано сначала, "класс значения" является классом как описанной секундой. Ключевые слова "класс" и "структура", как используется C# являются просто чем-то, что должно быть изучено.

14
ответ дан Zooba 16 December 2017 в 22:41
поделиться

В.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.

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

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

36
ответ дан Peter Mortensen 16 December 2017 в 22:41
поделиться

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

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

5
ответ дан Ed S. 16 December 2017 в 22:41
поделиться

Структуры являются фактическим значением - они могут быть пустыми, но никогда не пустые

, Это верно, однако также обратите внимание, что с.NET 2 структуры поддерживают версию Nullable, и C# предоставляет немного синтаксического сахара, чтобы облегчить использовать.

int? value = null;
value  = 1;
1
ответ дан denis phillips 16 December 2017 в 22:41
поделиться

Краткое изложение каждого:

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

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

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

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

И Классы и Структуры:

  • составные типы данных, обычно раньше содержал несколько переменных, которые имеют некоторые логические отношения
  • , Может содержать методы, и события
  • Могут поддерживать интерфейсы
182
ответ дан Thomas Bratt 16 December 2017 в 22:41
поделиться

Structure vs Class

A structure is a value type so it is stored on the stack, but a class is a reference type and is stored on the heap.

A structure doesn't support inheritance, and polymorphism, but a class supports both.

By default, all the struct members are public but class members are by default private in nature.

As a structure is a value type, we can't assign null to a struct object, but it is not the case for a class.

7
ответ дан 22 November 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: