2016-08-26 3 views
0

я реализует синглтон с статической инициализации, как это:Принят предложение ReSharper Ruin This Singleton?

internal sealed class MySingleton 
{ 
    private static readonly MySingleton instance = new MySingleton(); 

    public static MySingleton Instance => instance; 

    private MySingleton() 
    { 
     // elided 
    } 
} 

ReSharper squiggled публичную собственность Instance и предложил преобразовать его в авто-свойства. В результате, если принимать исправления, выглядит следующим образом:

internal sealed class MySingleton 
{ 
    public static MySingleton Instance { get; } = new MySingleton(); 

    private MySingleton() 
    { 
     // elided 
    } 
} 

Не это «исправить» сделать так, чтобы каждый вызов к свойству Instance будет генерировать новый MySingleton, таким образом, победив всю цель, или есть ли что-то о статических свойствах, которые знает ReSharper, а я нет?

+3

Очень легко запустить этот код и посмотреть, действительно ли он вызывает конструктор каждый раз, когда вызывается получатель. Точка останова или любой побочный эффект в конструкторе сделает ее очень заметной. – Servy

+0

Хотя это будет работать, вы можете столкнуться с проблемами многопоточности и производительности, используя любой из этих фрагментов. Я скоро запишусь на свой компьютер и обеспечу более безопасную реализацию, используя двойную блокировку, чтобы сделать ее поистине безопасной. Хотя я люблю повторять некоторые предложения, можно, как правило, игнорировать, и это будет примером, где это не имеет большого значения в любом случае, хотя важно, чтобы оно соответствовало тому, что вы выбираете. – mbrdev

+0

@mbrdev - Спасибо; Я знаю о проблемах с этим процессом, но мне интересно, какие проблемы с производительностью вы имеете в виду. – bubbleking

ответ

3

Это read-only auto property, используя синтаксис, введенный в C# 6. Код в правой части выполняется только один раз, только для первоначального назначения значения свойства.

+0

А, я не знал, что новые свойства только для чтения работали именно так. Это только для свойств авто? Я ожидал бы, если бы у меня было тело в геттере, оно выполнялось бы каждый раз. – bubbleking

+1

@ bubbleking Попробуйте и узнайте. – Servy

+0

На самом деле теперь, когда я прочитал вашу ссылку, я помню, что авто-свойства только для чтения работают так. – bubbleking

Смежные вопросы