Ответы пользователя по тегу .NET
  • Event - это value или reference type в C#?

    Nipheris
    @Nipheris Куратор тега C#
    1) Ивент - это тот же делегат, только с урезанным интерфейсом для внешних обращений (за пределами класса). В public интерфейс класса от ивента попадают только операции добавления и удаления хэндлера. Вы можете инвокнуть делегат, представляющий ивент, изнутри класса, но не сможете это сделать снаружи класса (т.е., например так: button1.Clicked(new EventArgs(...)) );
    2) Раз мы выяснили, что ивент это делегат (мультикаст, причем), то идем и убеждаемся в том, что делегат это reference-тип: https://msdn.microsoft.com/en-us/library/system.mu...

    Экзамен на носу? Успешной сдачи!
    Ответ написан
    Комментировать
  • Проблемы с изучением C# (разные операционные системы, сервера баз данных и версии фреймворка)?

    Nipheris
    @Nipheris Куратор тега C#
    Курсирует инфа, что программа написанная на VS 2015 не запуститься на XP и что под XP максимум NET 4.5 можно установить

    Не знаю, где она у вас там "курсирует", но под XP максимум устанавливается фреймворк 4.0. Это все на MSDN находится без проблем, тестируется на виртуалке для надежности.

    а современный 6-ой C# уже под версию 4.6

    Сейчас я вам фокус покажу. Создаем консольный проект на C#. Используем пару фич из C# 6.0:
    namespace ConsoleApplication1
    {
    	class A
    	{
    		public int Test { get; set; } = 0;
    	}
    
    	class Program
    	{
    		static void Main(string[] args)
    		{
    			Console.WriteLine(nameof(Main));
    		}
    	}
    }


    Далее ретаргетим проект на .Net Framework 2.0:
    67e06871538647a4a5e956d452298976.png
    Удаляем сборки и using-и, недоступные во втором фреймворке (для второго это LINQ и TPL).
    Компилим, запускаем, и радуемся.

    Выводы:
    1) под XP доступны все дотнеты до 4.0 включительно
    2) версия фреймворка определяет фичи, доступные в "стандартной библиотеке", а не фичи языка. Замечу, что в 4.0 есть и LINQ и Tasks;
    3) разрядность имеет значение, если ваша программа или зависимые библиотеки компилятся НЕ в AnyCPU. Иначе разницы нет.
    4) с SQL сервером вообще отдельная история, не знаю при чем тут вообще .Net. Это у вас наверное мнение такое о стеке MS, что у него все туго вместе завязано и не развязывается. Это не так. Меньше слушайте бестолковых коллег, больше читайте MSDN. Поверьте, после 3-х и более лет разработки под дотнет вы все вышеуказанное расскажете наизусть даже если вас разбудить в 3 часа ночи.

    корпоративное приложение тогда нужно использовать сервер БД в локальной сети

    конечно, Express версия это вам для примера, чтобы можно было создать и запустить, например, веб-приложение. Почитайте про ADO.NET, это подсистема работы с реляционными СУБД, и все поймете.
    Ответ написан
    2 комментария
  • Почему TFS build не подставляет значение макроса $(VSInstallDir)?

    В свойствах билдплана можно указывать дополнительные аргументы для передачи MSBuild-у при запуске сборки.
    Process->Build process parameters->5. Advances->MSBuild arguments
    С помощью аргументов можно задать значения MSBuild-пропертей таким образом:
    /p:ИмяСвойства=Значение
    Я думаю и VSInstallDir задать получится. Возможно значение этого свойства подтягивается из переменных окружения, а на билдсервере они не заданы.
    Ответ написан
  • Что должен знать junior С#?

    Nipheris
    @Nipheris Куратор тега C#
    корпоративные приложения

    Поучите голый ADO.NET и какую-нибудь ORM-ку, да хотя бы EF. Еще можете хотя бы начать ASP.NET, вероятность попасть на него на первой работе достаточно высокая.

    финансы, банковская сфера

    Подтяните теорию по реляционным БД. Ведь какие финансы без транзакций!) Вы должны хотя бы знать о таких понятиях, как изоляция транзакций, представлять в общих чертах как на SQL можно сделать какую-нибудь выборку с агренированием. Никто конечно в здравом уме не даст джуниору непосредственный доступ к сколь-либо значащим данным, отражающим реальные денежные балансы, но ваша осведомленность пойдет вам на пользу, иначе рискуете клепать интерфейсики ближайшие несколько лет. А, ну да, выясните, почему нельзя вот так считать проценты по кредиту:
    float interestRate = 0.13 // ставка
    float interestSum = interestRate * sum;


    геймдев

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

    И еще для всех направлений: станьте более-менее самостоятельным в вопросах деплоя. Вы должны в общих чертах представлять, что находится внутри дотнетовской сборки, как работает версионность и что может пойти не так. Ну и про NuGet я надеюсь вы уже знаете.
    Ответ написан
    1 комментарий
  • Потерялись все ссылки при переносе проекта на другой комп C# .NET?

    Nipheris
    @Nipheris Куратор тега C#
    Еще лучшее решение - использовать NuGet, насколько возможно. Если всех нужных пакетов в нем нет - тогда можно пути записать в переменную вроде $(LibraryRoot), и подключать props-файл к проекту - тогда этот файл может быть на каждом компе свой.
    Ответ написан
    Комментировать
  • Почему происходит зависание формы и таймеров windwos forms?

    Nipheris
    @Nipheris Куратор тега C#
    Работать с UI, то есть с формами и контролами, из потока, НЕ породившего эту форму/контрол - очень плохая практика, которая рано или поздно приводит к таким проблемам, как ваша. Кроме того, она еще и усложняет отладку.

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

    Даже если проблема не исчезнет, вам будет проще определить, где происходит зависание. Сейчас это может быть по куче различных причин. Повторюсь: то, что вы лочите pictureBox это не решение проблемы - в WinAPI НЕЛЬЗЯ работать с UI напрямую из другого потока, а WinForms это не более чем обертка над стандартными контролами.
    Ответ написан
    Комментировать
  • Как захостить WCF на консоль так, чтоб служба была доступна в локальной сети?

    Nipheris
    @Nipheris Куратор тега C#
    консольное (WinForms)

    Это должно быть через слеш.

    99% что проблема в том, что ваша служба слушает на локалхосте, а не на реальном интерфейсе или на 0.0.0.0. В зависимости от того, как вы ее хостите, где-то (в коде или конфиге) у вас должен быть указан адрес для прослушивания. Если он 127.0.0.1 или localhost - вам нужно заменить его на адрес сетевого интерфейса, где запущена служба. Или слушать на всех интерфейсах сразу, тогда урл будет вида http://+:порт/ - причем если у вас http, то для запуска вам понадобятся права администратора (т.к. сервис будет регаться в системном обработчике http.sys).

    По большому счету вопрос не про WCF, а про запуск сетевой службы в принципе. Апач или IIS вам тоже ничего не будут отвечать по сети, если попросить их слушать на localhost.
    Ответ написан
    6 комментариев
  • Какая разница в асинхронных методах?

    Nipheris
    @Nipheris Куратор тега C#
    Разница в том, что await можно использовать только в async-методе, и его использование подразумевает, что компилятор превратит метод в сопрограмму, и в том месте, где стоит await, его выполнение можно будет приостановить и переключиться на что-то еще.

    Использование Result остановит ваш поток до тех пор, пока таск не завершится и не вернет результат. Но Result можно использовать и в обыкновенном методе, не только async (в async методе его использовать абсолютно бессмысленно).

    Кроме того, использование Result влечет за собой неочевидные эффекты в виде возможности дедлоков и усложняет обработку исключений (т.к. Result всегда кидает AggreagteException, в который оборачивается исключение, брошенное внутри таска), подробнее смотрите тут stackoverflow.com/questions/24623120/await-on-a-co...

    Как первый ответ отвечает на ваш вопрос я не понимаю)
    Ответ написан
    6 комментариев
  • Оптимизация графики?

    Nipheris
    @Nipheris Куратор тега C#
    А не будет ли GDI быстрее GDI+?

    GDI+ будет медленнее только при включенном сглаживании. В остальном их отличия не принципиальны.

    что без directx и opengl не добиться нормальной прорисовки на форме

    Смотря что вы понимаете под нормальной прорисовкой, и сколько у вас на форме контролов. Конечно, сегодня графику стараются рисовить на железе, собственно отсюда и новые стандарты качества. А вообще, Артём прав - что вы хотите от managed-обертки над GDI/GDI+ и стандартными виндовыми контролами, коей и является WinForms.
    Ответ написан
    Комментировать
  • Актуален ли сейчас WPF?

    Nipheris
    @Nipheris Куратор тега C#
    разработка остановилась 5 лет назад и тому подобное

    Да, есть некоторый застой, основные силы переброшены на .net core и asp.net

    Правда ли, что WPF ждет судьба WinForms?

    Что конкретно вы имеете в виду под "судьбой WinForms"?

    Есть ли альтернатива WPF?

    Под .Net нету, под WinRT есть аналогичная подсистема, во многом скопированная с WPF, вообще под десктоп есть еще Qt, но это C++ (если не считать биндингов на другие языки)

    Что сейчас Microsoft предлагает для разработки GUI?

    Universal Windows Platform для Windows 10 - их основное направление, для классического десктопа - ничего нового.

    что WPF уходит в прошлое

    Альтернативы под .net нету, никуда он уходить не может (не все пока хотят связываться с Metro и UWP приложениями).
    Ответ написан
    Комментировать
  • Как показать сообщение после завершения всех webClient.DownloadFileAsync?

    Nipheris
    @Nipheris Куратор тега C#
    Почему бы в download_completed не уменьшать счетчик оставшихся загрузок и дожидаться, пока не он станет равным нулю?
    Ответ написан
    3 комментария
  • Стиль оформления кода в .NET приложениях. Встречался ли вам ад в коде?

    Nipheris
    @Nipheris Куратор тега C#
    Для меня очевидно, что это писали бывшие разработчики на C/C++. Это древняя нотация, многие называют ее венгерской, только тут какой-то извращенный вариант (надо сказать, что и саму венгерку правильно применяли единицы в свое время, большинство не понимало до конца ее смысла). Сейчас так не пишут и на самих плюсах, для шарпа же это моветон. Выдает нотацию n перед именем индекса (это значит именно "индекс", а не int, правда обычно пишут nUnit или nEmployee, а не nIndex) и C перед именемами классов.
    Если есть нормальная IDE, то венгерская нотация нафиг не нужна, код превращается в рябь из смеси сокращений, которые только раздражают

    Совершенно согласен с вами.

    Не такие уж опытные ребята писали этот код, и они точно не в ладах с оформлением кода в C#. Вероятно, писали давно, когда C# еще появился, и все C++ программеры начинали писать на нем, сохраняя все свои привычки, многие из которых не нужны или даже вредны.
    То, что разные классы по-разному оформлены это не еще не большая беда, далеко не всем проектам удается поддержать одинаковый стиль (хотя оно того стоит конечно).
    Почти все классы в основном проекте лежат, никаких папок и соответствия им нэймспэйсов (за редким исключением).

    Это тоже из плюсов - нормальные люди конечно пользуются неймспейсами, но там они не настолько вездесущи, как в C#, т.к. технология сборки в принципе иная.
    А у вас было подобное? Вы как-то решали эту проблему?

    А это кроме вашей команды во главе с тимлидом и даже с привлечением менеджеров никому не решить. Если вы готовы отрефакторить половину продукта - вперед. Не готовы - лучше не трогайте. Пишите новый код в адекватном стиле. Если бы это был C++, я бы даже вам посоветовал новый код оформлять по правилам проекта, но ЭТИ правила в рамках C# неадекватны совершенно.

    Резюмирую: если нет ресурсов на переработку кода - терпите. Терпение и способность работать с legacy кодом не самого высокого качества - вероятно самая важная черта "программиста в команде". Старый и не самый симпатичный код - это реальность, это так же реально, как и ветхие здания, которые просто так не перестроишь без серьезных вложений.
    Работал в одной организации полтора года, написал сам несколько проектов. код в плане оформления просто чуть ли не идеален. Без всякой чуши типа венгерской нотации и т.д.

    Вам везло в плане качества кода. Теперь не очень повезло. Как сказал AtomKrieg, хорошо что не Кобол (хотя б тогда вам платили еще больше).
    Над методами простые комментарии, а не XML или их вообще нет

    Нормальные XML-комментарии в C# коде это вообще роскошь. Я их вижу только в серьезных библиотеках, а во всяком корпоративном треше так комментятся только самые важные классы в программе (штук 10-15). Радуйтесь, что вообще есть документация. Если есть желание и время - переносите в код, это наверняка будет полезно.
    Ответ написан
    Комментировать
  • Как узнать что Task завершил свою работу?

    Nipheris
    @Nipheris Куратор тега C#
    Да, вы поняли правильно. На первый взгляд в коде проблемы нет (если он выполняется из GUI-потока и FromCurrentSynchronizationContext() дает контекст GUI-потока). Что-то не работает?
    Ответ написан
  • MVP как правильно вернуть переменную во ViewModel прогрессбара?

    Nipheris
    @Nipheris Куратор тега C#
    Посмотреть бы на код, который регулярно считывает progressVal из модели и пихает в прогресс-бар. Иными словами, SetValProg откуда еще вызывается, кроме как при старте? Лично я пока не вижу никакой проблемы с потоками, про которую говорит tex0, т.к. из другого потока устанавливается только интовое поле у Model.
    Ответ написан
    Комментировать
  • Как добавить ссылку на библиотеку классов в проект, чтобы все ссылки из этой библиотеки автоматически добавились?

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

    > начав работу Php программистом я позже смогу устроиться позже в организацию, занимающуюся интерпраз разработкой?
    Если интересен интерпрайз - лучше сразу дотнет. Если боитесь стать слишком узким невостребованным специалистом - посмотрите и джаву тоже.
    Если потом вдруг перестанут интересовать крупные компании - тогда посмотрите RoR или питоновский стек.

    А вообще вам правильно пишут - зрелый разработчик конечно специализируется на чем-то, но и помимо основной платформы знает много чего, от нее не зависящего. PostgreSQL и MongoDB сейчас надо знать и php-исту и дотнетчику. Системы контроля версий вообще нужны всем абсолютно одинаково.

    ИМХО: Не буду рассуждать о будущем PHP, сейчас почти его не касаюсь, но он для меня всегда был "грязным" языком, который ничему хорошему не научит. Тот же Ruby куда более интересная альтернатива (хотя бы потому, что язык появился самостоятельно, и только потом стал популярен благодаря Rails, а в PHP всегда чувствовалось его происхождение).
    Ответ написан
    Комментировать
  • Как идентифицировать subItem в List View в C#?

    Nipheris
    @Nipheris Куратор тега C#
    > Как вообще в C# присваивание переменных происходит, в java вообще все отлично там все является указателем, и сохранить ссылку на какой то элемент очень просто, как с этим тут?
    Читайте про reference-types (типы-ссылки) и value-types (типы-значения) - от этого и зависит семантика присваивания.

    О каком ListView речь идет? WPF или WinForms?
    Ответ написан
  • Как запустить приложение у пользователя по ссылке с параметрами?

    Если бы это было можно, никто б тогда не парился поисками уязвимостей для протроянивания машин. Достаточно было бы запустить cmd или powershell с нужными параметрами.
    Проще написать инструкцию юзеру, или как посоветовали, батник. Ну или там, ярлык виндовый высылать (хотя конечно стопудов антивирусом порежется).
    Ответ написан
    Комментировать
  • Какие технологии используются сейчас для работы с БД?

    Nipheris
    @Nipheris Куратор тега C#
    ORM-ку сверху накиньте, вместо прямого ADO.Net, и будет вам современные технологии. В тренде, очевидно, Entity Framework, хотя NHibernate - нестареющая классика.
    Можете заморочиться над архитектурой, вплоть до разделения на клиент и сервер - тогда будет место и для Web API.
    Или другой вариант - подтащить документую БД, хотя для бухгалтерии не факт что это хорошее решение (разве что в пару к реляционной, для хранения характеристик ваших товаров).
    Ответ написан
    Комментировать
  • Возможно ли построить интерфейс сайта полностью кодом C#?

    Nipheris
    @Nipheris Куратор тега C#
    Просто крайне негативно отношусь к html и xaml, хочется избавиться от этих разметок.


    Может тогда попробуете jade-lang.com или slim-lang.com (или еще 100500 аналогов)?
    Я так понимаю вас синтаксис не устраивает? Языки-наследники SGML вполне неплохо подходят для иерархического контента, т.к. для этого и создавались. Так что обычно если что-то не нравится, так это теги и скобочки)
    Ответ написан