Размер структуры больше, чем сумма ее частей из-за того, что называется упаковкой. У конкретного процессора есть предпочтительный размер данных, с которым он работает. Большинство современных процессоров предпочитают размер, если 32 бит (4 байта). Доступ к памяти, когда данные находятся на этом типе границы, более эффективен, чем те, которые охватывают эту границу размера.
Например. Рассмотрим простую структуру:
struct myStruct
{
int a;
char b;
int c;
} data;
Если машина является 32-разрядной машиной, а данные выровнены по 32-битной границе, мы видим немедленную проблему (при отсутствии выравнивания структуры). В этом примере предположим, что данные структуры начинаются с адреса 1024 (0x400 - обратите внимание, что младшие 2 бита равны нулю, поэтому данные выравниваются с 32-разрядной границей). Доступ к data.a будет работать нормально, потому что он начинается на границе - 0x400. Доступ к data.b также будет работать нормально, поскольку он находится по адресу 0x404 - еще одна 32-разрядная граница. Но неуравновешенная структура поставит data.c по адресу 0x405. 4 байта данных.c находятся в 0x405, 0x406, 0x407, 0x408. На 32-битной машине система считывала data.c в течение одного цикла памяти, но получала бы только 3 из 4 байтов (четвертый байт находится на следующей границе). Таким образом, системе потребуется второй доступ к памяти для получения 4-го байта,
Теперь, если вместо того, чтобы поместить data.c по адресу 0x405, компилятор заполнил структуру на 3 байта и поместил данные. c по адресу 0x408, тогда системе потребуется всего 1 цикл, чтобы прочитать данные, сократив время доступа к этому элементу данных на 50%. Заполняет эффективность памяти для эффективности обработки. Учитывая, что компьютеры могут иметь огромные объемы памяти (много гигабайт), компиляторы считают, что своп (скорость над размером) является разумным.
К сожалению, эта проблема становится убийцей при попытке отправить структуры по сети или даже записать двоичные данные в двоичный файл. Прокладка, вставленная между элементами структуры или класса, может нарушить данные, отправленные в файл или сеть. Чтобы написать переносимый код (тот, который будет использоваться для нескольких разных компиляторов), вам, вероятно, придется обращаться к каждому элементу структуры отдельно, чтобы обеспечить надлежащую «упаковку».
С другой стороны, разные компиляторы имеют разные возможности для управления упаковкой структуры данных. Например, в Visual C / C ++ компилятор поддерживает команду #pragma pack. Это позволит вам настроить упаковку и выравнивание данных.
Например:
#pragma pack 1
struct MyStruct
{
int a;
char b;
int c;
short d;
} myData;
I = sizeof(myData);
Теперь я должен иметь длину 11. Без прагмы я мог бы быть чем угодно из 11 до 14 (а для некоторых систем - до 32), в зависимости от стандартной упаковки компилятора.
Вот мой список причин, почему код - позади может быть полезен взятый из моего собственного сообщения. Я уверен, что существует намного больше.
Да! Для некоторых представлений не должен быть нужен codebehind вообще.
Да! Это сосет для получения глупого .designer файла, созданного в дополнение к .cs файлу.
Да! Его довольно раздражающее для получения их мало + подписывается рядом с каждым представлением.
НО - Это действительно не что трудно НЕ поместить логику доступа к данным в код - позади.
Они являются несомненно НЕ злыми.
В конечном счете вопрос, который Вы задаете сами, является этим:
Делает этот код A) Процесса, хранят, получают, выполняют операции на или анализируют данные, или B) Справку для отображения данных?
Если ответ является A, он принадлежит Вашего контроллера. Если ответ является B, то он принадлежит представления.
Если B, это в конечном счете становится вопросом стиля. Если Вы переносите некоторые довольно долгие условные операции для попытки выяснить, отображаете ли Вы что-то пользователю, то Вы могли бы скрыть те условные операции в коде позади в Свойстве. Иначе кажется, что большинство людей отбрасывает код, встроенный к фронтэнду с помощью <% %> и <% = %> теги.
Первоначально, я вставил всю свою логику дисплея <% %> теги. Но недавно я взял к помещению чего-либо грязного (такого как длинное условное выражение) в моем коде позади для содержания моего XHML в чистоте. Прием здесь является дисциплиной - слишком заманчиво начать писать бизнес-логику в коде позади, который является точно, что Вы не должны делать в MVC.
При попытке переместить от традиционного ASP.NET до ASP.NET MVC, Вы могли бы избежать кода behinds, пока у Вас нет чувства для методов (хотя это все еще не мешает Вам вставить бизнес-логику <% %>.
Нет цели. Просто не используйте его за исключением установки модели
ViewPage<Model>
Посмотрите это сообщение в блоге для большего количества информации.
В этом Сообщении в блоге рабочий пример удаления кода позади. Единственная проблема, с которой я застреваю, состоит в том, что это не может установить пространства имен на классе.
codebehind обеспечивает часть строгого контроля типов, а также поддержки intellisense, что Вы входите в представление. Если Вы не заботитесь ни об одной из этих двух функций, можно удалить его.
Например, я обычно использую NVelocity ViewEngine, потому что это является чистым и довольно прямым.
Это - большой вопрос. Не делает MVC, существуют в среде ASP.NET, не используя определенный шаблон MVC.
Представление = aspx
Контроллер = aspx.cs (codebehind)
Модель = ПОСТЕПЕННО (Простые объекты C#/VB/.NET)
Я задаюсь вопросом, почему добавленная функциональность платформы MVC полезна. Я значительно работал с Java без обозначения даты MVC и Struts Java несколько лет назад (2001), и нашел, что понятия в MVC были решением для организации интернет-приложения и проблем разработки в то время, но затем нашел, что codebehind упростил понятие контроллера и был более быстрым, чтобы разработать и связаться с другими. Я уверен, что другие не соглашаются со мной, и я открыт для других идей. Самое большое значение, которое я вижу к MVC, является шаблоном фронтального контроллера для интернет-разработки, однократным источником для интернет-приложения. Но с другой стороны, тот шаблон довольно прост реализовать с текущими технологиями ASP.NET. Я услышал, что другие говорят, что Поблочное тестирование является обоснованием. Я могу понять, что также, мы использовали JUnit с нашей платформой MVC в 2001; но я не был убежден, что это упрощает тестирование для использования te MVC платформа.
Спасибо за чтение!