TGViewer
Unity: Всё, что вы не знали о разработке Unity: Всё, что вы не знали о разработке @unsafecsharp · 1.74K subscribers
Post #281 3.16K
Удобное API

Вы наверняка сталкивались с такой проблемой:

void Method<T>(System.Action<T> callback) {...}

То есть мы хотим вызвать метод, который вернет нам колбэк в какой-то момент. Например, что действие завершено. Все вроде хорошо, но если мы начнем это использовать, то сталкнемся с другой проблемой:

Method<MyObj>(static (obj) => {
// И вот тут нам явно не хватает данных при static
});

Отсюда 2 выхода: либо мы используем аллокации при замыкании, либо реализуем некий второй параметр, в который мы сможем положить любые данные:


void Method<T1, T2>(T1 t1, System.Action<T1, T2> callback) {...}


С точки зрения метода будем считать, что T1 - это замыкание, которое мы передаем в метод:


Method<int, MyObj>(123, static (closure, obj) => { ... });


Вроде уже неплохо, но что если у нас вместо простого int будет что-то сложнее, например, кортеж ValueTuple:


Method<ValueTuple<int, int>, MyObj>((123, 234), static (closure, obj) => { ... });


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

И тут тоже есть элегантное решение:


struct ClosureAPI<TClosure> {
public TClosure data;
public MyContainer container;
public Method<T>(System.Action<T, TClosure> callback) {
this.container.Method(this.data, callback);
}
}

ClosureAPI<TClosure> Closure<TClosure>(TClosure data) {
return new ClosureAPI<TClosure>() {
data = data,
container = this,
};
}

void Method<T1, T2>(T1 t1, System.Action<T1, T2> callback) {...}


Таким образом снаружи это будет выглядеть как:

container.Closure((123, 234)).Method<MyObj>(static (data, obj) => { ... });


Вот таким образом мы избавляемся от необходимости указывать дженерик тип, который используем.

Естественно, если вы передаете все инстансы в метод, то вам не нужно указывать типы, но если (как в примере выше) у вас тип передаете только как дженерик, то такой подход избавит от необходимости указывать дженерик замыкания.

#zeroalloc #architecture #code
  • 🔥 24
  • 🤔 9
  • ❤ 6
  • 👍 2
More from @unsafecsharp
  1. Mar 2, 2026Век живи - век учись Я вот только сегодня узнал, что оказывается можно писать не только та…
  2. Feb 10, 2026Overlay У юнити, начиная с 2022.2, появилась возможность рисовать свои окна в SceneView, п…
  3. Dec 7, 2025Простые лайфхаки Часто встречаю в разных проектах подобные конструкции (на самом деле обыч…
  4. Nov 18, 2025Довольно интересная задачка попалась на собеседовании в гугле: Есть матрица (массив массив…
  5. Oct 12, 2025Unity.Profiling.IgnoredByDeepProfilerAttribute Аттрибут, который спасет вам время, если у…
  6. Oct 6, 2025Рукожопы (других слов нет) выпустили апдейт юнити, в котором отломали uitk в инспекторе. Т…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →