Интерпретируется ли тернарный оператор так, как я предполагал?

#c# #.net #winforms

Вопрос:

     public class FileStorage
    {

        private static FileStorage _instance;
        public static FileStorage instance
        {
            get
            {
                return (_instance != null) ? _instance : _instance = new FileStorage();
            }
        }

        //public string GetAddress...

    }
 

могу ли я использовать этот фрагмент кода для простого одноэлементного решения? код будет выполняться в одном потоке.

Возвращает ли возврат, возвращает ли новое хранилище файлов()? что именно должно быть возвращено сюда?

 var foo = (bee = new[]{/*immagination...*/})
 

будет ли foo логическим значением? или, по сути, это ссылка на пчелу?

Комментарии:

1. Да, вы можете использовать это. Хотя писать легче public static FileStorage instance => _instance ??= new FileStorage() . Почему бы не посмотреть, какой тип данных foo в вашем примере?

2. Thx canton7, я довольно далек от концепции c#, я также довольно новичок в отладке, и я запускаю vs-код, потому что вот я начал, вот мы с вами быстрее, чем мои проб и ошибок :’D

3. Используйте, например sharplab.io чтобы проверить вещи, не открывая вообще ничего. Мы здесь не для того, чтобы вы могли лениться: от вас ожидают, что вы приложите усилия для решения своих проблем самостоятельно

4. «простое одноэлементное решение»? Нет .

5. Понизьте голос за «не показывает исследовательских усилий», так как вопрос легко поддается проверке.

Ответ №1:

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

Тем не менее, чтобы избежать поиска ошибок, когда вам нужно использовать потоки в вашем приложении, обычно лучше заранее обеспечить безопасность потоков.

Например:

 public class FileStorage
{
    private static readonly object _singletonLock = new object();
    private static FileStorage _instance = null;
    public static FileStorage Instance
    {
        get
        {
            lock (_singletonLock)
            {
                return _instance ??= new FileStorage();
            }
        }
    }
} 
 

Этот фрагмент кода использует ??= оператор (присваивать, если значение равно нулю), а также инкапсулирует метод получения Instance свойства в lock оператор-для обеспечения потокобезопасности.
??= он намного компактнее и легче читается и имеет тот же эффект, что и ваш троичный оператор.

Комментарии:

1. не знал об операторе Assign if null, очень приятно, что он там объяснен, спасибо, я задал вопрос, потому что я действительно не понимаю магии ~ волшебства, о ()? true : b = false том, и почему он работает на более низком вычислительном уровне