Неизменность структур [дубликат]

Добавление шрифта с помощью функций вашей темы.

function wpb_add_google_fonts() {
   wp_enqueue_style( 'wpb-google-fonts', 'https://fonts.googleapis.com/css?family=Archivo+Narrow:400,400i,700', false ); 
}

add_action( 'wp_enqueue_scripts', 'wpb_add_google_fonts' );

wpbeginner.com how-add-google-web-fonts-wordpress-themes

30
задан Community 23 May 2017 в 11:54
поделиться

7 ответов

Структуры должны представить значения . Значения не изменяются. Номер 12 вечен.

Однако рассмотрите:

Foo foo = new Foo(); // a mutable struct
foo.Bar = 27;
Foo foo2 = foo;
foo2.Bar = 55;

Теперь нечто. Панель и foo2. Панель отличается, который часто неожидан. Особенно в сценариях как свойства (к счастью, компилятор обнаруживают это). Но также и наборы и т.д.; как Вы когда-либо видоизменяете их разумно?

потеря Данных слишком легка с изменяемыми структурами.

43
ответ дан Marc Gravell 27 November 2019 в 23:10
поделиться

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

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

РЕДАКТИРОВАНИЕ: я только что нашел электронное письмо, которое я написал только что по этой теме. Это уточняет просто немного:

  • Это философски неправильно: структура должна представить своего рода основную ценность. Это в основном неизменно. Вы не добираетесь для изменения номера 5. Можно изменить значение переменной от 5 до 6, но Вы логически не вносите изменение в само значение.

  • Это - практически проблема: это создает много странных ситуаций. Это особенно плохо, если это изменяемо через интерфейс. Тогда можно начать изменять упакованные значения. Ick. Я видел много сообщений группы новостей, которые происходят из-за людей, пытающихся использовать изменяемые структуры и сталкивающийся с проблемами. Я видел очень странный пример LINQ, который перестал работать, потому что List<T>.Enumerator структура, например.

17
ответ дан Jon Skeet 27 November 2019 в 23:10
поделиться

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

, К сожалению, изменяемые структуры не играют хорошо с объектами и свойствами, слишком легко изменить копию stuct вместо самой структуры. Таким образом они не подходят для большей части Вашего кода.

P.S. Для предотвращения стоимости копирования изменяемых структур они обычно хранятся и передаются в массивах.

5
ответ дан Jonathan Allen 27 November 2019 в 23:10
поделиться

Техническая причина - то, что изменяемые структуры появляются , чтобы быть в состоянии сделать вещи, которые они на самом деле не делают. Начиная с семантики времени проектирования совпадают со ссылочными типами, это становится сбивающим с толку разработчиков. Этот код:

public void DoSomething(MySomething something)
{
    something.Property = 10;
}

Ведет себя вполне по-другому в зависимости от того, если MySomething struct или class. Мне это - принуждение, но не наиболее неопровержимый довод. Если Вы смотрите Объект Значения DDD , Вы видите соединение с тем, как нужно рассматривать структуры. Объект значения в DDD может быть лучше всего представлен как тип значения в .NET (и поэтому структура). Поскольку это не имеет никаких идентификационных данных, это не может измениться.

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

5
ответ дан Michael Meadows 27 November 2019 в 23:10
поделиться

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

семантика становится более простой при использовании неизменных структур, и Вы избегаете ловушек как это:

// a struct
struct Interval {
   int From { get; set; }
   int To { get; set; }
}

// create a list of structs
List<Interval> intervals = new List<Interval>();

// add a struct to the list
intervals.Add(new Interval());

// try to set the values of the struct
intervals[0].From = 10;
intervals[0].To = 20;

результат состоит в том, что структура в списке не изменяется вообще. Интервал выражения [0] копии значение структуры из списка, тогда Вы изменяете свойство временной ценности, но значение никогда не откладывается в списке.

Редактирование: Измененный пример для использования списка вместо массива.

4
ответ дан Guffa 27 November 2019 в 23:10
поделиться

Когда Вы копируете структуры вокруг Вас, копируют их содержание, поэтому если Вы измените скопированную версию, то "оригинал" не будет обновлен.

Это - источник для ошибок, с тех пор даже если Вы знаете, что попадаете в прерывание копирования структуры (только путем передачи его методу) и изменения копии.

Просто произошел со мной снова на прошлой неделе, сохранил меня часом, ища ошибку.

неизменные структуры Хранения предотвращает это...

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

2
ответ дан froh42 27 November 2019 в 23:10
поделиться

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

Поэтому, если, например, у Вас было свойство, которое возвратило структуру, изменив значение поля на той структуре, будет бесполезно, потому что метод get возвратился бы копия из структуры, а не ссылка на структуру. Я видел сделанный в коде, и часто трудно поймать.

при разработке структур для неизменности Вы помогаете программисту избежать этих ошибок.

2
ответ дан Randolpho 27 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

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