Ответы пользователя по тегу C#
  • Использование Binding в WPF?

    Nipheris
    @Nipheris Куратор тега C#
    > При этом реализовать это без использования INotifyPropertyChanged.
    Вы хотя бы коротко причину указали, почему так нельзя делать. Почему меня интересует причина? Потому что если вы скажете "я не хочу забивать чистенькие модельные классы, которые используются в нескольких проектах всякими непонятными INotifyPropertyChanged" я вам отвечу "а и не нужно их трогать, для реализации INotifyPropertyChanged создаются ViewModel-объекты, которые и привязываются к контролам вместо модельных. Они и реализуют INPC, кроме того могут выставлять во вьюху некоторые свойства, которых нет в модельных объектах".
    А если вы скажете "я тут экспериментирую", то тогда можете запилить DependencyProperty у себя в привязываемом объекте, хотя это довольно странно. Но работать должно.
    Ответ написан
    Комментировать
  • Есть ли бесплатное решение для экспорта из MS Excel в HTML таблицы на C#?

    Nipheris
    @Nipheris Куратор тега C#
    Какие-то сложные советы вам дали тут). Если вам не нужно особо навороченное форматирование, берите EPPlus и читайте Экселевский файл. Все что прочли - сами отрендерите в html. А в идеале лучше сделать два выходных конвертера для отчета - один, который сохраняет в Excel, а другой - в HTML, чтобы не играть в испорченный телефон.
    Не надо ничего декомпилировать и затирать, если библиотека платная, на то есть причины, пока все будут так делать, никто не будет относиться к бизнесу из России как к адекватному.
    Ответ написан
    Комментировать
  • Как скомпилировать проект Visual Studio 2015 под VЫ2010?

    Nipheris
    @Nipheris Куратор тега C#
    1) убедиться, что все зависимости имеют версии для .net 4.0 или ниже
    2) переделать те места в коде, которые используют фичи C# > 4.0
    3) сменить версию целевого .net framework на 4.0 в свойствах проекта
    Ответ написан
    2 комментария
  • Зачем нужны делегаты в C#?

    Nipheris
    @Nipheris Куратор тега C#
    Дмитрий Ковальский прав, с предыдущего вопроса не прошло и недели.

    Если того что там есть вам мало, зайдем с практической стороны. Вы пишете для меня библиотеку и я прошу вас сделать мне функцию обхода графа по ПВШ/ПВГ, которая будет вызывать для каждой вершины некоторое действие (заранее неизвестное). Я хочу чтобы сделали именно обход, а что делать с каждой вершиной я хочу решать сам во время использования. В идеале, хотелось бы передавать вам это "действие" для каждой вершины как параметр в функцию обхода. Как вы решите эту задачу?
    Ответ написан
  • Какие существуют алгоритмы для раскрытия скобок в выражении?

    Nipheris
    @Nipheris Куратор тега C#
    Да распарсите это дело в AST и освобождайте от чего хотите. Можно, например, расчитать константные выражения (заменить (3 + 4) на 7). Скобки убрать еще проще - если у узла один потомок (выражение в скобках) - заменить текущий узел на потомка.
    Ответ написан
    Комментировать
  • Как добавить ссылку на библиотеку классов в проект, чтобы все ссылки из этой библиотеки автоматически добавились?

    Nipheris
    @Nipheris Куратор тега C#
    Вам не нужно добавлять ссылки на все транзитивные зависимости, что у вас есть.
    Ссылаться нужно только на те сборки, что вы непосредственно используете в коде ссылающейся сборки.
    На самом деле у вас проблема с процессом билда проекта. Решить ее можно разными способами, лучший вариант - плотно работать с NuGet и брать все зависимости оттуда. Т.к. с зависимостями у NuGet все в порядке, то очень удобно и свои библиотеки собирать как NuGet-пакеты, тогда указанных вами проблем просто не будет в принципе.
    Вообще, вон скоро DNX допилят, ее система проектов как раз была передалана для использования пакета как основной сущности для сборки и деплоя. Эту систему проектов вполне можно применять и для не-веб проектов, осталось только дождаться релиза.
    Ответ написан
    Комментировать
  • Почему методы нельзя передавать в функции без делегатов?

    Nipheris
    @Nipheris Куратор тега C#
    Делегаты - это форма существования функтора на платформе .NET. Почитайте про функтор, и поймете (наверное), зачем нужен делегат.

    Если коротко и грубо - вызвать напрямую можно всегда только конкретный метод, который будет четко известен еще на стадии компиляции. Если же вы пишете некий обобщенный алгоритм и заранее не знаете, какие КОНКРЕТНО методы у каких КОНКРЕТНО объектов будете вызывать - вам необходимо будет воспользоваться делегатом.
    Простейший пример - LINQ-методы. Метод фильтрации Where получает своим параметром функтор, который возвращает true или false, что значит - оставить элемент в коллекции или выкинуть его. В этом методе в цикле foreach вызывается переданный делегат для каждого элемента. Where понятия не имеет, какой конкретно метод (или лямбда-выражение) вы захотите подставить в качестве фильтрующего предиката.

    Другой пример - события. События в дотнете - это делегаты с урезанным публичным интерфейсом. Так как, к примеру, кнопка не знает о том, кто захочет подписаться на событие ее нажатия, она никак не может вызвать конкретные методы у конкретных объектов. Чтобы иметь возможность сообщать о своем нажатии, кнопка выставляет событие Click наружу, давая возможность записать туда конкретные методы для вызова.

    Кстати, делегат выполняет еще и функцию связывания: для нестатических методов делегат хранит еще и объект, для которого будет вызван instance-метод (т.е. связывает пару объект-метод).

    Таким образом,
    > Почему методы нельзя передавать в функции без делегатов?
    Делегаты - это и есть передача методов в функции.
    Ответ написан
    Комментировать
  • Какие файлы можно удалить из папки Debug?

    Nipheris
    @Nipheris Куратор тега C#
    Во-первых для дальнейшего использования программы вам нужно скомпилировать ее в конфигурации Release. Какие дефолтовые настройки стоят для каждой из конфигураций можно посмотреть в файле проекта.

    *.pdb это не странные файлы, а отладочная информация, если я не ошибаюсь, в Release конфигурации они по-дефолту не создаются. Если все таки они есть - можете спокойно их удалять.
    .vshost.exe.* - это файлы помощника студийного дебаггера. Для самостоятельной работы программы они также не нужны.
    .exe.config - потребность в этом файле зависит от того, что в нем написано. Если не понимаете, что там - лучше оставить его и поставлять с программой (там, например, могут быть редиректы версий сборок).
    *.xml - если это не ваши xml-ки, то обычно это автосгенеренная документация. Если у вас приложение, а не библиотека, можете убрать их из поставки.

    Насчет остального должны знать сами. А вообще, изучайте инструмент, которым пользуетесь, если уже дошли до этапа поставки приложения (если конечно у вас не лабораторка там :) )
    Ответ написан
    Комментировать
  • Как послать http запрос через OpenVpn c#?

    Nipheris
    @Nipheris Куратор тега C#
    Армянское Радио абсолютно прав, если у вас маршруты настроены как надо, то нужный траф и так пойдет по vpn, а если не как надо - то их надо настроить. Это обычно делается независимо от приложений, которые будут общаться по сети, это делает администратор либо в конфиге openvpn, чтобы последний отдавал нужные роуты клиенту при подключении, либо вручную в каком-нибудь батнике, который юзер запускает после подключения.

    Отдельный вопрос, если вы хотите управлять маршрутами из вашей программы. Это возможно, но я сильно не уверен, что вам это нужно. Обычно такое нужно если у вас много различных конфигураций vpn и вам нужно по какому-нибудь хитрому алгоритму без участия юзера выбирать, по какому vpn-каналу отправлять трафик.
    Ответ написан
    2 комментария
  • Плохо ли если класс самодостаточен, в плане получения каких то данных необходимых для его полноценной работы?

    Nipheris
    @Nipheris Куратор тега C#
    Зависит от того, какую ответственность вы "отдаете" в класс. Если это так называемый "value object", т.е. некий неизменяемый композит, то лучше ему в конструктор передать сразу готовые значения. Если же это самостоятельный объект с внятным жизненным циклом и определенной ответственностью - тогда конечно логично чтобы он сам брал данные из репозитория.
    Вам нужно почитать про Dependency Injection - это как раз та "середина" между двумя альтернативами, что вы предложили в виде фрагментов кода. Обращаться к глобальном объекту репозитория - это также антипаттерн. Гораздо лучший вариант - это когда объекту при создании передается (!) репозиторий в конструкторе, а объект уже САМ делает выборки необходимых данных. Это как раз и есть удачный вариант спуска от общего к частному. Плюс, вся логика сосредоточена в классе - я всегда могу добавить новую Модель (если следовать вашим примерам), которая также берет репозиторий, но вытаскивает из него уже ДРУГИЕ сведения.
    Вот стандартный туториал, в котором роль вашего "класса" выполняет ASP.NET-контроллер, и он получает репозиторий в конструкторе: www.asp.net/web-api/overview/advanced/dependency-i...

    Вообще принцип всегда такой - если есть некоторая переменная или значение, то есть N точек, из которых можно получить к ней доступ. Чем меньше этих точек - и при этом вы можете без извращений реализовать нужную вам бизнес-логику - тем лучше. И чем ближе в коде эти точки расположены друг к другу - тем лучше. Всегда удобнее работать с кодом, когда данные конкретной сущности и логика их обработки умещаются хотя бы в одном файле.
    Ответ написан
    3 комментария
  • Использовать ли триггеры совместно с ORM?

    Nipheris
    @Nipheris Куратор тега C#
    Конечно, по своей природе ORM призваны помочь держать всю бизнес-логику в самом приложении, а не в базе данных. В целом, этот подход лучше масштабируется, и, в придачу, позволяет меньшими усилиями сменить СУБД в случае сильного изменения требований к проекту.
    Однако есть ряд задач, где триггеры вполне могут работать в паре с ORM-библиотекой. Это как раз таки НЕ бизнес-логика, а скорее support-логика. Сходу могу вспомнить следующее:
    - поддержка целостности денормализованных данных - пересчет в триггере "избыточных" значений, например сумм, средних и т.д. (т.е. таких, которые всегда можно посчитать и которые хранят исключительно для повышения производительности запросов). В этом случае даже если кто-то захочет поработать с БД не пользуясь O/R маппингом (например, выполнить пару выборок для аналитики), не произойдет рассогласования данных;
    - поддержка хронологических и аудит-таблиц; это также логика, в общем-то не зависящая от предметной области, и зачастую она НЕ мапается в ORM-ке (особенно в случае аудит-таблиц - если с историей приложение еще может работать, то аудит как правило нужен лишь в исключительных случаях - повреждение данных, проблемы с безопасностью БД и т.д. - и запросы к таким таблицам делаются вручную в ходе исследования проблемы).
    В EF с помощью этого атрибута вы можете указывать, что значение свойства сущности генерируется самой БД и EF не должна участвовать в его обновлении.
    Ответ написан
    Комментировать
  • Стоит ли использовать триггеры в sqlite?

    Nipheris
    @Nipheris Куратор тега C#
    Ввиду того, что sqlite - встраиваемая СУБД, не вижу особого смысла использовать триггеры в ней. Разве что у вас есть денормализованные данные и вы хотите поддерживать их согласованность с помощью триггеров - тогда вариант. А для других случаев триггеры не особо приветствуются и в больших СУБД.
    Ответ написан
  • Как передавать данные между ViewModel?

    Nipheris
    @Nipheris Куратор тега C#
    Почему возникла такая необходимость? Как соотносятся эти две ViewModel друг с другом?
    Я обычно использую тот же PropertyChanged, чтобы слушать изменения свойств одной viewmodel в другой (например, если одна viewmodel для элемента заказа, а другая - для вывода суммы заказа). Это для случая, когда вьюхи связаны друг с другом.
    Если вьюхи совсем никакого отношения не имеют друг к другу, то может тогда через уровень данных это сделать (репозиторий, например)? У нас в проекте репозиторий на клиенте хранит DTO, которые возвращает веб-сервис. Когда содержимое этих объектов обновляется (они регулярно перезапрашиваются + перезапрашиваются после PUT/PATCH операций), репозиторий генерит ивент, на который подписаны вьюхи. Вьюхи уже сами определяют, что изменилось, и, в свою очередь, генерят PropertyChanged.

    Если это все не подходит, опишите ситуацию подробно, сейчас только понятно, что у вас есть две ViewModel, и больше ничего.
    Ответ написан
  • Как правильно отобразить большое количество Ellipse на Canvas (WPF)?

    Nipheris
    @Nipheris Куратор тега C#
    Для начала стоит подумать, как можно создать эллипсы однократно, а не каждые 100 миллисекунд. Графические объекты в WPF довольно тяжелые, и создавать их лучше один раз, и затем повторно использовать.
    Ответ написан
    2 комментария
  • Влияет ли using в C# на производительность?

    Nipheris
    @Nipheris Куратор тега C#
    Практическая польза - в читаемости кода. Когда начинаешь читать исходник, просматриваешь юзинги и понимаешь, какими сущностями тут собираются оперировать.

    А касаемо производительности - вы путаете компиляцию и интерпретацию, а также using как импорт имен и include как вставку содержимого другого файла.
    Компилятор C# разберется с используемыми именами еще на стадии компиляции, поэтому он либо все их однозначно сопоставит с полными именами, либо выдаст ошибку. Конечно, когда импортируется меньше имен, компиляция будет немного быстрее, но это а) не влияет на производительность скомпилированной сборки; б) куда менее важно, чем читабельность кода, которая пострадает первой от 30-ти using-ов в одном файле.

    Кстати, большое количество using это еще и сигнал о необходимости разбить исходный код на несколько файлов.
    Ответ написан
    Комментировать
  • Как работать с socket.io сервером в c# приложении?

    Nipheris
    @Nipheris Куратор тега C#
    Protocol Buffers?
    На Ноду: https://www.npmjs.com/package/protobufjs
    На дотнет: www.nuget.org/packages/protobuf-net (не уверен, что этот пакет - лучший вариант, но вроде самый популярный)
    Ответ написан
  • На чем лучше писать программы под Windows?

    Nipheris
    @Nipheris Куратор тега C#
    Сейчас Шарп с WPF-ом и C++ с Qt-ом примерно равны по возможностям. Изначально WPF конечно был более продвинутым, но с момента его появления прошло уже много времени, а развивается он слабо, поэтому Qt его "догнал".
    Но для большинства разработчиков все упирается в язык. Не все хотят учить второй язык для изучения технологии, не все хотят учить C++.
    Ответ написан
    Комментировать
  • Как добавить тэги к картинке с помощью FreeImage?

    Nipheris
    @Nipheris Куратор тега C#
    попробуйте

    MetadataTag tag = new MetadataTag(FREE_IMAGE_MDMODEL.FIMD_COMMENTS);
    tag.Key = "new Tag";
    tag.Value = "foobar";
    FreeImage.SetMetadata(FREE_IMAGE_MDMODEL.FIMD_COMMENTS, dib, "new Tag", tag);
    FreeImage.SaveEx(dib, ofd.FileName);


    Есть соображение, что MetadataTag, который вам отдала либа, не предназначен для изменения "на ходу" и либа не следит за тем, что вы записали в существующий тег что-то новое. Скорее всего new ImageMetadata делает "снимок" метаданных, которым затем можно пользоваться независимо от картинки (нужно точнее - см. документацию). Поэтому попробуйте ставить тег явно с помощью SetMetadata.
    Ответ написан
  • Что делает компилятор при передаче объекта по ссылке с явным преобразованием (ref(SomeClass)anotherSomeClass)?

    Nipheris
    @Nipheris Куратор тега C#
    > "ref or out argument must be an assignable variable"
    вам же пишут - то, что вы передаете не является переменной (ну точнее, переменной, в которую можно что-то присвоить). Ссылка из переменной pet, скастованная к Animal - это уже "значение", а не "переменная". Вы можете запихнуть что-либо в pet, но не можете в (Animal)pet - т.к. это не переменная, а выражение, значение которого можно вычислить.
    Как уже отметили выше, ref и out требуют передачи ПЕРЕМЕННОЙ в которую можно (и нужно в случае out) что-либо записать. И не имеет значения - ссылочный тип имеет переменная или тип-значение. Если вы передадите ref Dog, то в этот параметр можно будет записать ссылку на объект Dog, если передадите ref int - сюда можно будет записать int.
    Ответ написан
    Комментировать
  • Какии есть аналоги елемента WebBrowser для с#?

    Nipheris
    @Nipheris Куратор тега C#
    Хромиум: CefSharp, Awesomium
    Ответ написан
    Комментировать