• Есть ли такой реализованный список на C#?

    @Maa-Kut
    Как вариант, можно использовать MemoryCache: stackoverflow.com/questions/7435832/c-sharp-list-w...
    Ответ написан
    Комментировать
  • На каком языке/технологии можно без танцев с бубном создать простенькое GUI приложение для работы с docx?

    @WayMax
    Среда разработки - Visual Studio (есть бесплатная редакция Community)
    Язык - C#
    Графическая библиотека - WinForm
    COM-объект для работы с Вордом - Microsoft Word 14.0 Object Library (где 14 - это 2010 Ворд)
    Ответ написан
    Комментировать
  • Как перегрузить оператор присваивания, c#?

    Nipheris
    @Nipheris Куратор тега C#
    С точки зрения C# вы хотите не того, что нужно. В отличие от C++, где перегрузка операций даёт возможность сформировать индивидуальное поведение для каждого пользовательского типа, в C# для вас построили два основных стереотипа поведения - тип-ссылка и тип-значение - и предлагают выбрать один из них.

    Вам нужно переформулировать задачу в более общую, и понять, что вы хотите сделать на самом деле, и для чего вам понадобилось переопределение присваивания. Судя по имени класса (Person), вы явно делаете с ним что-то не то.
    Ответ написан
    3 комментария
  • Http и https в файлах sitemap.xml. Какие правила?

    @sunrails
    все URL-адреса, перечисленные в файле Sitemap, должны использовать один и тот же протокол (в данном случае — HTTP) и должны быть размещены на том же хосте, что и файл Sitemap. Например, если файл Sitemap расположен по адресу www.primer.ru/sitemap.xml, в нем могут быть указаны URL-адреса из субдомена subdomen.primer.ru.

    Источник www.sitemaps.org/ru/protocol.html#location
    Остальная инфа по урлам там же.
    Ответ написан
    Комментировать
  • Как работает C#?

    Nipheris
    @Nipheris Куратор тега C#
    А откуда берётся этот MSIL? Куда компилируются .cs?

    cs компилируются компилятором. Есть стандартный csc, поставляется вместе с .net framework (НЕ со студией). Это "классический" компилятор от MS, написан на C++, с закрытым исходным кодом. Такой же есть и для Visual Basic. Кроме них есть еще Roslyn-компиляторы C# и VB, они open-source, их главное отличие в том, что они сами написаны на управляемых языках. Это значит, что у вас есть compiler-as-a-service. Это, в свою очередь, значит, что если вы хотите написать тулзу, обрабатывающую тем или иным образом исходный код, например на C#, вам не нужно самому писать парсер/компилятор, вы можете подключить модули Roslyn-компилятора и пользоваться ТЕМ ЖЕ компилятором (лексером/парсером/etc), что и используется непосредственно при сборке приложения. С классическим компилятором так не получится, он представляет из себя черный ящик: cs на входе, сборка на выходе.

    Далее будем считать, что не учитываем в рассуждениях технологию .net native.
    в каком моменте тогда работает виртуальная машина

    она работает в момент запуска exe.
    почему мы получаем на выходе .exe

    в этом вопросе часто возникает путаница. Дело в том, что дотнетовские exe и dll - это т.н. сборки (assemblies), и они содержат метаданные и MSIL (!) исполняемый код. То, что у них расширения exe и dll - это потому, что MS для повышения совместимости и удобства использования, упаковала их в формат PE. Чтобы .net приложения можно было запускать также, как и нативные. НО реально в exe-файле есть только небольшой загрузчик, который запускает CLR, просит загрузить текущий файл как дотнет-сборку и передать управление на метод-точку входа. Почитайте про сборки в хорошей книге, и скачайте dotPeek, посмотрите что внутри дотнетовского exe. Это совсем не то, что в "обычном", нативном exe.

    В мире C# существуют также такие понятия как .NET, Mono, Roslyn и т.д., можете ли вы структурированно разъяснить их смысл?

    .NET это название и бренд платформы, .NET Framework, а теперь и .NET Core - реализации платформы от MS, Mono - open-source реализация НЕ от MS. .NET FW работает только на винде, .NET Core и Mono и на других платформах. Про Roslyn уже упомянул.
    Ответ написан
    Комментировать
  • Почему не стоит вызывать методы в конструкторе?

    EugeneP2
    @EugeneP2
    Java Dev
    Почему нельзя? очень даже можно, только этот метод должен быть private. Не рекомендуют вызывать public и protected методы. Если класс не финальный, открытые методы могут быть переопределены в подклассе, и тогда в вашем конструкторе будут вызываться не ваши методы, а переопределенные, что может сломать логику работы вашего класса и привести к ошибке.
    Ответ написан
    Комментировать
  • Изучение c# путем создания игр, стоит ли идти по такому пути и какие есть варианты?

    AlexXYZ
    @AlexXYZ
    O Keep Clear O
    Программирование происходит в голове. Компьютер всего лишь средство выражения, так же как и windows forms. Приучите себя писать не только код, но и документацию. В общем программирование игр на игру совсем не похоже и обрастает кучей допработ, которые делать не всегда хочется, потому что а) я это миллион раз видел у других и б) я думал это должно работать само, а оно во как вышло, что мне нужно сделать то, что пользователи будут стремиться "пропустить" как назойливое препятствие на пути к экшену.
    Из маленьких наблюдений за профессией - просто делайте по одному два открытия/инсайта для себя, но каждый день. Сохраняйте темп, продолжайте бежать. :)
    Ответ написан
    Комментировать
  • Инкапсуляция, отсутствие её - проблема?

    Отсутсвие инкапсуляции в данном контексте, очевидно, в первую очередь означает излишне обширный публичный интерфейс. А публичный интерфейс разработчик фреймворка просто так менять не может - нужно соблюдать обратную совместимость. Соответственно, чем больше у нас торчит наружу ушей, тем сложнее поддерживать и развивать фреймворк. Достаточно посмотреть на код Битрикса, например, чтобы увидеть к чему это приводит.
    Думаю, вопрос был именно об этом.
    Ответ написан
    Комментировать
  • Как отловить ошибку приведения даты в C#?

    @mletov
    И еще в Web.Config просмотрите, добавьте строку что-то типа такой (значение culture выберите сами), у меня такое было, когда на локалке стояла русская винда, на сервере английская. Причем изменение языковых настроек самой машины не помогали, а изменение Web.config сработало.

    <globalization uiCulture="ru" culture="ru-RU" />
    Ответ написан
    Комментировать
  • Как отловить ошибку приведения даты в C#?

    GavriKos
    @GavriKos
    Формат даты зависит от региональных настроек конкретной машины.
    Ответ написан
    4 комментария
  • Как отловить ошибку приведения даты в C#?

    @Beltoev
    Живу в своё удовольствие
    Не пробовали дату в стандартном формате писать? Как бы всегда избавляет от проблем такого рода
    Created >= '19.10.2015 0:00:00' AND Created <= '26.10.2015 0:00:00'

    UPD:
    Для тех, кто в подобной ситуации, но не дошёл до комментариев:
    TRY_PARSE('26/10/2015 00:00:00' AS DATETIME USING 'ru-ru')
    Ответ написан
  • Как быть с моделями в ASP.NET MVC?

    Nipheris
    @Nipheris Куратор тега C#
    Короткий ответ на ваш вопрос: Code First, Mappings.
    Длинный ответ: вам действительно нужно разобраться, что называть моделью.
    Лично я убежден, что модельные классы, представляющие из себя DTO - это по-любому anemic data model, а анемичная модель - это в 90% случаев нехорошо. Поэтому, у вас два варианта: отказаться от генерации "по картинке" в пользу Code First (рекомендую), либо пойти по пути Евгений Колегов - сказать, что EF-овская модель - это и не модель, а так, граф примитивных объектов с get/set-ами, а настоящая модель - вот она, обертка над ними, с реальной бизнес-логикой и т.д.

    > По сути эти модели - это DTO то есть просто объекты содержащие только данные. А как быть с логикой обработки этих данных? Она должна быть в контроллерах что ли?
    Ну это тот же самый вопрос: нормальная модель должна содержать логику.
    > в Asp.net mvc должны быть "тонкими", то есть не содержать особой логики.
    В контроллере - минимум, там логика специфичная не для бизнес-процессов, а для процесса работы самого web api, т.е. определение того, что нужно сделать с бизнес-сущностями, чтобы удовлетворить запрос.
    > Или надо писать еще и дополнительные контроллеры в которых будет сосредоточена логика работы с моделями?
    не стоит, думаю в вашей задаче такой дополнительный слой совершенно излишен.

    Резюме: модель вполне может и должна следовать обычным правилам ООП, известным уже лет 40 - данные и логика их обработки должны быть рядом друг с другом. Отделение бизнес-логики отдельно от модели - это такой своеобразный фетиш разбиения приложения на много-много слоев (на самом деле выделение веб-сервиса с четко определенным api - уже неплохой слой). Если вы чувствуете себя некомфортно от того, что у вас модель без логики, и не можете ее туда поместить - нужно менять инстурменты или вариант их использования. Первые версии EF - это первый блин комом, отсутствие поддержки Code First и нормальных маппингов считалось серьезной проблемой. Сейчас это уже давно в прошлом.
    Бонусные варианты, если вы не связаны ограничениями:
    1) генерация ТАБЛИЦ ПО КЛАССАМ, а не маппинг классов на таблицы: для кого-то этот вариант очень даже подходит, плюс упрощает менеджмент схемой БД: у вас всегда есть один источник сведений о схеме данных - это ваша модель. По ней можно всегда получить текущую SQL-схему;
    2) если вам нравится отдельно следить за объектной моделью и за SQL (я вот именно так люблю), можете посмотреть и на другие ORM - NHibernate вполне себе торт. Сейчас конечно EF более популярна, ибо стандартная и раскрученная, но я 4 года назад выбрал NH для своего проекта из-за отсутствия неприятных ограничений (например, NH умеет мапать даже на приватное поле, а EF тогда не умел) и из-за наличия вменяемых механизмов маппинга.
    Ответ написан
    Комментировать
  • LINQ to Entity Framework — базовый класс для работы с БД? (C#)?

    Paulskit правильно сказал, что автор пытается написать паттерн Repository. А Lam правильно написал как сделать GenericRepository.
    Пример обобщённого репозитория, кстати, есть здесь www.asp.net/mvc/tutorials/getting-started-with-ef-...
    Я в своём первом проекте его использовал. На самом деле, лично в моём понимании, это не очень хорошо.
    Сейчас ваш метод возвращает объект по его ID. Предвижу, что следующим методом будет получение группы объектов и возвращение IQueryable. Такой подход невольно заставляет писать код выборки объектов где-нибудь (в контроллере, в слое сервиса), но не в репозитории, что приводит к путанице. На мой взляд, лучше делать не обобщённый репозиторий, а уникальный репозиторий для каждой сущности, необходимой для работы программы.
    Предположим, что у вас есть класс BlogPost. Вы хотите иметь возможность загружать этот объект по ID, загружать вообще все эти объекты в память, загружать только часть этих объектов в память, загружать объекты с определённым условием и т.д. Для этого мы можете создать BlogPostRepository и написать в нём эти методы. Тогда ваша программа станет логичнее и понятнее. При работе с блогами вам не нужно будет каждый объявлять обобщённый репозиторий и городить поверх него запросы типа
    var repository = new GenericRepository<BlogPost>();
    var blogs = repository.GetAll().Skip(100).Take(10).OrderByDescending(c => c.Created);

    Ну или как-то так (код примерный). Причём такие конструкции придётся городить в любом месте, где понадобится получить 10 последних блогов.
    Проще сделать не обобщённый репозиторий, а специальный репозиторий для нужного объекта, тогда получится примерно так:
    var repository = new BlogPostRepository();
    var blogs = repository.GetTenTopBlogs();

    В методе GetTenTopBlogs, соответственно, инкапсулируете логику выборки последних 10 блогов. Разумеется GetTenTopBlogs может иметь параметры (например количество блогов, которые нужно получить). Тут уже всё зависит от задач. И GetTopBlogs Должен возвращать IEnumerable, чтобы вызывающий код уже оперировал с сущностями в памяти, а не строил новые запросы к БД.
    В целом код становится лаконичнее. Вам не нужно теперь каждый раз, чтобы что-то получить, объявлять обощённый репозиторий, тащить из него Queryable коллекцию и делать на ней выборку. Вы только вызываете метод и уже получаете результат. Теперь в вызывающих классах нет логики выборки.
    Примерно так... :)
    У Александра Бындю есть хорошие статьи на эту тему.
    blog.byndyu.ru/2011/08/repository.html

    Кстати, только заметил. Насколько я могу судить, репозиторий не должен знать об объекте DbContext. Это нужно для того, чтобы реализовать паттерн Unit Of Work. Представьте, что вы хотите совершить несколько транзакий (операций с репозиторием). Причём если хотя бы одна из них прошла неудачно, нужно всё откатить обратно. Предположим, что вы хотите сохранить 3 разных сущности в базу. Для этого вы написали свой обобщённый GenericRepository и объявили три переменных для каждой сущности. Причём у вас в этом GenericRepository будет функция Save (иначе как вы будете сохранять свои сущности).
    Выходит, что каждый экземпляр класса GenericRepository будет содержать свою копию DbContext, и каждый раз после добавления сущности вы будете сохранять базу.
    Единой транзакции не получится.
    Чтобы получилась, нужно передавать DbContext в конструктор репозитория и ничего не сохранять в репозиториях. Т.е. вы где-то объявляете свой контекст, затем создаёте три репозитория и в каждый из них передаёте этот контекст. Делаете все операции, после чего сохраняете контекст в вызыывающем класе. Получается UoW. Хотя DbContext - это уже UnitOfWork.
    По ссылке выше это тоже обсуждается (смотрите там рекоммендованные ссылки).

    p.s. Paulskit дал хорошую ссылку, я как раз её пытался найти.
    Lam тоже говорит правильно о том, что общие методы можно, конечно, вынести в обобщённый репозиторий. Только зачастую там этих методов - 1-2, а доброй трети сущностей эти методы вообще не понадобятся, так что я бы не стал делать лишнюю иерархию только для того, чтобы всем репозиториям назначить базовый класс.
    Ответ написан
    Комментировать