Ответы пользователя по тегу C#
  • Как создать проект на С# в MS VS 2015?

    Nipheris
    @Nipheris Куратор тега C#
    Поищите книгу, где C# изучить можно на простейших вариантах приложений, например на консольных. Windows Store возможно вам нафиг не сдался, тем более что для 10-ки это уже UWP.
    Ответ написан
    Комментировать
  • Как отрисовать большое кол-во точек с помощью WPF 3D?

    Nipheris
    @Nipheris Куратор тега C#
    1) вы так легко считаете память, выделяемую под ваши кубы). Я думаю это весьма далеко от истины, т.к. лично я даже предположить не смогу, что конкретно происходит при создании дотнетовского объекта и сколько конкретно он потребует памяти;

    2) вы используете инструмент не по назначению. WPF - это для относительно малого числа граф. объектов (десятки, сотни) с высоким уровнем интерактивности для каждого из них. Иными словами - для интерфейсов. В интерфейсах есть небольшое количество высокоинтерактивных объектов - кнопок, скроллов, комбобоксов, и именно для таких сценариев WPF и оптимизирован. Вам с 10К кубами уже давно пора брать Direct3D и не мучаться. Это я вам не с потолка говорю, мы тоже когда-то пытались использовать WPF-шную двухмерную графику для двухмерной отрисовки, но быстро поняли, что его инфраструктура слишком тяжелая для нашей задачи. Вы замучаетесь в попытках это все оптимизировать.
    Ответ написан
    Комментировать
  • Как создать круглую кнопку button со вставленным в неё SVG-изображением, на языке XAML?

    Nipheris
    @Nipheris Куратор тега C#
    1) переделайте/сконвертируйте изображение так, чтобы это был Drawing:
    <GeometryDrawing Brush="#FF8B0000">
          <GeometryDrawing.Geometry>
            <PathGeometry ....... />
          </GeometryDrawing.Geometry>
        </GeometryDrawing>

    Если PathGeometry несколько, используйте DrawingGroup.
    2) поместите полученный XAML в ресурсы;
    3) попробуйте мой велосипед для того, чтобы поместить изображение в кнопку:
    <Image Source="{Binding Source=путь_к/картинке.xaml, Converter={StaticResource ResourceUriToDrawingImageConverter}}" />

    Код конвертера:
    public class ResourceUriToDrawingImageConverter : IValueConverter
    	{
    		public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    		{
    			Uri uri =
    				value is Uri ?
    					value as Uri :
    				value is string ?
    					new Uri(value as string, UriKind.RelativeOrAbsolute) :
    					null;
    
    			if (uri == null)
    			{
    				throw new Exception("Invalid URI value");
    			}
    
    			StreamResourceInfo sri = Application.GetResourceStream(uri);
    			if (sri == null)
    			{
    				throw new Exception("Resource not found");
    			}
    
    			using (Stream stream = sri.Stream)
    			{
    				var drawing = XamlReader.Load(stream) as Drawing;
    				if (drawing == null)
    				{
    					throw new Exception("Resource cannot be converted to drawing");
    				}
    
    				return new DrawingImage(drawing);
    			}
    		}
    
    		public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    		{
    			throw new NotImplementedException();
    		}
    	}

    P.S. Следите за репой https://github.com/Nipheris/SharpVectors.MSBuild - там скоро появятся MSBuild-таски для конвертирования SVG прямо во время сборки проекта.
    Ответ написан
    Комментировать
  • "switch case" - плохо?

    Nipheris
    @Nipheris Куратор тега C#
    О неписанных правилах по написанию какого-либо кода нужно уточнять сначала у того, кто этот код писал или кто его поддерживает сейчас. У конкретного разработчика/команды могут быть свои неписанные правила, которые нужны лично им.
    А сам switch используется достаточно часто, чтобы не считать его злом. Уж гораздо чаще, чем goto. Тем более, switch в шарпе гораздо "безопаснее", чем в том же С++, например компилятор следит, чтобы вы поставили break, если у вас есть код после case.
    Почитайте код популярных библиотек на codeplex или гитхабе, чтобы самому все увидеть.
    Ответ написан
    Комментировать
  • Какие есть Best practice доступа к БД в C#?

    Nipheris
    @Nipheris Куратор тега C#
    1) https://habrahabr.ru/company/microsoft/blog/101121/
    Команда EF разъясняет, что Code First – не совсем корректное имя, и его не совсем правильно понимают. Правильнее было бы назвать Modeling using Code. Когда мы описываем модель непосредственно в C# коде, то разработчик код лучше всего понимает. Графический интерфейс Visual Studio теперь будет работать именно с Code First, а edmx более не поддерживается.

    Ну т.е. вроде понятно, что использовать в новых проектах.
    2) используйте репозиторий: codereview.stackexchange.com/questions/57401/repos... , только прошу вас, не делайте методов, принимающих Expression и возвращающих IQueryable - такой "репозиторий" совершенно не нужен и никак ничего не абстрагирует, а только вредит. Делайте методы на каждый конкретный тип запроса, принимающие конкретные ограничения для поиска, и возвращающие IEnumerable. Такие методы реально протестировать, и вы не получите дырявую абстракцию, которая будет выдавать вам внезапно ошибки в рантайме при нестандартных запросах на выборку сущностей. И самое главное - вы не будете зависеть от конкретной ORM.
    3) не забывайте, что никуда не девался ADO.NET и другие ORM, толстые например NHibernate, и не очень. Если вы в вашем приложении делаете к базе два запроса на вставку (какой-нибудь сервис телеметрии), ни к чему городить огород с ORM. Или если у вас олдскульная база с большим количеством хранимых процедур на сервере, то толстая ORM также ни к чему (какой-нибудь биллинг например).

    Если что еще вспомню, напишу.
    Ответ написан
    3 комментария
  • Как организовать обработку сообщений от нескольких серверов?

    Nipheris
    @Nipheris Куратор тега C#
    Общая концепция и модель: раз и два.
    Конкретные реализации и протоколы: обмен сообщениями в чистом виде, независимо от платформы: AMQP, ZeroMQ; также, если речь про дотнет, можно попробовать WCF.
    Ответ написан
    4 комментария
  • Как правильно обрабатывать ошибки в C#?

    Nipheris
    @Nipheris Куратор тега C#
    Т.е. нужна некая философия

    А какие книги вы уже пробовали читать, раз такое спрашиваете?

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

    Все это дает вам набор простых правил:
    1) выбрасывать исключение нужно тогда, когда вы не собираетесь обрабатывать возникшую ситуацию в рамках текущего алгоритма. Иными словами, для работающей в данный момент функции эта ситуация - "исключительная". Пример: вы пишете функцию для чтения GIF-файла в Bitmap, и по ходу чтения проверяете соответствие получаемых данных формату GIF-файлов (например, убеждаетесь в наличии GIF89a в начале файла). Если вдруг вы видите, что формат файла нарушен, то вам ничего не остается кроме как выбросить исключение, т.к. вы не можете продолжить выполнение основного алгоритма - считывание файла. Внутри функции считывания вы не знаете заранее, как вызывающий код захочет обработать эту проблему, вам и не нужно это знать;
    2) перехватывать исключение конкретного типа нужно тогда, когда в задачу текущего кода входит и обработка ошибок тоже. Иными словами тогда, когда исключение в вызванном коде - лишь один из вариантов нормальной работы вызывающего кода. Вернемся к примеру с GIFками: если для библиотечной функции чтения файла нарушение формата - это критическая проблема, то для вызывающего эту функцию GUI-приложения это нормальная ситуация - ее можно и нужно обработать, выдав пользователю соответствующее сообщение, или просто пропустить файл, если обрабатывается сразу несколько картинок. Или например, если вы пишете веб-сервис, вы врядли хотите, чтобы весь сервис прекратил работу из-за ошибки при обработке какого-то одного запроса. Поэтому в веб-сервере, раздающем файлы вы, к примеру, можете перехватывать все FileNotFound исключения, и выдывать ошибку 404, а на все остальные исключения внутри обработчика запроса - ошибку 500 и в обоих случаях писать в error.log.

    Следует понимать, что исключения - лишь один из подходов к обработке ошибок, естественно сочетающийся с возможностями некоторых языков. В Си, например, обходятся без них, и все живы и здоровы.

    Отличный пример разных подходов - методы Parse/TryParse у числовых типов в дотнете. Первый возвращает значение и выбрасывает исключение, второй записывает значение через выходной параметр, возвращает bool и НЕ выбрасывает исключение. "Try" в названии второго метода подчеркивает, что для этого метода неудача при попытке распарсить число из строки - НОРМАЛЬНАЯ ситуация, и метод в этом случае вернет false. Для метода Parse напротив, такая ситуация будет исключительной, т.к. ему просто-напросто нечего будет возвращать, и дальнейшая нормальная работа кода, в том числе вызывающего, невозможна.
    Поэтому метода TryParse чаще используют тогда, когда вероятность ошибки высока и ее обработка - одна из ветвей алгоритма. Например при считывании пользовательского ввода мы сразу можем попросить пользователя исправить введенное значение.
    С другой стороны, Parse применяется если ошибка маловероятна, мы не готовы ее обработать и лучше прервать всю операцию целиком. Например если мы получили от сервера невалидный ответ, мы не попросим его исправить этот ответ. Дальнейшее общение с сервером лучше прервать, т.к. имеет место нарушение протокола и можно наломать дров.
    Ответ написан
    Комментировать
  • Что происходит с кодировкой файлов C#?

    Nipheris
    @Nipheris Куратор тега C#
    Судя по скрину, у вас для UTF-8 потерялся BOM.
    Скорее всего это произошло потому, что вы считали файл неверной кодировкой (в файле у вас UTF-8 вроде как). Используйте кодировку явно, например UTF8Encoding вместо дефолтовой.
    Ответ написан
    Комментировать
  • Как скачивать несколько файлов через WebClient по очереди? Через DownloadFileAsync?

    Nipheris
    @Nipheris Куратор тега C#
    1) сразу попробовать DownloadFileTaskAsync, с тасками работать проще;
    2) дожидаться завершения таска на скачку одного файла перед запуском следующего;
    3)
    Новый поток? Пробовал. Не двигается прогресс бар.

    Работать с контролами только из GUI-потока. Читать про SynchronizationContext.
    Ответ написан
  • Как на лету добавлять столбцы в базу данных?

    Nipheris
    @Nipheris Куратор тега C#
    C SQL базой правильно такого не делать. В смысле - не изменять схему SQL базы данных по запросам пользователя. Нужно подумать, почему возникает такая необходимость, возможно часть данных нужно хранить в документно-ориентированной БД.
    Ответ написан
    Комментировать
  • Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?

    Nipheris
    @Nipheris Куратор тега C#
    <TreeView ItemsSource="{Binding СвойствоОбщейВьюМоделиСодержащееКоллекциюЗаписей}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding СвойствоОбъектаСсылающеесяНаОбъектРодитель}" DataType="{x:Type local:КлассОбъекта}">
                <TreeViewItem Header="{Binding СвойствоВОбъектеСТекстомДляОтображенияВУзле}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

    Не забудьте добавить описание неймспейса local.
    Ответ написан
  • Почему так работает Stopwatch?

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

    При замере производительности одни и те же вычисления нужно проводить много раз, например по 100 тысяч раз на каждый вариант, а то и по миллиону. Тогда вы получите более-менее внятный результат для сравнения, и не будете натыкаться на всякие тонкости работы CLR.
    Ответ написан
    Комментировать
  • Как создавать кнопки связанные с объектами?

    Nipheris
    @Nipheris Куратор тега C#
    Начните с https://msdn.microsoft.com/en-us/magazine/dd419663.aspx .

    После прочтения статьи должны придти к выводу, что главное а) построить правильную ViewModel; б) записать правильные привязки. Не факт, что получится обойтись без генерации контролов из кода. Но даже в этом случае содержимое статьи должно быть применимо.
    Ответ написан
  • Какой язык выбрать под Backend высоконагруженного rest-сервиса?

    Nipheris
    @Nipheris Куратор тега C++
    забрать данный с БД, передать на клиент, получить запрос от клиента, выполнить несложную логику, сохранить в БД, передать ответ

    По вашему описанию БД должна быть узким местом. А если узлов с базой много, почему не размножить бэкенд-сервера?
    Ответ написан
    1 комментарий
  • Как лучше привязать WCF приложение к проекту на WPF?

    Nipheris
    @Nipheris Куратор тега C#
    Правильно ли я сделал, что определение класса самого объекта из списка расположил в проекте wcf-сервиса? Класс списка со всеми операциями я расположил там же.

    Зависит от вашего задания. В принципе для такого тестового не вижу смысла заморачиваться разбиением на проекты.

    сейчас я скопировал адрес из wcf-test-client и вставил как service reference в wpf

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

    Nipheris
    @Nipheris Куратор тега C#
    WinAPI: CreateEvent, OpenEvent, SetEvent, WaitForSingleObject
    Ответ написан
    Комментировать
  • Как сделать программу незакрываемой?

    Nipheris
    @Nipheris Куратор тега C#
    А в чем проблема-то? Если прога не работает - считать, что юзера нет за компом. Ну как трекер для того же Upwork-а работает.
    Это если цель - заставить юзера быть заинтересованным в генерации активности на компе. Если цель другая - см. ответ АртемЪ - он подходит, если вы администрируете машины пользователей. Если машины админятся самими юзерами (т.е. у вас не исключительных прав на них) - то тогда, имхо, и надежного метода нет по определению. Безопасная загрузка, загрузка с другого носителя, и т.д.
    Ответ написан
    1 комментарий
  • Как через StreamReader считать строку с определенной позиции?

    Nipheris
    @Nipheris Куратор тега C#
    1) первым проходом строим "индекс" - сохраняем в списке начала всех строк (в смысле, номер байта в потоке);
    2) дальнейшие чтения делаем с помощью индекса;

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

    Nipheris
    @Nipheris Куратор тега C#
    с подсветкой синтаксиса

    хм, неплохо если вы его уже реально напишите.

    Собственно, что нужно читать, писать, смотреть, чтобы развиваться?

    Прикладное направление выберите для начала. Стандартный выбор на сегодня: веб-бэкенд/десктоп/игры/мобайл. Соответственно: ASP.NET 5ASP.NET Core 1.0/WPF/Unity/(UWP/Xamarin)
    Ответ написан
    4 комментария
  • Wealth-lab. C# как написать сферическую функцию?

    Nipheris
    @Nipheris Куратор тега C#
    Массивчики BBUp и BBMed не желаете создать? Если создаете, то покажите код создания, и где он вызывается.
    Ответ написан
    Комментировать