Структуры - реальные примеры? [закрытый]

У Вас есть макс. из адресуемой памяти на 2 ГБ как приложение на 32 бита как другие упомянутые плакаты. Не забывайте об издержках. Вы создаете массив 93 миллионов объектов - если, оказывается, существует 4 байта издержек на объект, это составляет дополнительные 350 МБ памяти.

42
задан Jason Down 24 December 2011 в 17:55
поделиться

18 ответов

Well a class would still work for it, but an example I could think of is something like a Point. Assuming it is an x and y value, you could use a struct.

struct Point {
    int x;
    int y;
}

In my mind, I would rather have a more simple representation of a pair of integers than to define a use a class with instantiations when the actual entity does not really have much(or any) behavior.

20
ответ дан 26 November 2019 в 23:46
поделиться

I think the .Net Framework is quite real life. See the list under "Structures":

System Namespace

0
ответ дан 26 November 2019 в 23:46
поделиться

Единственный раз, когда я '

0
ответ дан 26 November 2019 в 23:46
поделиться

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

, это означает, что я предвижу ситуацию, когда я хочу сравнить две из этих вещей и хочу, чтобы они отображались одинаковыми, если у них есть такое же значение. С классами это на самом деле больше работы, потому что мне нужно переопределить ==,! =, Equals и GetHashcode, что даже если resharper сделает это за меня, это лишний ненужный код.

1
ответ дан 26 November 2019 в 23:46
поделиться

Basically, I use Structs for modeling geometric and mathematical data, or when I want a Value-based data-structure.

0
ответ дан 26 November 2019 в 23:46
поделиться

Они обеспечивают реализацию по умолчанию для Object.GetHashCode (), поэтому вы можете использовать структуру вместо класса, когда объект представляет собой простую коллекцию не ссылочных типов, которые вы хотите использовать в качестве ключей к словарю.

Они также полезны для сценариев PInvoke / взаимодействия или низкоуровневых сетевых сценариев, где требуется точный контроль над двоичной компоновкой структуры данных. (посетите www.pinvoke.net для получения большого количества кода взаимодействия, требующего структур)

Но на самом деле я никогда не использую их сам. Не переживайте, если не пользуетесь ими.

3
ответ дан 26 November 2019 в 23:46
поделиться

Я часто использую структуры для представления типа значения модели предметной области, который может быть представлен в виде перечисления, но требует произвольного неограниченного числа дискретных значений, или я хочу, чтобы у него было дополнительное поведение (методы) которые вы не можете добавить в перечисление ... Например, в недавнем проекте многие элементы данных были связаны с определенным календарным месяцем, а не с датой. Итак, я создал структуру CalendarMonth, в которой были методы:

  • статический анализ календарного месяца (DateTime inValue);
  • статический анализ календарного месяца (строка inValue);

и метод TryParse (),

  • static bool TryParse (строка inValue , out CalendarMonth outVal);

And Properties

  • int Month {получить; установлен; }
  • int Year {получить; установлен; }
  • DateTime StartMonthLocal {get; установлен; }
  • DateTime StartMonthUTC {получить; установлен; }
  • DateTime EndMonthLocal {get; установлен; }
  • DateTime EndMonthUTC {get; установлен; }

и т. Д.

1
ответ дан 26 November 2019 в 23:46
поделиться

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

2
ответ дан 26 November 2019 в 23:46
поделиться

The key for me is to define if I want to keep reference to the same object.

Which makes sence when struct is part of another entity, but does entity itself.

In the example above with LatLong that makes perfect sence, for example. You need to copy values from one object to another, not keep referensing the same object.

1
ответ дан 26 November 2019 в 23:46
поделиться

The quintessential example is the frameworks nullable types, such as int?. These use structs so they retain the value semantics of an int, yet providing a way to make them null without boxing and turning them into reference types.

You would use a struct when you don't want to pass something by reference. Suppose you have a collection of data, or an object that you wish to pass by value (ie, anything you pass it to is working with its own unique copy, not a reference to the original version) then a struct is the right type to use.

5
ответ дан 26 November 2019 в 23:46
поделиться

A Money struct is probably one of the most common, however Phone number or Address are also common.

public struct Money
{
    public string Currency { get; set; }
    public double Amount { get; set; }
}

public struct PhoneNumber
{
    public int Extension { get; set; }
    public int RegionCode { get; set; }
    //... etc.
}

public struct FullName
{
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
}

Keep in mind though that in .NET your structs should not be larger in memory footprint than 16 Bytes, because if they get bigger the CLR has to allocate additional memory.

Also because structs 'live' on the stack (and not the heap as reference types do) you might consider using structs if you need to instantiate a lot of the same types of objects.

7
ответ дан 26 November 2019 в 23:46
поделиться

Structs are also typically used in graphics/rendering systems. There are many benefits to making points/vectors structs.

Rico Mariani posted an excellent quiz on value based programming. He discussed many reasons to prefer structs in specific situations, and explained it in detail in his quiz results post.

13
ответ дан 26 November 2019 в 23:46
поделиться

I used a struct to represent a Geolocation

struct LatLng
{
    public decimal Lattitude
    {
        get;
        set;
    }
    public decimal Longitude
    {
        get;
        set;
    }
}

this represents a single entity, for instance I can add 2 LatLng's together or perform other operations on this single entity.

MSDN-struct

The struct type is suitable for representing lightweight objects such as Point, Rectangle, and Color. Although it is possible to represent a point as a class, a struct is more efficient in some scenarios. For example, if you declare an array of 1000 Point objects, you will allocate additional memory for referencing each object. In this case, the struct is less expensive.

Also if you look at primitive types Int32,decimal,double..etc you will notice they are all structs, which allows them to be value types whilst allowing them to implement certain crucial interfaces.

17
ответ дан 26 November 2019 в 23:46
поделиться

Вам необходимо установить Kind на Unspecified , например:

DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone);

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

поведение присваивания классов (в C #), в котором обнаруживаются трудные для отслеживания ошибки, потому что вы не помните, что объект, которому он присваивался, имел такое поведение, потому что он был реализован как структура, а не как класс. (Это случалось со мной не один раз, поэтому я предупреждаю вас, потому что я действительно был обожжен неправомерным использованием структур C #.)

0
ответ дан 26 November 2019 в 23:46
поделиться

Я создал в прошлом - StorageCapacity. Он представлял от 0 байтов до N эксабайт (можно было бы увеличить до йоттабайта, но в то время казалось достаточно exa). Эта структура имела смысл, поскольку я работал в компании по управлению хранением. Вы могли подумать, что это довольно просто: структура с StorageUnit (enum) и Quantity (я использовал decimal). Но когда вы добавляете преобразования, операторы и классы для поддержки форматирования, синтаксического анализа и т. Д., Они складываются.

Абстракция была полезна, чтобы позволить вам взять любой StorageCapacity и представить его в байтах, килобайтах и ​​т. Д.

0
ответ дан 26 November 2019 в 23:46
поделиться

В некоторых критических для производительности ситуациях структура (тип значения и, следовательно, выделенный из стека) может быть лучше, чем класс (ссылочный тип и, следовательно, выделяемый из кучи). Сообщение в блоге Джо Даффи « Блокировка спина для чтения / записи одного слова » показывает реальное применение этого.

0
ответ дан 26 November 2019 в 23:46
поделиться

Итак, насколько я понимаю, вы никогда не использовали DateTime (структуру).

1
ответ дан 26 November 2019 в 23:46
поделиться

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

Следовательно, следующий код даст ошибки компиляции, но если вы измените "структуру" на "класс", она будет компилироваться.

    public struct ServiceType
    {
        public bool backEnd { get; set; }
        public bool frontEnd { get; set; }

        public string[] backEndServices = { "Service1", "Service2" };
        public string[] frontEndServices = { "Service3", "Service4" };
    }
0
ответ дан 26 November 2019 в 23:46
поделиться
Другие вопросы по тегам:

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