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

    Nipheris
    @Nipheris Куратор тега C#
    Какая версия VS? Какой тип проекта? Есть возможность использовать новую проектную систему? Если да, то PackageReference и вперёд.

    Если нет - то через packages.config, как и всегда. Собирать нюгет-пакеты, если есть зависимости между солюшенами - правильная мысль. Нужны ли вам несколько солюшенов - сходу не скажешь, Payments выглядит адекватно как самостоятельный солюшен, Data - непонятно что это.
    Ответ написан
    Комментировать
  • Почему автозагрузка программы не работает С# WPF?

    Nipheris
    @Nipheris Куратор тега C#
    В современной Винде приложения, требующие повышения привелегий, можно нормально запустить только с помощью планировщика заданий. Повышение привелегий (которое в свою очередь приведёт к срабатыванию UAC, если он включён) невозможно для программ в автозагрузке (неважно в папке или через реестр).
    Ответ написан
    1 комментарий
  • Преимущество использования Expression вместо Func?

    Nipheris
    @Nipheris Куратор тега C#
    Это совершенно разные вещи.

    Func это стандартный тип функтора, который позволяет вам передавать/сохранять некое поведение или вычисления и работать с функией как со значением.

    Expression-ы - это не функторы, это синтаксические деревья выражений. Вы можете их скомпилировать в код, чтобы получить функцию, которую можно обернуть в Func, но вы можете воспользовать экспрешенном совершенно иначе, например вывести его содержимое тем или иным образом или вообще скомпилить экспрешн не в код, а например в SQL-запрос, как, ЕМНИП, делает LINQ-to-SQL. Экспрешен - это структура данных, а не функтор, который можно вызвать.

    Если непонятно, советую погуглить по "функтор" и "синтаксическое дерево", а также посмотреть примеры на MSDN про компиляцию Expression-ов. Слишком много тут мат. части чтобы в двух предложениях объяснить.
    Ответ написан
    Комментировать
  • Как удалить выбранные элементы в DataGrid (WPF)?

    Nipheris
    @Nipheris Куратор тега C#
    1. Пишете вьюмодель для каждого элемента в таблице.
    2. CheckBox-колонку привязываете к свойству IsSelected вьюмодели.
    3. DataGrid привязываете к ObservableCollection<ВьюМодельДляЭлемента>.
    4. Когда нужно удалить элементы, пробегаете по вьюмоделям в коллекции и удаляете те, у которых IsSelected == true.
    Ответ написан
    Комментировать
  • Семантика типов в Си и C#?

    Nipheris
    @Nipheris Куратор тега C#
    Сходство есть, но и различий достаточно. Указатель хранит адрес в памяти, который в общем-то доступен вам для чтения и записи. Вы можете любой int скастить в указатель и попытаться разыменовать его. Врядли ли вы получите от этого что-то полезное, но суть в том что вы МОЖЕТЕ это сделать. Указатель как тип данных лишь даёт вам удобное средство для адресации и типизированной работы с областью памяти.

    Ссылка в .net - вещь значительно более высокоуровневая. Это скорее object identity, а не адрес в памяти. Ссылка не хранит непосредственно адрес объекта в управляемой куче, она хранит его номер, а конкретным адресом в памяти управляет сборщик мусора (так сделано потому, что сборщик имеет право перемещать объекты в памяти, если они явно не закреплены).

    Как уже сказали выше, указатели в C# тоже есть, и они действительно хранят адрес. Но они доступны только в unsafe контексте и не являются средством для everyday-разработки.

    Ссылки в C# концептуально связаны с объектным подходом, ссылка хранит идентификатор объекта и является "ключом" доступа к нему. Ссылка не может непосредственно ссылаться на типы-значения на уровне платформы .net, для этого нужно сначала выполнить boxing значения.

    Сишкном указателю же без разницы, на что он указывает. Если говорить в контексте C++, то программист по сути сам даёт указателям на объекты семантику object identity.
    Ответ написан
    1 комментарий
  • Как изменить тип параметра в унаследованном методе C#?

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

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

    Для реализации процесса чтения более сложных объектов (а символ это более сложная штука, т.к. его представление в потоке зависит от кодировки) в дотнете есть TextReader и его наследники. Было бы хорошо, если б вы описали изначальную задачу - возможно мы посоветуем вам что-то полезное, а не странные хаки.
    Ответ написан
    3 комментария
  • Как осуществляется связь между ViewModel и Model в MVVM?

    Nipheris
    @Nipheris Куратор тега C#
    В общем случае способ передачи нотификаций из модели во ViewModel не регламентируется паттерном MVVM. Как это лучше всего осуществлять - зависит от вашей задачи.

    Возможно ViewModel будет сама знать о том, когда и в каком случае какие свойства модели изменяются и сама будет генерировать необходимые события PropertyChanged.
    Возможно в модели будут специфичные для конкретной задачи ивенты (например, модель будет вызывать PlayerMoveCompleted когда игрок сделает ход), на которые будет подписана ViewModel и будет, в свою очередь, генерировать необходимые PropertyChanged.
    Некоторые советуют в модели также реализовать INotifyPropertyChanged, но лично мне этот способ не нравится: во-первых, в модель начинает подмешиваться UI, что обычно нехорошо, а во-вторых - нотификация о смене значений конкретных пропертей это всё-таки задача ViewModel, и я не вижу смысла размазывать её ещё и на модель. Последняя должна содержать только специфичные для предметной области вещи.
    Ответ написан
    2 комментария
  • C#. Возможно ли инициализировать объект по типу Dictionary (без наследования)?

    Nipheris
    @Nipheris Куратор тега C#
    Добавьте в ваш класс метод Add(T t, U u). Это называется Dictionary Initializer.
    Ответ написан
    Комментировать
  • Как поступить с выбором среды разработки после года работы в C++ Builder?

    Nipheris
    @Nipheris Куратор тега C++
    Как сделать переход с C++ Builder как можно менее безболезненным!

    Если действительно есть время и желание, то попробуйте поработать с "голым" стеком. Сборка - шелл-скриптом, редактирование в редакторе общего назначения. Тогда вы сможете выбрать по отдельности компилятор и редактор.
    Какой компилятор выбрать - вопрос отдельный, зависит от привычной вам платформы и ваших целей в плане изучения технологии. Можно, например, Клэнг попробовать.

    Когда всё это соберёте в кучу сами, можно будет попробовать CMake - инструмент непростой, местами даже замороченный, но не даст вам расслабиться и будет хорошим вложением времени, если вы собрались заниматься C++. В это же время вы можете определиться со своими предпочтениями в плане занятости и платформы на которой хотите работать.

    IDE станет для вас лишь одним из инструментов и вас этот вопрос будет волновать в последнюю очередь.
    Ответ написан
    Комментировать
  • Dependecy Property в WPF?

    Nipheris
    @Nipheris Куратор тега C#
    Основная идея стара как само программирование - поставить одни значения в зависимость от других. Система свойств зависимостей - это вариант реализации реактивного программирования.
    Вот Эксель видели когда-нибудь? А формулами пользовались? При изменении значений в ячейках-источниках значения в ячейке с формулой автоматически пересчитывается. Вот это примерно то же самое.
    Ответ написан
    3 комментария
  • Как использовать namespace/классы/методы классов из сторонней dll собранной на C# в проекте на C++?

    Nipheris
    @Nipheris Куратор тега C++
    Методы и классы в дотнет сборках имеют столько же общего с классами в C++, сколько и классы джавы. Т.е. в общем-то ничего. Чтобы обращаться к ним из того же процесса, вам необходимо брать CLR, запускать её и загружать туда интересующую вас сборку. То, что у дотнетовских сборок расширение DLL не должно сбивать вас с толку - это сделано для совместимости в некоторых сценариях, сами сборки мало похожи на DLL.

    Итого у вас 3 варианта:
    1) написать небольшое приложение на Шарпе, из него осуществлять необходимые действия с помощью Facebook C# SDK, и взаимодействовать с ним из основного проекта через IPC. Тогда не придётся самому запускать CLR, достаточно будет запустить этот дотнетовский EXE-шник;
    2) изучить API одной из реализаций .net рантайма (.net framework, .net core, mono), под которой способна работать Facebook SDK, и пользоваться этим API чтобы запускать рантайм в рамках вашего C++ приложения;
    3) воспользоваться документацией к Фейсбуковскому REST API и написать клиента самому на C++ и забыть про указанную вами библиотеку.
    Ответ написан
    1 комментарий
  • Как получить список методов, свойств, полей, событий, классов, структур, интерфейсов в C#?

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

    Вы какую задачу решаете-то?
    Ответ написан
    Комментировать
  • NullReferenceException, при возврате структуры из функции?

    Nipheris
    @Nipheris Куратор тега C#
    скорее всего это cbCOM.SelectedItem, у которого вы пытаетесь вызвать ToString().
    Ответ написан
  • C# в качестве backend под linux, стоит ли?

    Nipheris
    @Nipheris Куратор тега C#
    Также знаем, что вышла стабильная https://github.com/dotnet/corefx

    ASP.NET Core тоже в релизе уже, если веб-апи понадобится.

    Только проверьте, что с сопряжением с другими системами проблем не будет. Например, проверьте что клиентская либа для монги будет работать под .net core. Также и со всем остальным. Ну или будьте готовы участвовать в допиливании библиотек.

    С чем еще текущий бэкенд работает? AMQP, веб-сокеты?
    Ответ написан
    Комментировать
  • System.io mscorlib или system в C#?

    Nipheris
    @Nipheris Куратор тега C#
    Не совсем понятно, зачем вам это. Когда вы пишете using System.IO в текущий скоуп добавляются сущности из всего System.IO, не важно из какой сборки (иными словами, со всех сборок сразу). В этом и смысл пространств имён в дотнете - они предствляют собой способ логического деления проекта и библиотек (в отличие от физического деления на сборки). Если вы не хотите подключать всё, подключите конкретный класс таким образом:
    using StreamReader = System.IO.StreamReader;
    Ответ написан
    2 комментария
  • Можно ли реализовать следущий подход с помощью Generic типов?

    Nipheris
    @Nipheris Куратор тега C#
    interface IFoo
    {
      // Не содержит метод Commit()
      // Но содержит все остальные методы и свойства, которые реализованы в классе Foo
    }
    interface ITransaction
    {
        void Commit();
    }
    class Foo : IFoo, ITransaction
    {
      // ...
      
      public void Commit() 
      {
        // ...
      }
    }

    class Bar<T, TImpl> where TImpl : T, ITransaction, new()
    {
      private readonly TImpl _foo;
    
      protected T Foo {
        get { return _foo; }
      }
    
      public Bar() {
        _foo = new TImpl();
      }
     
      public void Commit()
      {
        _foo.Commit();
      }
    }
    Ответ написан
    3 комментария
  • Как изменить TargetFileName, чтобы было видно версию?

    Nipheris
    @Nipheris Куратор тега C#
    Более правильный метод называется ClickOnce. MSI тоже исключать не стоит (хотя именно вам он видимо не нужен).
    Не изобретайте велосипедов там, где справляются серьезные технологии деплоя.
    Ответ написан
  • Как сделать загрузку файла в фоне из сайта с логином и паролем?

    Nipheris
    @Nipheris Куратор тега C#
    А) Залогиньтесь через WebBrowser, возьмите куку, отдайте WebClient-у, скачайте файл;
    Б) Разберитесь, как происходит авторизация на сайте, проведите её с помощью WebClient, получите куку, установите её в запрос на скачивание файла, скачайте файл.
    Ответ написан
    2 комментария
  • Почему такие данные в рейтинге?

    Nipheris
    @Nipheris Куратор тега C#
    В основном — процессы, связанные с устареванием одних технологий (C#, C++, Objective-C, ActionScript, Perl) и появлением их заменителей (JavaScript, Swift, R, Go).

    Go заменяет C#, C++ и Perl в одном лице? Можно мы не будем обсуждать этот рейтинг?

    По второй ссылке не вижу ничего конкретно про C#. Ну понятно что Джава будет популярнее - MS только начали исправлять ситуацию с псевдокроссплатформенностью C#, отразится это довольно не скоро. Многие метрики учитывают open-source код и открытые данные, а C# язык корпоративный, одному богу известно кто и где на нём сейчас что пишет. Java в общем-то тоже, но проектов в открытом доступе на ней значительно больше.
    Ответ написан
    2 комментария