Ответы пользователя по тегу C#
  • Стажировка .NET, какие требования?

    arusef
    @arusef
    Novice .NET dev
    Дело в том, что в .NET очень много разных направлений, и, естественно, спрашивать можно много чего. Но классически, это всё выглядело так:
    • Несколько вопросов про C#, ООП, может быть что-то на сообразительность, типа "поменяйте местами значения двух переменных без третьей переменной"
    • Несколько вопросов про SQL и архитектуру, типа, "зарисуйте таблицы, чтобы там хранилось то-то и то-то и составьте запросы"
    • Вопросы по ASP.NET, MVC, конфигурации сервера, сетевые протоколы...
    • Опционально вопросы по HTML/JS
    • Обязательно собеседование с HR, личные вопросы и неформальная беседа, в процессе которой выявится ваша адекватность, способность работать в команде и т.д. Могут поинтересоваться вашим опытом работы и всем,
      что с этим связано.

    Если практика ближе к десктопу, то, соответственно, могут больше спрашивать про WinAPI, WPF, XAML и прочие вещи.
    Вот есть небольшой список вопросов, по которым можно пройтись и немного подготовиться к собеседованию.
    Ответ написан
    Комментировать
  • Какой уровень математики нужен в GameDev (Unity, UE4)?

    arusef
    @arusef
    Novice .NET dev
    AAA-проекты не пишут математики. Вам нужно знание sdk и умение программировать. А подкруткой физики, освещением, моделями и прочим займётся команда специальных людей в этом проекте. Равно как и сценарием, локациями, звуком... вплоть до того, что затюнят движок под нужды проекта.
    Но всё же, если отвечать по существу: в этих движках 99% физики уже реализовано и вам математику не нужно знать вообще. Ну разве что на уровне понимания координат/векторов и всякого такого. Если нужно что-то сверх того, то вам необходимо знать математику очень хорошо. И не просто, а с умением разбираться или составлять нужные алгоритмы для машины.
    Ответ написан
    1 комментарий
  • Небольшой CodeReview?

    arusef
    @arusef
    Novice .NET dev
    Если хотите ревью кода, то вот:

    1. Использование Convert.ToInt32 вместо Int32.TryParse (или обработки исключений) ведёт к непредвиденному завершению программы в некоторых случаях.
    2. При попадании в блок default у вас просто выйдет управление из switch, после чего программа продолжится и её работа окажется неверной.
    3. Цикл с вызовом Random.Next можно сократить до 1 строчки, убрав скобки и лишнюю переменную.
    4. Можно было бы разбить такой большой Main на несколько функций. Практической пользы в данном случае не так много, но читаемость повысило бы, да и вообще.
    5. Вы уверены, что там нужно делить на 5 именно счетчик цикла в условиях?
    Ответ написан
    Комментировать
  • Почему при вызове унаследованого метода он не видит значения переменных объявленные в текущем классе?

    arusef
    @arusef
    Novice .NET dev
    Потому что ключевое слово new при объявлении члена класса скрывает реализацию базового члена. Если хотите сделать член, доступный через ссылку на базовый класс - объявляйте его только в базовом классе. Если хотите переопределить реализацию виртуального метода - используйте ключевое слово override.
    И вообще, вам стоит подтянуть понимание ООП.
    Ответ написан
    4 комментария
  • Метод Object.MemberwiseClone() и и обработчики событий?

    arusef
    @arusef
    Novice .NET dev
    Метод MemberwiseClone делает неполную копию объекта (ValueType копируются по значению, а вот для ссылочных типов копируется только ссылка), поэтому во втором объекте у вас лежит ссылка на всё тот же MyEventHandler из первого объекта.
    Попробуйте в методе MyEvent.Clone изменить правую строку с MemberwiseClone на просто new MyEvent(). А вот в методе EventDemo.Clone дописать evt.SomeEvent += Handler;
    Ответ написан
  • Как создать новый экземпляр класса, а не присваивать ссылку?

    arusef
    @arusef
    Novice .NET dev
    Есть метод MemberwiseClone, он делает примерно то же, что вы описали. Но вложенные ссылочные типы не будут копироваться, будет копирована лишь ссылка.
    Ответ написан
    1 комментарий
  • Как прописать взаимодействие игрока с объектом?

    arusef
    @arusef
    Novice .NET dev
    1. Проверьте, стоит ли у объекта вашего игрока тег "Player".
    2. Привязали ли вы в инспекторе (или где-то ещё) объект рычага к GO.
    3. Проверьте, является ли коллайдер у рычага триггером, и может ли игрок с ним взаимодействовать.
    4. GameObject.activeSelf может иногда возвращать не то значение, если активность объекта установлена не вами, а кем-то в иерархии. Проверьте, нет ли у вас такого, что в SetActive всё время передается false, например.
    Для того, чтобы просмотреть значения в ходе исполнения программы, можете воспользоваться выводом отладочной информации Debug.Log
    Ответ написан
    Комментировать
  • Как перейти с Unity на Ue4?

    arusef
    @arusef
    Novice .NET dev
    1. Почитайте Страуструпа, например.
    Полезная инфа
    Ссылка гуглится за 5 секунд. https://tproger.ru/books/cpp-books-definitive-guide/

    2. Изучите STL.
    3. Читайте документацию.

    И помните, что С++ довольно сильно отличается от управляемых языков, типа C#. Разработчики UE, конечно, постарались сделать всё, чтобы было меньше геморра (взять те же Blueprints), но всё же. Так что учите модель работы с памятью, учите синтаксис, учите библиотеку, и всё у вас будет хорошо.
    Алсо, UE на первых порах слабо отличается от Unity, так что вам будет легче.
    Ответ написан
    Комментировать
  • Как создать ссылку на строку внутри объекта класса, которая указывает на переменную вне объекта?

    arusef
    @arusef
    Novice .NET dev
    Это невозможно в рамках C#, потому что тип string - неизменяемый тип. Каждая новая строка имеет свой собственный экземпляр string (такое же поведение имеют все ValueType).
    Если хотите добиться иного поведения, нужно использовать System.Text.StringBuilder.
    Например:
    public class stateEnterWord
            {
                private StringBuilder word;
                public void init(StringBuilder input)
                {
                    word = input;
                }
                public void startExecution()
                {
                    word.Append(Console.ReadLine());
                }
            }
      static void Main(string[] args)
            {
                stateEnterWord obj = new stateEnterWord();
                StringBuilder Name = new StringBuilder();
                obj.init(Name);
                obj.startExecution();
                Console.WriteLine(Name.ToString());
            }

    Однако, если честно, это нарушает принципы ООП.
    Ответ написан
  • Как открывать файлы .cs в пользовательском интерфейсе?

    arusef
    @arusef
    Novice .NET dev
    Если у вас консольное приложение спроектировано правильно и умеет принимать параметры командной строки, то можно воспользоваться методами System.Diagnostics.Process.Start, передать параметры в новый процесс, перенаправить поток вывода и считать оттуда информацию.

    Если же нет, и переписать консольную программу нет возможности (а спецификация требует использования именно
    этой сборки), тогда можно воспользоваться System.Reflection.Assembly, подгрузить инстанс класса основной программы, вызвать метод Main (или любой другой) и передать список аргументов. Кстати, в данном случае очень неплохо может облегчить жизнь тип dynamic, так как многие вещи он сам умеет распознавать. У такого подхода много минусов, но он рабочий, если нужна динамическая подгрузка.

    Ну и, наконец, самый разумный способ: просто переписать весь код основной логики из консольной программы в какую-нибудь отдельную .dll, подключить её к своему проекту и использовать методы и сущности напрямую. Если исходного кода нет - можно воспользоваться Reflector'ом, например. (Причём это если нельзя дотнетовский .exe подключить сразу, без переписывания. Но с таким я не сталкивался.)
    Ответ написан
    2 комментария
  • Возможно ли функциональное программирование в C# без LINQ?

    arusef
    @arusef
    Novice .NET dev
    Вполне возможно. Смотрите:
    static IEnumerable<TResult> Map<TIn, TResult>(this IEnumerable<TIn> seq, Func<TIn, TResult> mapper){
        foreach(TIn item in seq) yield return mapper(item);
    }
    enum Parity { Even, Odd }
    static void Test(){
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
        Func<int, Parity> parity = (num) => num % 2 == 0 ? Parity.Even : Parity.Odd ;
        foreach(var parity in numbers.Map(parity)) 
            Console.Write(parity.ToString() + ", ");
    }

    Это выведет на экран "Odd, Even, Odd, Even, Odd, Even, ".
    Чем вам не функциональный подход? И LINQ здесь нет (разве что самодельный).
    Ответ написан
    Комментировать
  • Симуляция и непрерывное считывание нажатия клавиш в c#?

    arusef
    @arusef
    Novice .NET dev
    Можете воспользоваться фреймворком SlimDX.
    Ответ написан
    Комментировать
  • Для этого ли нужны делегаты?

    arusef
    @arusef
    Novice .NET dev
    Нет, это не жизненный пример. Это вообще очень странный пример, и никто в здравом уме не будет вызывать нестатический метод на имени типа. В данном случае расово верным и единственным рациональным решением было бы обратиться к этому методу, как var ret = instance.Method("string");.

    Однако, возвращаясь, собственно, к теме самих делегатов и их жизненного применения. Самым классическим примером была бы реализация функции Where (которая поставляется в LINQ).
    // in static class
    IEnumerable<TElement> Where(this IEnumerable<TElement> source, Predicate<TElement> filter){
       // для простоты опустим проверки и т.д.
       foreach(TElement elem in source)
          if(filter(elem)) yield return elem;
    }
    // ... usage ...
    var list = new List<int> { 1, 2, 3, 4, 5, 6 };
    var ret = list.Where(elem => elem % 2 == 0);
    foreach(int e in ret)
       Console.Write(e + " ");
    // ...

    В данном случае функция перебирает каждый элемент в перечислении source, вызывает функцию filter (функция, которая принимает значение типа TElement и возвращает bool), и возвращает текущий элемент, если возвращённое filter значение было true.
    После выполнения фрагмента кода, на экран было бы выведено "2 4 6 ".
    Ответ написан
    Комментировать
  • Быстрый поиск по базе. Что выбрать?

    arusef
    @arusef
    Novice .NET dev
    Не нравится SQL - пользуйтесь NoSQL, например MongoDB. Там заодно и индексы поддерживаются и всякое такое. Можно организовать и дерево. А можно метрическое пространство по кастомным хешам строк. Это уж как захочется.
    Ответ написан
    Комментировать
  • Как для List.ForEach() определить текущий элемент?

    arusef
    @arusef
    Novice .NET dev
    Метод List<TElement>.ForEach(Action<TElement>) принимает в качестве параметра делегат (то есть, по сути, указатель на функцию), который обрабатывает каждый элемент списка.
    Запись такого вида:
    var list = new List<int>() { 1, 2, 3 };
    list.ForEach(element => { Console.Write(element * element + " "); } );

    Выведет на экран следующее: 1 4 9

    Этот кусок кода полностью эквивалентен такому:
    void Method(){
       var list = new List<int>() { 1, 2, 3 };
       list.ForEach(Square);
    }
    void Square(int element){
       Console.Write(element*element + " ");
    }


    Таким образом, и в первом и во втором случае, переменная element является текущим обрабатываемым значением из списка.
    Ответ написан
    Комментировать
  • Как установить размеры picturebox по размеру нарисованной информации?

    arusef
    @arusef
    Novice .NET dev
    Свойство PictureBox.SizeMode позволяет регулировать отображение картинки внутри PictureBox. Например, можно "замостить" изображение, или растянуть по размерам самого элемента управления.
    Ответ написан
    Комментировать
  • Как создать группу элементов в форме?

    arusef
    @arusef
    Novice .NET dev
    Действительно, UserControl - то что нужно в такой ситуации. Создайте пользовательский элемент управления с необходимым содержимым, выведите основные его свойства, и размещайте в своём приложении, как будто это единый элемент.
    Могу посоветовать книгу "WPF 4 Unleashed", by Adam Nathan, тут - глава 20 (стр. 795) про UserControl.
    Ответ написан
    Комментировать