Другие языки программирования и технологии
Чем отличается коренным образом класс от структуры в c#
и дайте ссылку на ХОРОШИЙ самоучитель или справочник мсдн не предлагать))
class C {
public int Value { get; set; }
public C(int value) {
Value = value;
}
}
struct S {
public int Value { get; set; }
public S(int value) {
Value = value;
}
}
static void Main()
{
var a = new C(1);
var b = a;
b.Value = 2;
Console.WriteLine(a.Value == b.Value);
var x = new S(1);
var y = x;
y.Value = 2;
Console.WriteLine(x.Value == y.Value);
}
Это раз.
Второе. Память для а выделяется в динамической памяти (управляемой куче) , память для x и y - на стеке. Отличие проявляется при объявлении массивов объектов var array = new S[100] - все сто элементов будут расположены на стеке, а это работает быстрее. В связи с данной особенностью массивов структур вы не можете переопределить или скрыть конструктор без параметров (впрочем, это ограничение C#, а не .NET). Кроме того, память для экземпляров структур освободится сразу после выхода из метода, в то время как экземпляры ссылочных типов будут дожидаться сборки мусора.
Третье. Конкретно в C# к структурам неприминимо наследование (хотя, опять же, сама .NET позволяет объявлять структуры, производные от структур) . Впрочем, структуры могут реализовывать интерфейсы.
Четвёртое. Анонимные объекты-значения и оптимизация.
S Plus(S left, S right)
{
new S(left.Value + right.Value);
}
C Plus(C left, C right)
{
new C(left.Value + right.Value);
}
var a = new C(1);
var b = new C(2);
var c = Plus(a, Plus(a, b));
var x = new S(1);
var y = new S(2);
var z = Plus(x, Plus(x, y));
Будут созданы четыре экземпляра типа C но три экземпляра типа S.
Пятое.
class X
{
public C RefObject { get; set; }
}
class Y
{
public S ValObject { get; set; }
}
var x = new X();
x.RefObject = new C(0);
c.Value = 1 - прокатит.
var y = new Y();
y.ValObject.Value = 1 - не скомпилируется.
надо
y.ValueObject = new S(1);
Существует также понятие боксинга, забывать о котором также не следует.
var n = 1;
lock (n)
{
DoSomething();
}
отработает некорректно.
Вот они вам вкратце основные отличия, изложенные адекватно вашему желанию искать информацию самостоятельно.
Гуглите по персоналии Эндрю Троелсена.
public int Value { get; set; }
public C(int value) {
Value = value;
}
}
struct S {
public int Value { get; set; }
public S(int value) {
Value = value;
}
}
static void Main()
{
var a = new C(1);
var b = a;
b.Value = 2;
Console.WriteLine(a.Value == b.Value);
var x = new S(1);
var y = x;
y.Value = 2;
Console.WriteLine(x.Value == y.Value);
}
Это раз.
Второе. Память для а выделяется в динамической памяти (управляемой куче) , память для x и y - на стеке. Отличие проявляется при объявлении массивов объектов var array = new S[100] - все сто элементов будут расположены на стеке, а это работает быстрее. В связи с данной особенностью массивов структур вы не можете переопределить или скрыть конструктор без параметров (впрочем, это ограничение C#, а не .NET). Кроме того, память для экземпляров структур освободится сразу после выхода из метода, в то время как экземпляры ссылочных типов будут дожидаться сборки мусора.
Третье. Конкретно в C# к структурам неприминимо наследование (хотя, опять же, сама .NET позволяет объявлять структуры, производные от структур) . Впрочем, структуры могут реализовывать интерфейсы.
Четвёртое. Анонимные объекты-значения и оптимизация.
S Plus(S left, S right)
{
new S(left.Value + right.Value);
}
C Plus(C left, C right)
{
new C(left.Value + right.Value);
}
var a = new C(1);
var b = new C(2);
var c = Plus(a, Plus(a, b));
var x = new S(1);
var y = new S(2);
var z = Plus(x, Plus(x, y));
Будут созданы четыре экземпляра типа C но три экземпляра типа S.
Пятое.
class X
{
public C RefObject { get; set; }
}
class Y
{
public S ValObject { get; set; }
}
var x = new X();
x.RefObject = new C(0);
c.Value = 1 - прокатит.
var y = new Y();
y.ValObject.Value = 1 - не скомпилируется.
надо
y.ValueObject = new S(1);
Существует также понятие боксинга, забывать о котором также не следует.
var n = 1;
lock (n)
{
DoSomething();
}
отработает некорректно.
Вот они вам вкратце основные отличия, изложенные адекватно вашему желанию искать информацию самостоятельно.
Гуглите по персоналии Эндрю Троелсена.
насколько я знаю, в struct члены класса по умолчанию public, а в class всё же private.
а из книг вот эту очень уважаю, у меня она в печатном виде даж есть, кстати, там и почитай про структуры и классы побольше)
Гуд книга по C#
а из книг вот эту очень уважаю, у меня она в печатном виде даж есть, кстати, там и почитай про структуры и классы побольше)
Гуд книга по C#
Похожие вопросы
- C++ классы и структуры
- объясните структуры в C++
- чем отличаются между собой С С++ и Obj C ?
- мне 11 лет, я в 6 классе. я могу выучить C++? у меня есть книга по этому языку, но я мало что понимаю...
- Разработать Класс Person описывающий человека C++
- HTML, CSS чем отличается идентификатор от класса
- [C/C++] Oбъявление переменной типа структуры в этой же структуре
- Язык С++. Чем отличаются структуры от классов?
- Чем же отличаются C C++ и C# от друг друга
- Чем отличаются между собой C, C# и C++ ?
а про public и private вообще ни слова сказано не было, почти всё ни о чём)
public int Value { get; set; }
public C(int value) {
Value = value;
}
}
struct S {
public int Value { get; set; }
public S(int value) {
Value = value;
}
}
static void Main()
{
var a = new C(1);
var b = a;
b.Value = 2;
Console.WriteLine(a.Value == b.Value);
var x = new S(1);
var y = x;
y.Value = 2;
Console.WriteLine(x.Value == y.Value);
}
Это раз.
и что ты этим хотел показать? какое из различий? просто интересно. не нада тут ругаться