• C# Reflection - скорость приемлемая или всё-таки медленно?

    teoadal
    @teoadal Автор вопроса
    .NET + AS3
    var stopwatch1 = new Stopwatch();
    stopwatch1.Start();
    var toString = typeof(int).GetMethod("ToString", new Type[0]);
    for (var i = 0; i < 10000000; i++)
    {
           toString.Invoke(i, null);
    }
    
    stopwatch1.Stop();
    stopwatch1.Elapsed.Dump();
    
    var stopwatch2 = new Stopwatch();
    stopwatch2.Start();
    for (var i = 0; i < 10000000; i++)
    {
           i.ToString();
    }
    
    stopwatch2.Stop();
    stopwatch2.Elapsed.Dump();

    Коллега сделал тест.
    С рефлексией: 00:00:03.3708027
    Без рефлексии: 00:00:01.4555174
    Ответ написан
    Комментировать
  • Программируете ли вы в свободное время?

    teoadal
    @teoadal
    .NET + AS3
    Также, как и вы - вечером GameDev. Проблем с переключением между работой и игровой задачей не наблюдаю, так как всюду есть план разработки: сегодня я занимаюсь тем то, вечером делаю то-то, утром я там-то.

    Лайфхак тут, лично для меня, именно в планировании. Плюс, конечно же нужно не забывать об отдыхе. Во всяком случае, выходные в 80% случаев это отдых. Если отдых активный, да ещё с выездом на природу - самочувствие и работоспособность восстанавливаются быстро.

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

    Резюмирую:
    1. План разработки.
    2. Отдых нужен. Желательно активный, на природе.
    3. Женщины тоже обязательно.
    4. Сон обязателен и в нормальные для человеческом особи часы.
    5. Мозг должен иметь возможность расслабляться. Загружайте его информационным шумом по минимуму.

    Ответ написан
    2 комментария
  • C#. Как реализовать межпроцессорное взаимодействие?

    teoadal
    @teoadal
    .NET + AS3
    Я использую вот такой украденный где-то код. Он контролирует, что приложение создано, работает, а если запускается ещё одно такое же - сообщает об этом.
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    using System.Threading;
    
    namespace Pressmark.Service
    {
        [Serializable]
        class SingletonController : MarshalByRefObject
        {
            private const string ControllerName = "PressMarkInstance";
            private static TcpChannel _mTcpChannel = null;
            private static Mutex _mMutex = null;
    
            public delegate void ReceiveDelegate(string[] args);
    
            static private ReceiveDelegate _mReceive = null;
            static public ReceiveDelegate Receiver
            {
                get { return _mReceive; }
                set { _mReceive = value; }
            }
    
    
            public static bool IamFirst(ReceiveDelegate r)
            {
                if (IamFirst())
                {
                    Receiver += r;
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            public static bool IamFirst()
            {
                _mMutex = new Mutex(false, "PressMarkInstance");
    
                if (_mMutex.WaitOne(1, true))
                {
                    //We locked it! We are the first instance!!!    
                    CreateInstanceChannel();
                    return true;
                }
    
                //Not the first instance!!!
                _mMutex.Close();
                _mMutex = null;
                return false;
            }
    
            private static void CreateInstanceChannel()
            {
                _mTcpChannel = new TcpChannel(1234);
                ChannelServices.RegisterChannel(_mTcpChannel, false);
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(SingletonController), ControllerName,
                    WellKnownObjectMode.SingleCall);
            }
    
            public static void Cleanup()
            {
                if (_mMutex != null)
                {
                    _mMutex.Close();
                }
    
                if (_mTcpChannel != null)
                {
                    _mTcpChannel.StopListening(null);
                }
    
                _mMutex = null;
                _mTcpChannel = null;
            }
    
            public static void Send(string[] s)
            {
                TcpChannel channel = new TcpChannel();
                ChannelServices.RegisterChannel(channel, false);
                SingletonController ctrl = (SingletonController)Activator.GetObject(typeof(SingletonController), "tcp://localhost:1234/" + ControllerName);
                ctrl.Receive(s);
            }
    
            public void Receive(string[] s)
            {
                if (_mReceive != null) _mReceive(s);
            }
        }
    }


    Соответственно, программа, когда запускаемся (у меня WPF приложение), на нем висит слушатель события запуска. Если процесс уже существует - забираем из него коммандную строку и убиваем процесс.

    private void App_OnStartup(object sender, StartupEventArgs e)
            {
                if (!SingletonController.IamFirst(RunCommand))
                {
                    var args = e.Args;
                    if (args.Length == 0) args = new[] { "newwindow" };            // если мы просто пытаемся открыть новый документ, а сервис уже запущен
                    SingletonController.Send(args);
                    Current.Shutdown();
                    return;
                }
    
                RunCommand(e.Args);
                if (OpenedDocuments.Count == 0) CreateNewWindow(null);          // если ещё ни одного окна не создано, создаем его пустое.
            }


    Не очень прозрачно (давно хотел переделать, но руки не доходили), но разобраться можно. Соответственно, RunCommand и CreateNewWindow методы вам нужно реализовать самому.
    Ответ написан
  • Как сформировать правильный Code First?

    teoadal
    @teoadal
    .NET + AS3
    public int CustomerID { get; set; }
    public virtual Customer Customer { get; set; }
    Ответ написан
    Комментировать
  • Как организовать процесс разработки мобильной игры?

    teoadal
    @teoadal
    .NET + AS3
    Погодите... Unity3d позволяет всё сделать в себе, а потом просто скомпилировать проект под любую платформу, в т.ч. WPhone. Т.е. не нужно ничего никуда "портировать".
    Ответ написан
    2 комментария
  • Какие порекомендуете статьи на русском про архитектуру WEB-приложений?

    teoadal
    @teoadal
    .NET + AS3
    Steven C. McConnell, "Совершенный код"? Не про серверное ни разу, но может пригодиться. Описывают вот тут, можно почитать критику в комментариях: habrahabr.ru/post/77471
    Ответ написан
    Комментировать
  • Как нарисовать такую форму в WPF?

    teoadal
    @teoadal
    .NET + AS3
    Если только на пальцах... На русском книгу не подскажу.

    Вам надо смотреть в сторону точек привязки. В WPF всё привязывается друг к другу, к краям и к направляющим линиям (такие "синие полоски" которые можно установить посередине окна). Причем привязываться можно разными краями.

    Например, дропбокс с надписью "Все" у вас привязан к правому ли левому краю. И поэтому при увеличении размера окна он растягивается. Надо отвязать его от левого края и тогда он не изменит размера, а просто отодвинется к правому. У вас ведь нижняя часть окна адекватно расходится вправо. Смотрите как там и делайте тоже самое с дропбоксом.

    Теперь по поводу самой таблицы. Я давно работал с WPF, так что могу ошибаться. Но где-то там тоже есть привязки самих столбцов к направляющим и краям. Возможно, в коде. Возможно, это можно сделать как-то визуально.
    Ответ написан
  • Как хранить объекты?

    teoadal
    @teoadal
    .NET + AS3
    Если вопрос в хранении по время исполнения программы, так тут List, Dictionary и просто массивы. Queue и Stack тоже есть. Рекомендую использовать обобщенные варианты, т.е. List, Dictionary, т.е. параметризированные типом.

    С точки зрения архитектуры - в слой доступа к данным. Создайте декоратор какой-нить, который работает с хранилищем и вперед - все ваши объекты туда. Пусть декоратор реализует какой-нить интерфейс ICollection. Вот и будет вам и Add, и Remove, и Get и GetAll. Можно даже static его сделать - пусть будет доступен откуда угодно.
    Ответ написан
    Комментировать
  • Task или Thread в C#.NET 4.0 WPF?

    teoadal
    @teoadal
    .NET + AS3
    ЕМНП, главные отличия: Task берется из пула потоков (следовательно накладных расходов по созданию практически нет), а Thread - поток создается сам (с накладными расходами, но большей свободой, например - дать имя). Пул ограничен в количестве (новые будут ставиться в очередь), Thread можете создавать как хочется и когда хочется, но при превышении критической массы, они будут вызывать скорее торможение, чем ускорение.

    В .NET 4.5 появились async/await - это синтаксический сахар, который делает код более красивым и понятным. .NET 4 для тех же целей можно пользоваться вот этим: blogs.msdn.com/b/bclteam/archive/2012/10/22/using-...
    Ответ написан
    Комментировать
  • С каких книг начать изучение C#!?

    teoadal
    @teoadal
    .NET + AS3
    Тут многие отвечают на вопрос "С каких книг начать изучение C#", а в вашем вопросе интерес скорее к C# для Unity3D, т.е. языку "скрипта". И вот тут зарыта одна проблема.

    Дело в том, что Unity3D использует далеко не самую последнюю версию языка C#. Если вы обратили внимание, то проекты под юнити это проекты под .NET 3.5 (насколько я помню). Если грубо: многих фишек из C# 5 там нет вообще, многое работает не так, как хотелось бы.

    Я бы рекомендовал да, начать с азов (Троелсена уже советовали), но всегда делать поправку на Unity3D. Начать с вот тут: docs.unity3d.com/ScriptReference . А вот что поддерживается Unity3D относительно C# (и платформы .NET) - docs.unity3d.com/ScriptReference . Если обратите внимание, там вообще почти всюду упоминается NET 2.0. Для меня в свое время это было большим разочарованием.

    Резюмирую: так как C# нужен для Unity3D, смотрите именно туда, а не на книги по самой последней версии языка C#. Если нормально с английским, Learning C# by Developing Games with Unity 3D Beginner's Guide (2013, Terry Norton) и C# Game Programming Cookbook for Unity 3D (2014, Jeff Murray).
    Ответ написан
    1 комментарий
  • Что означает данное выражение?

    teoadal
    @teoadal
    .NET + AS3
    var (это означает, что тип определяется компилятором) x = y ?? (это проверка на null) 10.
    Если y = null, то x = 10. Если y != null, x = y.

    При этом важная штука - y должен быть либо ссылочным значением, либо Nullable. Т.е. y скорее всего объявляется как int? y.
    Ответ написан
    Комментировать
  • C# или ActionScript?

    teoadal
    @teoadal Автор вопроса
    .NET + AS3
    Выскажу пока свои доводы:
    • C# это перспективно, язык развивается - ActionScript не развивается.
    • При наличии клиент-серверного взаимодействия, C# предлагает единую платформу и понятийный аппарат клиента и сервера.
    • C# это много чего из коробки - ActionScript в FlashDevelop это почти ничего, даже кнопку нужно программировать с нуля.
    • C# это передовые технологии: LINQ, обобщенные классы и методы, внятная асинхронность (с async/await в .NET 4.5).
    • C# это огромное сообщество разработчиков - ActionScript умирающая технология.
    • У C# есть WPF (XAML) и Blend, если очень хочется рисовать кнопки как в Adobe Illustrator.
    • C# это Visual Studio, одна из мощнейших IDE - ActionScript в нашем случае это FlashDevelop. Не конкурент.


    Интересно было читать по моей теме вот это: habrahabr.ru/post/66047
    Ответ написан
  • Где найти базу программ на C#?

    teoadal
    @teoadal
    .NET + AS3
    Можно, например, вот тут: code.msdn.microsoft.com
    Ответ написан
    Комментировать