2013-06-15 3 views
1

Поскольку я изучаю C#, я был бы признателен за некоторые профессиональные советы о структурах и классах. Поскольку классы являются ссылочными типами и хранятся в куче, тогда как структуры являются типами значений и хранятся в стеке.Рекомендации по структурам и классам

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

Учитывая, что я прочитал, будет ли следующий код быть структурой или классом.

public struct DisplayWeatherAstronomy 
{ 
    public string SunRise    { get; internal set; } 
    public string SunSet    { get; internal set; } 
    public string MoonRise    { get; internal set; } 
    public string MoonSet    { get; internal set; } 
} 

/* **Дополнительный код* **/

Уходя два ответа, я добавил немного кода.

public IEnumerable<DisplayWeatherAstronomy> WeatherAstronomy(string id) 
{ 
    var doc = WeatherXml.XmlData(id); 
    var displayAstronomy = (from wd in doc.Descendants("astronomy") 
          select new DisplayWeatherAstronomy 
          { 
           SunRise = (string)wd.Element("sunrise") ?? string.Empty, 
           SunSet = (string)wd.Element("sunset") ?? string.Empty 
          }); 
    return displayAstronomy; 
} 
+0

Релевантно: http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx и http://blogs.msdn.com /b/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx –

+0

Это может быть легко структура просто потому, что я не вижу каких-либо методов для изменения состояния members.you не нужны накладные расходы ссылочного типа, если это так просто. –

+0

Спасибо за ответ, я добавил дополнительный код, чтобы попытаться помочь мне понять –

ответ

2

Первое, что вы хотите сделать, это правильно определить структуру данных. Это проблема с той, которая у вас есть, она хранит время как строки. Это не отличный выбор, это дорого, так как вам нужно будет преобразовать их из строкового представления в какое-то время, и это больно, чтобы ваша программа работала в разных локациях в мире, которые имеют разные способы выразить время суток , Вы определенно хотите тип, который может выразить время недвусмысленно и быстро. TimeSpan - это правильный тип для хранения времени суток. Он напрямую совместим с свойством DateTime.TimeOfDay и хранится как двоичное значение, 64-битное (8 байтов).

Следующее руководство состоит в том, что структура должна быть легкой, чтобы быть эффективной во время выполнения. Эмпирическое правило состоит в том, что оно должно содержать не более 4 полей и не должно быть больше 16 байт. Если вы превысите эти пределы, то тип значения теряет преимущество в скорости. Четыре поля хороши на процессоре x86, у него есть 4 резервных регистра процессора, которые могут хранить значения.16 байтов устанавливает верхний предел стоимости копирования значения, когда он передается значением вместо ссылки.

Вы хорошо относитесь к числу полей, но превышаете ограничение по размеру, 4 TimeSpans принимают 32 байта. Так что это должен быть класс.

+0

Привет, Ханс спасибо за ответ, причина, по которой я выбрал строку, состояла в том, что данные были в строковом формате с удаленного сайта. Поэтому, если я правильно вас понимаю, не более 4 полей и меньше 16 байт. (Не упоминается в книге, которую я читаю), будет хорошо для структур, что-то большее будет классом. –

+1

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

+0

Привет, Ханс, надеюсь, что в сентябре в колледже для HND в области вычислительной техники (Adult Student), книги могут вас только научить. Я думаю, что я больше узнаю информацию на таких сайтах и ​​публикую вопросы, чем читаю книги. –

4

Это зависит скорее от цели вашего типа, чем от размера.

Если вы хотите передать данные и хотите получить копию для каждого вызова, вы должны использовать структуру. Но если вам нужно хранить ваши данные в центральном месте, и многие другие части вашего кода должны работать с одними и теми же данными, вам нужен класс. Класс передается по ссылке и не дублирует никаких данных.

Если вы копируете данные вокруг, как это делают структуры, вы можете столкнуться с несогласованным состоянием.

+0

Фактически, передача 'class' вокруг обычно быстрее, чем передача' struct', потому что ссылка почти всегда меньше, чем вся 'struct'. То, что быстрее, - это * доступ к * данным в 'struct', потому что есть одна меньшая косвенность (и никакая проверка« null »). – svick

+0

Привет, Thalm, спасибо за ответ, я перечитаю главу, так как я думаю, что, возможно, неправильно понял ее. –

+0

@svick вы правы, это не столько скорость, сколько больше о правильном использовании этого типа. – thalm

0

Как классы являются ссылочными типами и хранятся в куче, тогда как структуры являются типами значений и хранятся в стеке.

Wrong.

Учитывая то, что я прочитал, что следующий код будет структура или класс.

Это было бы плохо struct, because it's mutable (даже если сеттеры internal). В общем, по крайней мере 95% времени вы хотите использовать class. Вы должны создать пользовательский struct, когда ваше профилирование показывает, что использование class происходит медленно, и это происходит очень редко.

+0

Hi svick, спасибо за ответ, я снова перейду к главе, так как я, возможно, неправильно ее понял. –

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