2016-11-29 6 views
3

В качестве простого примера, скажем, у меня есть # одноэлементный класс C следующим образом:Статические методы в классе C# .NET Singleton отрицательно влияют на производительность или потребление памяти?

using System.Collections.Generic; 

public sealed class RestrictedNameCollection : List<string> 
{ 
    private static object _lock = new object(); 

    private RestrictedNameCollection() 
    { 
    } 

    private static RestrictedNameCollection _instance; 
    public static RestrictedNameCollection Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       lock (_lock) 
       { 
        if (_instance == null) 
        { 
         var nameList = new List<string>(); 
         nameList.Add("Jack"); 
         nameList.Add("Jill"); 
         nameList.Add("John"); 
         nameList.Add("Jane"); 

         var restrictedNameCollection = new RestrictedNameCollection(); 
         foreach (var name in nameList) 
         { 
          restrictedNameCollection.Add(name); 
         } 

         _instance = restrictedNameCollection; 
        } 
       } 
      } 
      return _instance; 
     } 
    } 
} 

Я могу добавить IsRestrictedName(string name) метод к классу следующие 2 способа.

public bool IsRestrictedName(string name) 
{ 
    return Contains(name); 
} 

Или:

public static bool IsRestrictedName(string name) 
{ 
    return Instance.Contains(name); 
} 

я могу использовать первую версию, вызвав RestrictedNameCollection.Instance.IsRestrictedName("Jack"). Но я предпочитаю иметь возможность назвать вторую версию RestrictedNameCollection.IsRestrictedName("Jack") для ее краткости.

Мой вопрос в том, есть ли причина, по которой я должен держаться подальше от статической версии метода? Это чисто синтаксическая дискуссия? Или есть основные последствия для работы, с которыми я должен быть связан?

+0

Вы вообще не можете вызвать метод экземпляра без знания экземпляра. Для этого нужно использовать свойство get instance. Поэтому вы заплатите за это в любом случае. По крайней мере, переместите тело оператора if() в отдельный метод, чтобы свойство getter могло быть встроено. И если это действительно так важно, тогда вместо этого используйте статический конструктор. –

+0

Тогда почему вы используете одноэлемент вместо статического класса? –

ответ

0

Вопрос памяти немного сложный, но в принципе, как только вы его вызывали один раз, все данные («jack» и т. Д.) Будут загружены в память и будут оставаться до тех пор, пока DLL не выгрузится. Что касается производительности, я бы больше беспокоился о безопасности потоков. Однако .. к тому моменту, который я хотел сделать ... почему вы все эти усилия пытаетесь заполнить список? Просто создайте пару статических функций, таких как «populatenames» и «populaterestricted»?

Я думаю, что вы чрезмерно думать, что это ....

+1

Трей, я написал пример только для сообщения здесь, чтобы я мог сосредоточиться на различии между методами. Синдром реального мира, который вдохновил его, на самом деле намного сложнее, но я упростил его для удобства чтения. Во всех примерах singleton я вижу, что внутренние методы обычно получают доступ, вызывая экземпляр Instance.Whatever(), поэтому мне интересно, почему или если статические методы, которые обращаются к экземпляру, следует избегать внутри самого одиночного класса. – John

0

Вы не должны беспокоиться о перфорации, если вы не беспокоитесь о сохранении наносекунд. Статический вызов метода всегда будет дешевле, но наличие экземпляра (через интерфейс) позволяет вам макетировать или вводить больше действий позже. Это более восприимчиво к изменениям. Кроме того, экземпляр может быть удален, когда вы закончите с ним, но это не фактор, если он должен существовать в течение всего срока службы приложения.

Для инициализации можно использовать статический конструктор.

0

Я пробовал сделать simple fiddle, чтобы проверить разницу в производительности. Как и вы, я надеялся, что одноэлемент, доступный через статические методы, будет таким же хорошим (может быть, лучше), чем чистым статическим классом. Теперь, хотя это может быть лучше в разных условиях, мои результаты, похоже, показывают, что нет существенной разницы, хотя чистый синглтон, по-видимому, чаще, чем не, происходит медленнее, чем синтаксис статического метода или статический класс.

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

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