Задать вопрос
Ответы пользователя по тегу C#
  • Допустимо ли в модели акторов использование акторов как на клиенте, так и на сервере (Akka .NET)?

    ArXen42
    @ArXen42 Автор вопроса
    Думаю, ответа ожидать дальше смысла нет, т.ч. отвечу себе сам тем, что удалось нагуглить (в целом, вопрос можно было бы и удалить, все есть в документации, но может кому пригодится):
    1. В любом случае, серверная ActorSystem должна быть закрыта для постороннего доступа.
    2. Соединение с ней напрямую это плохая практика, использовать IActorRef для взаимодействия с небезопасным клиентом нельзя.
    3. Соответственно, как вариант решения предлагается использование Akka.IO или любой другой более контроллируемый и безопасный способ сетевого взаимодействия с клиентом.
    Ответ написан
    Комментировать
  • Если бы в интерфейсе можно было реализовывать желаемые методы без необходимости реализации в наследниках, то были бы тогда нужны абстрактные классы?

    ArXen42
    @ArXen42
    Уже в общем-то даны подробные ответы, мне по этому вопросу когда-то запомнилось следующее утверждение:
    • Интерфейс описывает, что объект может сделать.
    • Абстрактный класс описывает, чем объект является.
    Ответ написан
    Комментировать
  • (Пример из Unity3d) Проблема с понимаем типов в C#, как оно работает?

    ArXen42
    @ArXen42
    Если очень грубо, moveObject это указатель. Где-то там, в глубине, это IntPtr, обычно являющийся 64 или 32 битным числом. И изначально это число будет равно null (т.е. все нули или какое-нибудь другое условное обозначение "ничего").
    Перед тем как "отдать" этот объект вам (т.е. начать вызывать Start, Update и прочие методы), Unity, как было указано выше, "скрытно и незаметно" присвоит этому полю значение, указывающее на объект, который вы поставили в инспекторе.
    Ответ написан
    Комментировать
  • Как правильно реализовывать события в С#?

    ArXen42
    @ArXen42
    Все работает. Например, такой код
    Eventable<Int32> var = 32;
    var.ValueChanged += () => Console.WriteLine(var.Value);
    
    var.Value = 34;
    var.Value = 42;

    Выведет 34 и 42. Единственное, сеттер значения сделал публичным, чтобы мог снаружи изменить.

    Проблема возможно в том, что вы пытались сделать что-нибудь вроде var = 42, но это ведь не Value изменит, а просто новый объект создаст.

    Оффтоп: MethodContainer лучше заменить на Action. А лучше на Action< T >.
    Оффтоп2: А еще есть INotifyPropertyChanged, хотя, как по мне, он не очень удобен, т.к. использует строковые названия свойств, а не строго типизирован.
    Ответ написан
    2 комментария
  • System.io mscorlib или system в C#?

    ArXen42
    @ArXen42
    Пространства имен это по сути просто синтаксический сахар (ну и немного метаданных вроде), для .net это просто префиксы имен типов. Т.е. то, что выглядит как MyClass, находящийся в пространстве имен MyNamespace, для CLR является типом с именем MyNamespace.MyClass, поэтому MyNamespace.MyClass может быть в одной сборке, а MyNamespace.AnotherClass в другой.
    Ответ написан
    Комментировать
  • Как сделать несколько спрайтов для одного префаба?

    ArXen42
    @ArXen42
    SpriteRenderer.sprite в помощь. Более продвинутый вариант - через анимацию. Сам не изучал вопрос, но оно определенно умеет в состояния, переходы и т.д.
    Ответ написан
    6 комментариев
  • Специфика SystemException?

    ArXen42
    @ArXen42
    Насколько я знаю, сначала MS пытались разграничить системные исключения и исключения приложения - введя базовые классы, емнип, называются SystemException и ApplicationException. Но в процессе разработки платформы все перемешалось и вместо структурированной иерархии получилось вот это, а выкинуть эти исключения они уже не могут из-за обратной совместимости.
    Ответ написан
    Комментировать
  • Как можно райкастом узнать колличество полигонов у объекта?

    ArXen42
    @ArXen42
    Данные можно получить все, т.к. имеется RaycastHit.collider.gameObject. Для получения полигонов, вершин и прочего, емнип, нужно получить компонент Mesh, в нем содержится информация о вершинах и гранях.
    Ответ написан
    2 комментария
  • Сколько памяти занимает тип int в c#, если он наследуется от типа object?

    ArXen42
    @ArXen42
    Это value type, там особого оверхеда на память нет, насколько я знаю, т.е. Int32 свои честные 32 бита и будет занимать. Об этом можно почитать в CLR via C# или вот статья, например:
    https://habrahabr.ru/post/136609/

    Сами по себе методы ничего не занимают, но любой объект (reference type) содержит ссылку на MethodTable, размещенный единожды (см статью).
    Ответ написан
    Комментировать
  • JSON.NET Как написать класс, где поле в json может иметь разный тип данных?

    ArXen42
    @ArXen42
    Можно попробовать сделать data типом Object, но не факт, что рантайм сериализация это дело подхватит. И потом работать с ним в стиле if (data.GetType.IsArray) ... (ужас какой).
    Но, как мне кажется, это плохой подход. Если приходят разные данные - нужно и сущности разные делать. Хотя, конечно, зависит от контекста задачи и т.д.
    Ответ написан
    Комментировать
  • C# Реализация методов работы со стеком на основе массива, в чем ошибка?

    ArXen42
    @ArXen42
    Делал не так давно задание по стеку на массиве, получилось более менее прилично вроде (можно без особых проблем реализацию IEnumerable прикрутить). Код. По заданию требовалось сделать это дело на VB.Net, хоть и писал на С#, исходников не сохранилось, но особой разницы и нет.
    Еще рекомендую заглянуть на MS/Mono реализацию стека, там по сути тоже самое, но более навороченное.
    Ответ написан
    1 комментарий
  • Как сравнить два списка?

    ArXen42
    @ArXen42
    Можно занести результат Interselect в словарь элемент - количество вхождений, потом пробежаться в цикле по листам, подсчитывая конкретное количество. Что-нибудь вроде
    var lst1 = new List<string>(){"1", "2", "3"};
    		var lst2 = new List<string>(){"4", "2", "3"};
    
    		var intersect = new List<String>(lst1.Intersect(lst2));
    		var res = new Dictionary<String, Int32>();
    		intersect.ForEach(el => res.Add(el,0));
    
    		foreach (var el in lst1)
    			if (res.ContainsKey(el))
    				res[el]++;
    		foreach (var el in lst2)
    			if (res.ContainsKey(el))
    				res[el]++;
    
    
    		foreach (var el in res)
    			Console.WriteLine("{0}: {1} раз(а)", el.Key, el.Value);
    Ответ написан
  • В чем разница .NET и C#?

    ArXen42
    @ArXen42
    .NET - платформа, в частности включает в себя CLR, CLS и FCL. C# - один из языков, компилируемых в IL код под эту самую CLR. Также существует альтернативная реализация некоторой части .NET (в т.ч. компиляторы некоторых языков и сама среда исполнения) - Mono.
    P.S. надо же, запомнил наконец эти аббревиатуры.
    Ответ написан
    1 комментарий
  • C#. Операторы доступа для сокрытия, но не для защиты?

    ArXen42
    @ArXen42
    Модификаторы доступа несут скорее информационную функцию, чем защитную. От кривых рук все равно ничто не защитит. Они помогают быстро понять структуру класса, роли его членов и структурировать код.
    Ответ написан
    Комментировать
  • Как соединить модели с помощью мышки в Unity3d?

    ArXen42
    @ArXen42
    Может оказаться полезным посмотреть устройство редактора крафтов в Kerbal Space Program. Там он толково сделан (по крайней мере процесс соединения деталей). Там и радиальное крепление, и по определенным точкам (на "ноды").
    Ответ написан
    Комментировать
  • Как написать игру только с использованием скриптов в Unity?

    ArXen42
    @ArXen42
    Возможно вам поможет описание моей игры - тоже новичок, но делаю уже более полугода, общая архитектура более менее устаканилась. Суть игры вдохновлена Космическими Рейнджерами - вселенная, состоящая из звезд, основное место действия - звездные системы, игра протекает внутри них. Соответственно до старта игры ни одного объекта практически и нет - только пустышки и скрипты на них, ну и UI. При старте игры из сохранения (либо случайно генерируется) вселенная - массив звезд, которые в свою очередь содержат планеты, пояса и т.д. Эти данные никак не связаны с MonoBehaviour, просто статический массив (List на самом деле, но не суть). При старте игры опять же из сохранения берется местоположение игрока, информация о его корабле и в соответствии с этим
    1)Спаунится текущая система: солнце, планеты (есть префаб планеты, при спауне висящий на нем скрипт накладывает случайно генерируемую текстуру, а другой скрипт размещает в пространстве в соответствии с заданными параметрами орбиты) и т.д.
    2)Спаунится игрок (а в будущем и другие игроки)
    Таким образом сцена содержит только пустышку игрока с повешенными на него скриптами и объекты UI. Все остальное создается по ходу игры.
    Ответ написан
    Комментировать
  • Как получить элементы массива или списка через рефлекцию (отражение, reflection)?

    ArXen42
    @ArXen42 Автор вопроса
    Не знаю, как оно работает, но получилось вот так:
    Type objType = obj.GetType();
    if (objType.IsArray)
    		{
    			IEnumerable array = obj as IEnumerable;
    			foreach (var element in array)
    				//Действия над элементами
    		}


    За Invoke спасибо, теперь хоть знаю, что это такое и зачем. Я сначала пытался сделать так:
    for (int i = 0; i < (int)(objType.GetProperty("Length").GetGetMethod().Invoke(obj))); i++)
    				var element = objType.GetMethod("GetValue", typeof(int)).Invoke(obj, i);

    Но оно вызывает ошибки, как минимум первый Invoke для получения длины массива. Для общего развития, что здесь не так?

    P.P.S. прикладываю ошибки:
    d4c9c4838d0d4fefac017e3b18ee02c7.png
    //------------------------------------------------------------
    99b277b48dc64d9e81cf829e6eaee59a.png
    Ответ написан
  • Unity учебник по программированию?

    ArXen42
    @ArXen42
    Некропост, но все же. Книг по юнити практически нет, есть одна "Unity Game Essentials", но полезной информации там не очень много. Самое первое, что стоит изучить перед юнити - C# и главное, его ООП. Потому что вся система скриптов юнити построена на ООП и безе него лично мне сейчас приходится туго. А дальше начинаешь что-нибудь делать и по ходу изучаешь классы юнити.
    Ответ написан
    Комментировать