В качестве простого примера, скажем, у меня есть # одноэлементный класс 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")
для ее краткости.
Мой вопрос в том, есть ли причина, по которой я должен держаться подальше от статической версии метода? Это чисто синтаксическая дискуссия? Или есть основные последствия для работы, с которыми я должен быть связан?
Вы вообще не можете вызвать метод экземпляра без знания экземпляра. Для этого нужно использовать свойство get instance. Поэтому вы заплатите за это в любом случае. По крайней мере, переместите тело оператора if() в отдельный метод, чтобы свойство getter могло быть встроено. И если это действительно так важно, тогда вместо этого используйте статический конструктор. –
Тогда почему вы используете одноэлемент вместо статического класса? –