Ответы пользователя по тегу C#
  • Как стать профессиональным разработчиком WPF?

    Nipheris
    @Nipheris Куратор тега C#
    А у MVVM нет общих правил, каждый реализовывает его по-разному.

    Ну я б не говорил, что их прям нет. Есть привязки, есть INotifyPropertyChanged, есть рекомендации от MS. Да, вы правы в том смысле, что WPF это библиотека, но НЕ фреймворк для разработки, т.е. она не регламентирует структуру приложения.

    И у меня диссонанс — что сначала изучать, куда копать, что вообще делать, что стоит изучать, а что нет.

    Вот пару дней назад советовал книгу: Raffaele Garofalo, "Building Enterprise Applicatio... - если ничего не читали еще, начните с неё.

    И действительно хороших, многофункциональных и понятных проектов на WPF + MVVM я не видел.

    Неудивительно: WPF-приложения это обычно line-of-business, а это не open-source по определению.

    С чего начать изучение WPF?

    Убедитесь, что более-менее понимаете платформу .NET и ООП в ней, иначе будет тяжело.
    Вам надо будет разобраться:
    а) с системой зависимых свойств (dependency property);
    б) c MVVM и INotifyPropertyChanged;
    в) само собой с XAML и контролами, принципами написания своих контролов;
    г) со стилями и стилизацией;
    д) с системой команд (ICommand) и прочим.

    Нужны ли MVVM-фреймворки? Почему столько дискуссии возникает. Одни говорят да, другие — нет.

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

    Впоследствии еще советую познакомиться с IoC-контейнерами, если еще не пользовались. Это общий совет для крупных приложений, не только для WPF. Некоторые имеют спецальные интеграционные библиотеки для работы на пару с фреймворками, например Autofac: Prism.Autofac.
    Ответ написан
    1 комментарий
  • Чем разбирать на составляющие аудиофайлы?

    Nipheris
    @Nipheris Куратор тега C#
    Ответ написан
    Комментировать
  • Часто ли вы используете интерфейсы?

    Nipheris
    @Nipheris Куратор тега C#
    Часто ли вы используете интерфейсы?

    Посмотрим, что у нас в стандартной библиотеке:

    Со всеми этими интерфейсами дотнет разработчик сталкивается каждый день. Либо пользуется ими, либо реализует их. Например, тот же yield return работает благодаря IEnumerable. Весь LINQ основан на IEnumerable и IQueryable.

    Часто ли у вас было что ваши репозитории окруженные интерфейсами используют MSSQL, и есть еще такие же репозитории но уже использующие к примеру MongoDB, и где нито вы подменяете одно другим?

    Да, часто. Например, архитектура ADO.NET позволяет написать приложение так, что оно вообще не будет зависеть от используемого драйвера БД, и конкретный ado.net драйвер можно указать в конфиг-файле приложения. Т.е. конкретную БД может выбрать ПОЛЬЗОВАТЕЛЬ, а не разработчик. Более того, если под какую-то БД драйвера еще нет, а позже он появится, то его можно будет задействовать без перекомпиляции приложения. Только потому, что используются интерфейсы.
    Ответ написан
    Комментировать
  • C# программисты, какие сайты вы читаете каждый день?

    Nipheris
    @Nipheris Куратор тега C#
    Подписывайтесь на MSDN Flash, вам новости будут приходить из первых рук в достаточном количестве. Вот примеры того, что приходит:
    https://msdn.microsoft.com/magazine/mt736459
    https://blogs.msdn.microsoft.com/dotnet/2016/07/13...
    Собсно можете смотреть дотнет бложик: https://blogs.msdn.microsoft.com/dotnet/

    Еще, конечно же, CodeProject. Остальное можно найти на Хабре, и на стартовой странице Студии.

    Видео и твиттеры не смотрю почти никогда, информации умещается мало или смотреть долго. Самый лучший формат для меня - блог. Поэкспериментировать с написанным в статье я и сам могу).
    Ответ написан
    Комментировать
  • Почему программа не отвечает во время скачивания методом WebClient?

    Nipheris
    @Nipheris Куратор тега C#
    Очевидно потому, что вы вызываете синхронный метод скачивания (DownloadFile), и он вешает event loop до момета завершения загрузки. Асинхронно качать не пробовали?
    Ответ написан
    Комментировать
  • Как подключить к элементу управления источник данных находящейся в экземпляре класса, который в свою очередь находится в ObservableCollection?

    Nipheris
    @Nipheris Куратор тега C#
    При условии, что сама эта коллекция будет находится в экземпляре класса RemoteClientViewModel.

    Не совсем понял, почему вы называете это "коллекцией", по логике я бы там ожидал увидеть просто несколько обычных свойств, выставленных для вьюхи. Чтобы сделать привязки к этим свойствам, просто задайте нужный ItemTemplate.

    Кроме того, мне нужно чтобы при клике на элемент списка ListBox в ListView отображался соответствующий этому клиенту (т.е той ViewModel которая подключена к этому элементу) список файлов.

    Всё очень просто - сделайте в MainViewModel свойство SelectedЧТОТО, в пару к вашей коллекции. Например, если коллекция это RemoteClients, то и свойство - SelectedRemoteClient. Забиндите SelectedItem ListBox-а к этому свойству. Разумеется, не забудьте его правильно реализовать, с NotifyPropertyChanged. Затем привяжите ItemsSource ListView-хи к SelectedRemoteClient.Files, где Files это коллекция с информацией о файлах. Если не будет работать, пишите, попробуем другой вариант.
    Ответ написан
    7 комментариев
  • Как читать и записывать xlsx стандартными средствами .NET?

    Nipheris
    @Nipheris Куратор тега C#
    Если вас интересует xlsx, можете стандартными средствами его распаковать (т.к. это обычный ZIP), и поработать с содержимым. Основное содержимое книги будет в XML (не помню имя файла), так что сформировать его особых проблем не составит. Если вариант подходит, расскажу подробнее, что можно сделать.

    А вообще EPPlus тащит.
    Ответ написан
    1 комментарий
  • Перевызов событий?

    Nipheris
    @Nipheris Куратор тега C#
    Потому что ивент - это не то же самое, что делегат. Ивент ограничивает интефейс делегата только двумя операциями - добавить и удалить обработчик. Это делается для того, чтобы только изнутри объекта можно было сгенерировать событие. Иными словами, чтобы никто не мог, к примеру, "нажать" кнопку вместо самой кнопки (т.е. сгенерировать событие Clicked в обход внутренней логики класса "Кнопка"). В этом принципиальный смысл концепции событий.

    Можно провести аналогию между полем/свойством и делегатом/событием. Как свойство - это в некоторых случаях "интерфейс" для поля, который позволяет контроллировать, как оно изменяется (при этом вы можете использовать генерируемое поле с помощью синтаксиса { get; set; }), так и событие это "интерфейс" для делегата - вы не можете напрямую изменять или вызывать делегат, вы делаете это с помощью события. Можете также почитать про синтаксис add/remove у событий - тогда аналогия со свойством будет еще понятнее.

    Зачем делать InvokeEvent не совсем понятно, видимо это просто какой-то пример. В реальном коде класс MyClass должен сам решить, когда вызывать то или иное событие.
    Ответ написан
    5 комментариев
  • Как информировать сообщество о новой библиотеке?

    Nipheris
    @Nipheris Куратор тега C#
    1. Делаете хороший README, разумеется на английском, где указываете, как ей пользоваться, и что ей требуется.
    2. Делаете несколько примеров (именно рабочий код в подпапке examples) для основных кейсов применения библиотеки.
    3. Льете на опенсурсный хостинг, если еще не сделали.
    4. Настраиваете CI (например на AppVeyour), это не обязательно, но желательно.
    5. Заливаете готовые пакеты на NuGet. Разумеется, вы должны научиться упаковывать свою библиотеку в нормальный пакет. В nuspec ставите годные правильные теги.
    6. Покрываете тестами, хотя бы частично.

    После этого к вашей библиотеке начнут относиться более-менее серьезно.

    7. Можете попробовать на CodeProject рассказать, там часто рассказывают именно про библиотеки.
    Ответ написан
    4 комментария
  • Какие есть библиотеки для авто тестирования методов с перебором произвольных данных?

    Nipheris
    @Nipheris Куратор тега C#
    IntelliTest - коммерческое развитие исследовательского проекта Pex. Он делает как раз то, что вы хотите. Вот песочница для попробовать.
    Ответ написан
    Комментировать
  • Как поймать неправильное завершение работы сервера?

    Nipheris
    @Nipheris Куратор тега C#
    Будем считать, что речь идёт о клиенте и сервере в контексте взаимодействия по протоколу TCP (если не так - уточните вопрос).

    Сообщите клиенту, что сервер штатно завершает работу, и клиент будет знать, что есть смысл подключаться заново. Если сервер отключается и не посылает такого сообщения - клиент считает, что сервер завершил работу нештатным образом и больше не подключается. Более того, вы можете сообщить клиенту через сколько секунд/минут/часов вновь можно подключиться к серверу - клиент не будет париться и стучаться в закрытые ворота, пока сервер еще не поднялся.
    Ответ написан
    Комментировать
  • Как перегрузить оператор присваивания, c#?

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

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

    Nipheris
    @Nipheris Куратор тега C#
    Попробуйте SymmetricDS, этот проект как раз посвящен синхронизации (репликации) в master-master архитектуре с учётом непостоянного соединения между узлами. Ажура вроде как поддерживается. Что ставить на кл иенте - зависит от размера и требований к базе. Скорее всего хватит SQLite.
    Ответ написан
    Комментировать
  • Что означает эта строка?

    Nipheris
    @Nipheris Куратор тега C#
    default(T) вычисляется как дефолтовое значение для типа T.

    Given a variable t of a parameterized type T, the statement t = null is only valid if T is a reference type and t = 0 will only work for numeric value types but not for structs.The solution is to use the default keyword, which will return null for reference types and zero for numeric value types.For structs, it will return each member of the struct initialized to zero or null depending on whether they are value or reference types.
    Ответ написан
    Комментировать
  • В чем разница между C#, .NET, ASP.NET, WEB Forms?

    Nipheris
    @Nipheris Куратор тега C#
    C# это Java.
    .NET это CLR и различные библиотеки (какие - зависит от формы поставки .NET, например .NET Framework, Silverlight или .NET Core).
    CLR это JVM.
    CIL это байткод Джавы.
    ASP.NET MVC это Spring.
    ASP.NET Web Forms это тоже веб-фреймворк, только с другой идеологией (более старый, чем MVC).

    Что для чего нужно и что за умное словечко "платформа"?

    Непонятен контекст.
    Ответ написан
    5 комментариев
  • Generic Типы и двойной UpCast?

    Nipheris
    @Nipheris Куратор тега C#
    Вы не совсем верно понимаете ковариантность в generic-интерфейсах и напутали в кучу много всего.

    Во-первых, тип поля figure ни на какой другой не меняется. Он не может измениться "на ходу", т.к. конкретный объект конкретного класса уже создан.

    Тип возвращаемого значения свойства Figure также не меняется.
    Еще раз повторюсь - у класса и у его экземпляра не меняются никакие типы ни полей, ни свойств.

    Вы почему-то воспринимаете приведение типа класса к интерфейсу как конвертацию значения объекта - как будто создастся другой Circle, у которого будут другие типы полей. Совершенно точно это не так.

    Когда речь идёт о ссылочных типах (а полиморфизм с использованием интерфейсов работает только с такими типами), то вам следует четко понимать, что вы работаете со ссылкой, и приведение типа для ссылки никак не может влиять на сам объект. Иными словами, вы просто меняете "окно", через которое смотрите на объект.

    Таким образом, ковариантность в случае интерфейсов - это вопрос исключительно типизации. Когда в C# добавили ко- и контрвариантность, фактически вам разрешили считать, что IContainer это частный случай IContainer, а раз так - то ВСЯКИЙ IContainer можно трактовать как IContainer. В ранних версиях языка этого нельзя было сделать - можно было только Container трактовать как IContainer.

    Если в ответе что-то непонятно, спрашивайте, т.к. по вашему вопросу создаётся ощущение, что у вас где-то большой пробел в понимании языка. Вы закапываетесь в детали, делая совершенно неверные предположения о происходящем.
    Ответ написан
    9 комментариев
  • Распознавание кода, конечный автомат, лексический анализатор и прочие умные слова?

    Nipheris
    @Nipheris Куратор тега C++
    Если вам нужна конкретно простейшая подсветка синтаксиса (как в вашем примере с html), то вам достаточно лексического анализа. Вам нужно выбирать токены в тексте, и в зависимости от типа токена, выбирать цвет для подсветки. В разных средах это будет реализовано по-разному - в Саблайме это делается через спец. язык описания конечных автоматов, в других редакторах могут использоваться регулярные выражения, в Visual Studio пишется лексический анализатор на ЯП общего назначения.

    Поглядите на эти инструменты, С/С++: Flex, ANTLR для дотнет-языков еще FsLex хорош (правда, синтаксис у него F#-овский).

    Если нужен более сложный анализ (например, подстановки в зависимости от контекста), смотрите ответ Дмитрий Макаров - это уже синтаксический анализ, следующий этап после лексического. Упомянутый Yacc - это классическая пара к Lex/Flex. Есть и более современный аналог, совместимый с Yacc - Bison. Под дотнет могу посоветовать тот же ANTLR, и FsYacc в пару к FsLex.
    Ответ написан
    Комментировать
  • Сколько памяти занимает тип int в c#, если он наследуется от типа object?

    Nipheris
    @Nipheris Куратор тега C#
    > Там же всякие методы наследуются, как например tostring и прочие.
    Не следует понимать это "наследование" буквально. Это вам язык C# и его объектная модель показывают, что они как бы наследуются от Object. На самом деле там все несколько сложнее. Примитивные типы в большинстве случаев занимают столько, сколько должны. Они становятся объектами только тогда, когда это необходимо. Почитайте про boxing и unboxing value-типов, узнаете много нового.
    Ответ написан
    Комментировать
  • Что использовать для быстрой генерации Excel файла?

    Nipheris
    @Nipheris Куратор тега C#
    Если не считать вот этого требования:
    сразу отдавать его назад пользователю, без сохранений на хард

    то однозначно EPPlus (в нюгете: EPPlus ), врядли вы что-то лучше найдете, не требующее наличия установленного Офиса. Насчёт "сразу отдавать пользователю" - надо посмотреть, умеет ли писать воркбук в Стрим, а не в файл.

    UPD: судя по конструктору ExcelPackage(Stream newStream), умеет. Так что пишите в МемориСтрим, и отдавайте юзеру. Не забудьте Content-Type нужный проставить)
    Ответ написан
    3 комментария