Я работаю над библиотекой, и у меня возникают некоторые проблемы с поиском правильного способа придумать правильную структуру API, которая обеспечивает эффективность кода без необходимости иметь кучу различных перегрузок для каждого доступного API.
Скажем, у меня есть этот метод:
public static Brush CreateDummyBrush(Color tint, float mix, float blur)
Теперь я хочу, чтобы пользователь также получил экземпляр EffectAnimation
для этих анимаций оттенка и размытия, чтобы он мог анимировать их вбудущее.Предположим, что EffectAnimation
это просто delegate
, который запускает анимацию для возвращенного Brush
.Полный код здесь , на всякий случай.
public static Brush CreateDummyBrush(
Color tint, float mix, out EffectAnimation mixAnimation,
float blur, out EffectAnimation blurAnimation)
Теперь это прекрасно , если пользователь хочет получить delegate
для обоиханимации.Но, скажем, мне нужно только анимировать эффект размытия, тогда я бы назвал этот API следующим образом:
Brush brush = CreateDummyBrush(Colors.Gray, 0.6f, out _, 8, out var blurAnimation);
Это работает, но библиотека заканчивает тем, что выделяет бесполезный delegate
, который не имеет смысла,поскольку он просто отбрасывается.
Быстрое решение состоит в том, чтобы создать 4 различные перегрузки, чтобы покрыть различные комбинации параметров out
.Но это определенно неправильный подход: слишком много беспорядка, и количество API становится слишком большим, если у меня есть, скажем, 3 out
параметров.
Итак, мой вопрос: может ли вызывающая сторона проверить, является ли вводout
параметр на самом деле является действительной ссылкой, или если использовался идентификатор сброса?Я знаю, что в C # есть множество скрытых трюков и API, есть ли что-то, что могло бы достичь этого?
Большое спасибо!