Вслепую преобразовывающие структуры к классам для сокрытия конструктора по умолчанию?

Перенесите их в содержание отделения с цветом фона, относился к нему, и имейте очищающееся отделение после 'столбцов'.

column a
column b

Обновленный для обращения к некоторым комментариям и моим собственным мыслям:

Этот метод работает, потому что по существу упрощение Вашей проблемы, в этом несколько 'oldskool' метод я вставил два столбца, сопровождаемые пустым элементом очистки, задание очищающегося элемента состоит в том, чтобы сказать родителя (с фоном), что это - то, где плавающее поведение заканчивается, это позволяет родителю по существу представлять 0 пикселей высоты в положении ясного, которое будет тем, что самый высокий монастырь плавающий элемент.

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

нужно отметить, что эта техника является 'oldskool', потому что лучший выбор состоит в том, чтобы инициировать это поведение расчета высоты с чем-то как clearfix или путем простого наличия переполнения: скрытый на родительском элементе.

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

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

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

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

column a
column a
column b

Вы видите пример этой техники на эти дачи и wilkins веб-сайт (см., что четыре горизонтальных центра внимания отображают конец страницы).

7
задан Jon Seigel 15 September 2009 в 21:05
поделиться

3 ответа

Для структуры вы разрабатываете тип, так что созданный по умолчанию экземпляр (все поля нулевые) является допустимым состоянием. Вы не [ не должны ] произвольно использовать struct вместо class без уважительной причины - нет ничего плохого в использовании неизменяемого ссылочного типа.

Мои предложения:

  • Убедитесь, что причина использования struct действительна ([настоящий] профилировщик обнаружил значительные проблемы с производительностью, возникающие из-за чрезмерного выделения памяти для очень легкого объекта).
  • Создайте тип так, чтобы созданный по умолчанию экземпляр является допустимым.
  • Если дизайн типа продиктован собственными ограничениями взаимодействия / COM, оберните функциональность и не используйте t выставить структуру вне оболочки (частный вложенный тип). Таким образом, вы можете легко задокументировать и проверить правильность использования требований ограниченного типа.
4
ответ дан 7 December 2019 в 12:23
поделиться

The reason for this is that a struct (an instance of System.ValueType) is treated specially by the CLR: it is initialized with all the fields being 0 (or default). You don't really even need to create one - just declare it. This is why default constructors are required.

You can get around this in two ways:

  1. Create a property like IsValid to indicate if it is a valid struct, like you indicate and
  2. in .Net 2.0 consider using Nullable to allow an uninitialized (null) struct.

Changing the struct to a class can have some very subtle consequences (in terms of memory usage and object identity which come up more in a multithreaded environment), and non-so-subtle but hard to debug NullReferenceExceptions for uninitialized objects.

1
ответ дан 7 December 2019 в 12:23
поделиться

Если вы все еще прошли модульные тесты если вы ошиблись, то либо это не имеет значения, либо ваши тесты не охватывают достаточное количество путей прохождения кода. Если между его вводом и получением теста «прошел / не прошел» слишком большой промежуток времени, это еще одна проблема. При наличии хороших быстрых тестов очень мало маленьких синтаксических гадостей.

Еще одна проблема. При наличии хороших быстрых тестов очень мало маленьких синтаксических гадостей.

Еще одна проблема. При наличии хороших быстрых тестов очень мало мелких синтаксических гадостей.

поля и элементы массива закрываются нулями. Это также обеспечивает более согласованное поведение между структурами и классами и отсутствие небезопасного кода. Это также позволяет платформе .NET не специализироваться на чем-то вроде new byte [1000] .

И это конструктор по умолчанию для структур, который требует .NET и заботится о себе: обнуляет все байты.

Теперь, чтобы справиться с этим, у вас есть несколько вариантов:

  • Добавить свойство Am-I-Initialized в структуру (например, HasValue в Nullable ).
  • Разрешить обнуленной структуре быть допустимым значением (например, 0 является допустимым значением для десятичной дроби).
0
ответ дан 7 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

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