Выходные параметры или обратные вызовы? - PullRequest
0 голосов
/ 29 марта 2020

Если у меня есть такой класс ...

public class Singleton
{
    public static Singleton Instance { get; private set; }
}

И у него есть эти два метода ...

public static bool TryGetInstance(out Singleton instance)
{
    return (instance = Singleton.instance) != null;
}

public static void GetInstance(Action<Singleton> callback)
{
    if (instance != null)
    {
        callback?.Invoke(instance);
    }
}

Один из них, как вы видите, присваивает значение к параметру out и возвращает bool, и его можно использовать следующим образом ...

if (Singleton.TryGetInstance(out Singleton singleton))
{
    // Do something with singleton...
}

А другой проверяет, является ли экземпляр singleton ненулевым, выполняет ли он обратный вызов и может ли он использоваться следующим образом. ..

Singleton.GetInstance((singleton) => { /* Do something with singleton */ });

Есть ли реальная выгода, если я использую одно над другим? Есть ли прирост / потеря производительности?

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Я бы проигнорировал вопрос производительности (обратный вызов может быть немного медленнее и распределен), но посмотрите, как бы вы его использовали:

 // You just want to call a function if instance is available?
 Singleton.Instance?.MyFn()

 // You want to do some setup stuff that may fail
 if(Singleton.TryGet(out i)) {
   // do stuff if instance available
 }

 // You want async logic during instance setup
 Singleton.GetInstance(i => {
    // do stuff when instance is available
 });
 // alternative
 var i = await Singleton.GetInstanceAsync();

Итак, вопрос: что вам нужно? (asyn c? установка может завершиться неудачей? ...), и это определяет, какую сложность вы должны принять при доступе к вашему экземпляру.

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

 static readonly Singleton Instance = new Singleton();

Просьба. обратите внимание, что я проигнорировал безопасность потоков.

0 голосов
/ 29 марта 2020

Трудно понять, почему вы использовали бы либо. Странный вариант шаблона Singleton - иметь вариант, в котором Singleton недоступен.

Однако, если это то, что вам нужно, почему бы просто не вернуть null, когда нет Singleton?

Try...(out Thing x) действительно необходим, только когда Thing является типом значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...