• За что придется платить, если будешь использовать C# и .NET?

    Antonchik
    @Antonchik
    Программирую на HTML
    С вас некто нечего просить не будет, ну если вы не пират, то за Windows, visual studio, resharper придется платить
    Ответ написан
    1 комментарий
  • За что придется платить, если будешь использовать C# и .NET?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Можете почитать лицензионное соглашение MSVS Community 2017. Вкратце: мелким организациям и ИП - бесплатно.

    Важно отличать ASP.NET MVC и ASP.NET Core. Под первую пишут на виндах и под винду, второй - некоторой степени сырости (но жить можно), который можно использовать полностью бесплатно в любых масштабах.

    То есть для крупной организации это может быть от бесплатного .NET Core-решения на Linux (VS Code + ASP.NET Core + MS SQL Server Express), до полностью платного стека:
    1. MS Windows (на сервер, IIS в комплекте),
    2. MS SQL Server (на сервер),
    3. MS Windows для разработчика,
    4. MS Visual Studio для разработчика
    Ответ написан
    Комментировать
  • Когда следует использовать структуры?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Когда вы оперируете примитивами, копирование которых достаточно дешево. В полном смысле слова значения. Примером будет System.Windows.Point или System.Decimal.
    Ответ написан
    3 комментария
  • Отправка письма на email.?

    tomnolane
    @tomnolane
    профессиональный разработчик
    вы уверены, что:
    1) указали верный порт smtp принимающей(к какой подключаетесь) стороны? (точно 587 ??? не всегда используется 587 для smtp)
    2) указали верный адрес почты?
    3) верный логин и пароль?

    вот рабочий код:
    class Program
        {
            static void Main(string[] args)
            {
                 
                // отправитель - устанавливаем адрес и отображаемое в письме имя
                MailAddress from = new MailAddress("somemail@gmail.com", "Tom");
                // кому отправляем
                MailAddress to = new MailAddress("somemail@yandex.ru");
                // создаем объект сообщения
                MailMessage m = new MailMessage(from, to);
                // тема письма
                m.Subject = "Тест";
                // текст письма
                m.Body = "<h2>Письмо-тест работы smtp-клиента</h2>";
                // письмо представляет код html
                m.IsBodyHtml = true;
                // адрес smtp-сервера и порт, с которого будем отправлять письмо
                SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
                // логин и пароль
                smtp.Credentials = new NetworkCredential("somemail@gmail.com", "mypassword");
                smtp.EnableSsl = true;
                smtp.Send(m);
                Console.Read();
            }
        }


    вот асинхронный код:
    class Program
        {
            static void Main(string[] args)
            {
     
                SendEmailAsync().GetAwaiter();
                Console.Read();
            }
     
            private static async Task SendEmailAsync()
            {
                MailAddress from = new MailAddress("somemail@gmail.com", "Tom");
                MailAddress to = new MailAddress("somemail@yandex.ru");
                MailMessage m = new MailMessage(from, to);
                m.Subject = "Тест";
                m.Body = "Письмо-тест 2 работы smtp-клиента";
                SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
                smtp.Credentials = new NetworkCredential("somemail@gmail.com", "mypassword");
                smtp.EnableSsl = true;
                await smtp.SendMailAsync(m);
                Console.WriteLine("Письмо отправлено");
            }
        }

    если через это не отправится - значит проблемы с указанными данными: порт, емеил, логи и пароль...
    Ответ написан
    1 комментарий
  • Есть ли обучающие материалы по разработке "Клиент-сервер" приложений на языке C#?

    @vais
    Ну например по клиент серверу:
    https://professorweb.ru/my/csharp/web/level3/3_2.php
    https://metanit.com/sharp/net/4.3.php
    round-angle-net.blogspot.ru/2010/09/tcpip-c.html
    Нужно именно winform\WPF приложение?

    если страница в браузере устроит то, смотри в сторону ASP.NET
    видео уроки от [ITVDN] (можно найти на известном торренте)
    книжки:
    Агуров П.В. - ASP.NET. Сборник рецептов
    Сандерсон С - ASP.NET MVC3 Framework с примерами на C# для профессионалов (третье издание) - 2012
    Ответ написан
    Комментировать
  • Смысл дефолтного namespace?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Это ограничение C# и её объектной модели. Каждый класс должен быть определён в пространстве имён (чёрт, ну русский же есть!), как его называть - ваше право. Необходим он, чтобы избежать коллизии имён. Причина по которой создаётся пространство имён по умолчанию очень проста - изменять стороннее пространство имён вне своих приложение/библиотек вы никак не можете, но и без оного код никак не соберётся в исполняемую кучу.

    UPD. Вообще говоря, если не указывать namespace, то его принято называть assembly. И это не самая правильная практика.
    Ответ написан
    Комментировать
  • Смысл дефолтного namespace?

    Если дефолтный namespace не нужен в exe, то нужен ли он в библиотеке, которой никто кроме вас никогда не будет пользоваться? Если все так будут размышлять, то рано или поздно мы вернемся к аду dll, только уже для классов. Именно поэтому Майкрософт рекомендует обзывать namespace как CompanyName.TechnologyName[.Feature][.Design]
    Ответ написан
    Комментировать
  • C#: Как правильно организовать сервисы в Business Logic Layer с помощью DI?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    1. BarService как бизнес-сервис не должен знать о другом бизнес-сервисе, т.е. о FooService. Если приходит понимание, что в BarService нужно вызывать метод из FooService, значит Ваш FooService должен стать компонентом более низкого уровня, чем бизнес-сервис. Например, FooManager (вспомните всякие ***Manager из ASP.NET Identity). Тогда этот FooManager можно будет использовать не только в BarService, но в каком-нибудь другом ***Service. Архитектурно будет выглядеть так: наверху ***Service (бизнес-логика), ниже - ***Manager (тоже бизнес-логика), еще ниже - ***Repository (а это уже DAL).
    2. Да, бывает необходимость расширить Generic-репозиторий конкретным репозиторием. Но тут надо очень хорошо подумать, почему мы это делаем. Возможно, мы пытаемся на конкретный репозиторий навесить часть бизнес-логики? Если так, то это уже не конкретный репозиторий и даже не компонент уровня DAL - это компонент уровня бизнес-логики. Ну да ладно, допустим, мы поняли, что нам-таки нужен IFooRepository. Я сталкивался с таким решением этой задачи: в IUnitOfWork добавляется новое свойство:
    public IFooRepository FooRepository {get; }
    И все. Инициализация выполняется внутри экземпляра UnitOfWork, например, так:
    public IFooRepository FooRepository {get; } = new FooRepository();

    а "наружу" нам доступен FooRepository:
    _uow.FooRepository.CallSomeMethod(...);
    В итоге в BarService Ваш код будет выглядеть примерно так:
    public void CreateBar(BarDTO bar) 
    {
        // Insert Bar entity
        
        _uow.FooRepository.CreateFoo(new FooDTO()); 
    
        _uow.Commit();
    }


    Но повторюсь. В Вашем примере у меня есть подозрения, что метод CreateFoo должен принадлежать не FooRepository, а какому-то компоненту уровня бизнес-логики (но в иерархии он не является бизнес-сервисом). Например, FooManager или FooCreator какой-нибудь (который отвечает только за создание объекта). Помните принцип SRP.
    Ответ написан
    Комментировать
  • Есть ли смысл подписывать REST API запросы?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Сервер создаёт (генерирует случайно) при регистрации пользователя REST-token и затем, постоянно хранит в своей базе данных связку REST-token'а с клиентом (1-к-1): clientID => REST-token
    2. REST-token - сервер передаёт клиенту через E-MAIL или SMS сразу после регистрации и просит ввести выданный код в поле, находящееся внутри запущенного приложения.
    Или же, активировать переходом по ссылке, если это - web-приложение в браузере, открываемое по линку (а не stand-alone, запускаемое с ярлыка мобильного интерфейса).
    3. Клиент подписывает каждый запрос к серверу этим токеном.

    REST-token - клиент никогда не передаёт!

    4. Сервер при поступлении запроса от клиента - подписывает все данные запроса токеном того же клиента на своей стороне.
    5. Сервер сразу же сверяет: если подписи совпадают - запрос принимается к исполнению.

    Для предотвращения подбора ключа REST-token - вводится случайно-генерируемая переменная в перечень полезных параметров при запросах к API: r,rand,random и т.д.
    Ответ написан
    Комментировать
  • Есть ли смысл подписывать REST API запросы?

    @vintage
    Кука - это тоже access_token, только подставляемый браузером автоматически, даже если запрос инициирует не ваша страница, а страница левого сайта. Соответственно, при пробрасывании токена через куки, сторонний сайт сможет делать запросы к вашему, от имени пользователя. Нужно ли такое разрешать - вы решаете сами. Если нужно - просто используйте куки. Если не нужно, то самое простое - с запросом посылать взятый из куки токен в хедере, а на сервере сверять их идентичность. Получить куки скриптом можно лишь с того же сайта, кто их поставил. В урле токен лучше не посылать, чтобы он не светился в логах.
    Ответ написан
    2 комментария
  • Как сделать так что бы на приложение не ругался Windows?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Очень просто - подпишите приложение.
    Разумеется сертификат должен быть выдан серьезной конторой, которой доверяют, в частности чтобы майкрософт им доверяла.

    Смысл этой защиты - если приложение не подписано, там может быть что угодно в том числе и вредоносный код.
    Неизвестно кто и зачем создал этот код.
    Поэтому Windows его блокирует и всячески защищает пользователя от случайного и непродуманного запуска такого кода.
    Если файл подписан - значит известен издатель этого кода, имеются его реквизиты, и в случае чего есть с кого спросить.
    Ответ написан
    1 комментарий
  • Где найти "грязный" проект, для того чтобы на нем поучиться рефакторить?

    @MoonMaster
    Программист и этим все сказано
    У меня опыта в программировании не очень много. Но чтобы развиваться, нужно писать код. Иногда у меня код получается просто отвратительный. Поэтому сижу вечерами и занимаюсь рефакторингом. Бывает, что проект немного изменяю или дополняю.
    Вот вам и поле: нужно найти новичка и тренироваться с ним (если у вас опыта намного больше)
    Ответ написан
    Комментировать
  • Где найти "грязный" проект, для того чтобы на нем поучиться рефакторить?

    Думаю, навык рефакторинга приходит естественным путем с тренировкой навыка написания грамотного кода. Все, что остается делать - познавать правила, и писать качественный код. Как только после этого Вам откроют проект с "плохим" кодом - сразу "зачешутся" руки: тут дублирование кода, здесь длинный метод, а вот здесь еще и слишком много ненужных локальных переменных...

    P.S. Полагаю, это челлендж ради челленджа находить проект под рефакторинг, чтобы улучшить этот навык.
    P.P.S. Если покопаться, можно и у себя найти парочку проектов, где можно бесконечно улучшать код.
    Ответ написан
    Комментировать
  • Какой стек технологий выбрать для приложения в трее под разные настольные ОС?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Если надо максимально автономное и есть знание или желание познать С++ - то QT, если это не слишком принципиально - то можно и C# + Mono, но тут сложность в том, что кроме самого приложения надо тащить и устанавливать рантайм библиотеки - а это еще мегабайт 30-50.
    Ответ написан
    2 комментария
  • Сложный проект ASP.NET: выбор ORM?

    dmitry_pavlov
    @dmitry_pavlov
    World-class .NET freelance contractor (remotely)
    Я бы сначала сделал миграцию как таковую, а потом бы уже подбирал ORMы под те ли иные нужды. Единственно - желательно архитектурно работу с данными убрать в некий data access layer (чтобы потом можно было, покрыв тестами, править только его, не сильно трогая код выше уровнями). Миграцию в данном случае тогда делать лучше на голом ADO.NET так как он позволяет делать с базой все что вам надо всеми перечисленными способами.

    Когда переедете с PHP можно будет заняться уже ORMами. Для CRUD операций нормально подойдет EF. Для bulk update/insert-ов - возможно проще оставить ADO.NET (такие операции я бы еще сделал асинхронными для обработки в бекграунде с последующей нотификацией об окончании - через опрос или через push уведомления - скажем WebRTC). Для выборок со сложными запросами - убрать эти сложные запросы в хранимые процедуры и дергать их либо через EF либо через ADO.NET. На счет маппинга данных на объекты используемые выше уровня data access - использовать AutoMapper. С его помощью можно смапить что-угодно на что угодно, главное не полениться и разобраться с возможностями его конфигурирования.

    Единой ORM, которая хорошо охватит все перечисленные виды работы с данными и при этом будет оптимальной для всех, просто не может быть. У всех ORM в основе есть та или иная концепция - как надо работать с данными. Универсальные же системы - это когда все части работают одинаково (причем одинаково плохо обычно :) ).
    Ответ написан
    2 комментария
  • Как изменить тип параметра в унаследованном методе C#?

    Nipheris
    @Nipheris Куратор тега C#
    То, что вы просите, невозможно сделать по одной простой причине. Наследование в .NET бывает только "настоящее", т.е. когда устанавливается отношение is-a. Ваш MyTCPStream не может быть Stream-ом, если не реализует метод Read (Byte[], Int32, Int32). Спросите себя - что произойдёт, если я скастю объект MyTCPStream к Stream, и попытаюсь вызвать Read(Byte[]...)?

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

    Для реализации процесса чтения более сложных объектов (а символ это более сложная штука, т.к. его представление в потоке зависит от кодировки) в дотнете есть TextReader и его наследники. Было бы хорошо, если б вы описали изначальную задачу - возможно мы посоветуем вам что-то полезное, а не странные хаки.
    Ответ написан
    3 комментария
  • Востребованный ли C# в США?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    C# особенно востребован в США.
    Ответ написан
    Комментировать
  • Сложный проект ASP.NET: выбор ORM?

    @Oblomingo
    Советую вам задуматься не только об ORM, но и об архитектуре вашего приложения.
    ORM позволяет очень быстро реализовать слой ответственный за трансформацию моделей базы данных в обьекты бизнес модели. Фактически, он реализует кучу таких классических паттернов как Data Mapper, Identity Map, Lazy Load, Repository, Unit of Work и еще кучу всего. Все это вы получаете из коробки + такие приятные вещи для контроля версии базы данных как CodeFirst + migrations. Да, в отдельных случаях вы расплачиваетесь скорость чтения/записи.
    Тут вам должна помочь правильная архитектура вашего приложения. Вы можете проектировать в соответсвии с принципами Domain-Driven-Design. В этом случае (в отличие от монолитного решения) приложения разделено на части. Каждая часть может иметь свою инфраструктуру, которая умеет записывать/читать данные из базы данных (repository pattern) и использовать какой то отдельный фреймворк. Части, которым не актуальна быстрая скорость, может легко использовать удобыный EF. Если в какой то части вы видите проблемы с быстродействием (bottleneck), вы можете изменить repository - выкинуть из нее EF и использовать Dapper. При правильной архитектуре, такая замена не затронет другие части системы и ваш рефакторинг пройдет безболезнено.

    Кроме того для EF есть расширения, которые реализуют Bulk функции:
    https://github.com/loresoft/EntityFramework.Extended
    entityframework-extensions.net
    https://efbulkinsert.codeplex.com/
    Ответ написан
    1 комментарий
  • Какое направление лучше выбрать при изучении c#?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    1) С# или Visual C#?

    Где вы прочитали это? В природе бывает лишь C# и он описывается стандартами. Visual %LANG_NAME% обычно Microsoft называет свои версии Visual Studio, заточенные под конкретную технологию. Но язык все равно С#.

    2) Что такое платформа .NET Framework?

    Это как бы...фреймворк) То есть вся та среда, в которой исполняется ваша программа, включая виртуальную машину (CLI) и библиотеку стандартных классов (FCL). То есть скомпилировав свое приложение, вам его нужно этой среде передать и она гарантирует наличие всего необходимого, чтобы приложение выполнилось. Пишет о нем отлично местный гуру - Джефри Рихтер в "CLR via C#". Странно было бы, если учебники, скажем, по JavaScript вплотную рассматривали бы V8, правда?)

    3) Недавно прочитал про .NET CORE.

    Это альтернативная реализация .NET Framework. Оно иначе работает и FCL там построена иначе. Но C# там точно такой же, как и на "большом" фреймворке, так что начав учить его вы ничего не потеряете. А уж MS позаботится, чтобы их сопутствующие технологии тоже не сильно отличались (ASP.NET MVC от ASP.NET Core, EntityFramework от EntityFramework Core.

    Вывод: если вы только начинаете, то вам без разницы, хоть под Core, хоть под .NET Framework, язык там один и тот же, консольные приложения такие же. Просто некоторые классы переехали в отдельные сборки. С нуля же лезть в фреймворки (ASP.NET MVC/Core, WPF, EntityFramework (без знания ADO.NET)) - рановато, освойтесь с самим языком, базовыми библиотеками.
    Ответ написан
    2 комментария
  • Какое направление лучше выбрать при изучении c#?

    @d-stream
    Готовые решения - не подаю, но...
    Если вкратце, то практически любой язык программирования как таковой осваивается за несколько дней. А вот все что вокруг - те же фреймворки - их только общий обзор может занять месяцы.
    Соответственно когда говорят просто "c#" или "visual c#" - то скорее подразумевают опыт относительно фреймворков. Если же говорят о чем-то специфичном, то там во главе угла именно специфичность, а язык указывается вторично

    И да, найти хорошую работу и зарабатывать хорошие деньги - это лучше не программировать, а жениться на дочке миллиардера =)
    Ответ написан
    2 комментария