У Вас есть макс. из адресуемой памяти на 2 ГБ как приложение на 32 бита как другие упомянутые плакаты. Не забывайте об издержках. Вы создаете массив 93 миллионов объектов - если, оказывается, существует 4 байта издержек на объект, это составляет дополнительные 350 МБ памяти.
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.
I think the .Net Framework is quite real life. See the list under "Structures":
Меня обычно не волнует "плотность данных" в мои бизнес-приложения. Обычно я всегда буду использовать класс, если мне не нужна семантика значений
, это означает, что я предвижу ситуацию, когда я хочу сравнить две из этих вещей и хочу, чтобы они отображались одинаковыми, если у них есть такое же значение. С классами это на самом деле больше работы, потому что мне нужно переопределить ==,! =, Equals и GetHashcode, что даже если resharper сделает это за меня, это лишний ненужный код.
Basically, I use Structs for modeling geometric and mathematical data, or when I want a Value-based data-structure.
Они обеспечивают реализацию по умолчанию для Object.GetHashCode (), поэтому вы можете использовать структуру вместо класса, когда объект представляет собой простую коллекцию не ссылочных типов, которые вы хотите использовать в качестве ключей к словарю.
Они также полезны для сценариев PInvoke / взаимодействия или низкоуровневых сетевых сценариев, где требуется точный контроль над двоичной компоновкой структуры данных. (посетите www.pinvoke.net для получения большого количества кода взаимодействия, требующего структур)
Но на самом деле я никогда не использую их сам. Не переживайте, если не пользуетесь ими.
Я часто использую структуры для представления типа значения модели предметной области, который может быть представлен в виде перечисления, но требует произвольного неограниченного числа дискретных значений, или я хочу, чтобы у него было дополнительное поведение (методы) которые вы не можете добавить в перечисление ... Например, в недавнем проекте многие элементы данных были связаны с определенным календарным месяцем, а не с датой. Итак, я создал структуру CalendarMonth, в которой были методы:
и метод TryParse (),
And Properties
и т. Д.
В основном я стараюсь НЕ использовать их. Я считаю, что они сбивают с толку других разработчиков в команде и поэтому не стоят усилий. Я нашел только один футляр, чтобы использовать его,
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.
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.
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.
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.
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.
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.
Вам необходимо установить Kind
на Unspecified
, например:
DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone);
DateTimeKind.Local
означает местный часовой пояс, а не любой другой часовой пояс. Вот почему вы получали сообщение об ошибке.
Я создал в прошлом - StorageCapacity. Он представлял от 0 байтов до N эксабайт (можно было бы увеличить до йоттабайта, но в то время казалось достаточно exa). Эта структура имела смысл, поскольку я работал в компании по управлению хранением. Вы могли подумать, что это довольно просто: структура с StorageUnit (enum) и Quantity (я использовал decimal). Но когда вы добавляете преобразования, операторы и классы для поддержки форматирования, синтаксического анализа и т. Д., Они складываются.
Абстракция была полезна, чтобы позволить вам взять любой StorageCapacity и представить его в байтах, килобайтах и т. Д.
В некоторых критических для производительности ситуациях структура (тип значения и, следовательно, выделенный из стека) может быть лучше, чем класс (ссылочный тип и, следовательно, выделяемый из кучи). Сообщение в блоге Джо Даффи « Блокировка спина для чтения / записи одного слова » показывает реальное применение этого.
Итак, насколько я понимаю, вы никогда не использовали DateTime (структуру).
Я не уверен, насколько это полезно, но сегодня я обнаружил, что хотя у вас не может быть инициализаторов поля экземпляра в структурах, вы можете в классах.
Следовательно, следующий код даст ошибки компиляции, но если вы измените "структуру" на "класс", она будет компилироваться.
public struct ServiceType
{
public bool backEnd { get; set; }
public bool frontEnd { get; set; }
public string[] backEndServices = { "Service1", "Service2" };
public string[] frontEndServices = { "Service3", "Service4" };
}