2016-12-21 5 views
1

Должен ли я указывать общедоступный метод как статический, если я хочу инициализировать закрытую переменную только один раз или этого достаточно для создания свойства «singleton» в следующем коде?Закрытое статическое свойство в C#

public IEqualityComparer<T> GetComparer<T>() 
{ 
    if (typeof (IUserShift).IsAssignableFrom(typeof (T))) 
     return UserShiftComparer.Value as IEqualityComparer<T>; 

    throw new ArgumentOutOfRangeException("There is no avaliable comparer for the type!", nameof(T)); 
} 

private static readonly Lazy<UserShiftTrackingComparer> UserShiftComparer = new Lazy<UserShiftTrackingComparer>(); 
+0

№. Статическая переменная инициализируется не более одного раза, в [type initializer] (http://csharpindepth.com/Articles/General/Beforefieldinit.aspx) для типа. – dbc

ответ

2

Если сделать поле static тогда только одна копия будет существовать и в этом случае, так как у вас есть в Lazy, он будет создан только тогда, когда она доступна. Если он никогда не будет доступен, он никогда не будет создан.

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

Чтобы ответить на ваш вопрос, вы должны сделать статический статический метод для инициализации UserShiftComparer только один раз.

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