Всем привет!
Меня зовут Алекс Силаев и последние 15 лет я занимаюсь разработкой в Unity. До этого была backend-разработка, БД и прочие интересные штуки.
В данный момент занимаю позицию CTO в компании Zillion Whales (основной проект Mushroom Wars).
Будем обсуждать интересные темы в формате конференций (да, с голосом, да, с видео), помимо этого буду делиться интересными штуками, наблюдениями, решениями, лайфхаками и прочим.
Основная тема - C# и Unity.
Мой github: http://github.com/chromealex
Меня зовут Алекс Силаев и последние 15 лет я занимаюсь разработкой в Unity. До этого была backend-разработка, БД и прочие интересные штуки.
В данный момент занимаю позицию CTO в компании Zillion Whales (основной проект Mushroom Wars).
Будем обсуждать интересные темы в формате конференций (да, с голосом, да, с видео), помимо этого буду делиться интересными штуками, наблюдениями, решениями, лайфхаками и прочим.
Основная тема - C# и Unity.
Мой github: http://github.com/chromealex
👍7🐳2
❓А знаете ли?
В C# строки хранятся в памяти в единственном экземпляре. Называется интернирование. Код
не будет создавать 2 строки, а будет использовать ссылку на один и тот же объект (да, строка - это Reference Type).
#strings
В C# строки хранятся в памяти в единственном экземпляре. Называется интернирование. Код
if (str1 == “something” || str2 == “something”)не будет создавать 2 строки, а будет использовать ссылку на один и тот же объект (да, строка - это Reference Type).
#strings
👍18🥱6👎3🤯3💩1
❓А знаете ли?
Чтобы атомарно изменить значение переменной можно использовать
#threading
Чтобы атомарно изменить значение переменной можно использовать
lock, но это один из самых долгих способов. Гораздо быстрее использовать Interlocked методы. В некоторых случаях (в хот частях) лучше вообще обходиться без синхронизаций между потоками.#threading
👍7💩2🥱1
Для сравнения Unity Object с
#code
null можно использовать конструкцию if (obj is null) вместо if (obj == null). А еще если obj - это Unity Object, то оператор == перегружен и проверяет не только фактический null на стороне C#, но и объект на стороне C++. Тот же эффект достигается при использовании ReferenceEquals.#code
👍14🥱2💩1
Вы можете написать метод
* Результат метода должен вернуть структуру или объект, в котором есть метод
* При использовании интерфейса
#code #foreach
GetEnumerator в любой структуре или классе, это позволит использовать конструкцию foreach. Но есть несколько моментов, которые стоит понимать:* Результат метода должен вернуть структуру или объект, в котором есть метод
MoveNext и свойство Current;* При использовании интерфейса
IEnumerable (например, в List<>) при любом использовании foreach или GetEnumerator значение будет запаковано (boxing) и избежать этого уже никак не выйдет.#code #foreach
👍6💩1🥱1
🥕Ну и задачка, пишите ответы в комменты;)
Что означает конструкция
1. Это не будет компилироваться;
2. Это же простое умножение, можно записать как
3. Это будет работать только в unsafe, двигаем val на index (на сколько - зависит от типа val), получаем данные по указателю;
4. Встречал такое, но точно не знаю как это работает;
5. Свой вариант.
#unsafe
Что означает конструкция
a = *(val1 + val2);?1. Это не будет компилироваться;
2. Это же простое умножение, можно записать как
a = a * (val1 + val2);3. Это будет работать только в unsafe, двигаем val на index (на сколько - зависит от типа val), получаем данные по указателю;
4. Встречал такое, но точно не знаю как это работает;
5. Свой вариант.
#unsafe
👍8
Можно вызывать
#assembly
internal методы из других assembly, но для этого нужно разрешить другим assembly видеть эти методы. Для этого нужно написать аттрибут InternalsVisibleTo с указанием имени assembly, которая будет видеть internal-методы.[assembly: InternalsVisibleTo("Friend.Assembly.Name")]#assembly
👍17🥱3💩1🤨1
🥕Задачка
Вы наверняка знаете, что можно сделать static constructor. Для этого нужно просто написать
Но иногда хочется получить static destructor у этого же класса.
На практике я с таким столкнулся, когда в конструкторе я выделял память, которую нужно было где-то удалять.
Вопрос знатокам: каким образом вы бы решили такую проблему? Попробуйте не гуглить;) Своим решением поделюсь чуть позже.
Вы наверняка знаете, что можно сделать static constructor. Для этого нужно просто написать
static MyClass() и сделать там свои грязные делишки.Но иногда хочется получить static destructor у этого же класса.
На практике я с таким столкнулся, когда в конструкторе я выделял память, которую нужно было где-то удалять.
Вопрос знатокам: каким образом вы бы решили такую проблему? Попробуйте не гуглить;) Своим решением поделюсь чуть позже.
👍5😢1
При сериализации структур в бинарь можно использовать подход
#unsafe
*(T*)ptr = value, где ptr - указатель на массив byte, а value - данные, которые мы хотим туда записать. Если вы используете managed массив, то не забудьте использовать fixed.#unsafe
👍3
Всем привет! Я хотел бы проводить общие созвоны раз в неделю, чтобы пообщаться, рассказать о каких-нибудь проблемах, найти решение.
В какое время и в какой день вам было бы удобно это?
В комментах будет опрос про время.
В какое время и в какой день вам было бы удобно это?
В комментах будет опрос про время.
Final Results
8%
Понедельник
8%
Вторник
4%
Среда
4%
Четверг
9%
Пятница
47%
Суббота
21%
Воскресенье
Метод
#code
Array.Resize не проверяет размер массива в сторону уменьшения. То есть всегда будет выделен массив необходимого размера на выходе.#code
👍7🤡4
🥕Регистрация на событие.
Пройдет в эту субботу с 2х до 3х часов по Москве.
https://unsafecsharp.timepad.ru/event/2436586/
Пройдет в эту субботу с 2х до 3х часов по Москве.
https://unsafecsharp.timepad.ru/event/2436586/
unsafecsharp.timepad.ru
Знакомство / События на TimePad.ru
Будем знакомиться и обсуждать общие темы;)
https://news.1rj.ru/str/unsafecsharp
https://news.1rj.ru/str/unsafecsharp
👍5🤮1