Очевидная одноэлементная реализация для.NET?

svn proplist -v -R mylocalfolder/ | grep svn:ignore -B 1

Это ваш ответ, dunxd. С левой стороны будут перечислены все реквизиты. Grep с правой стороны отфильтрует их.

19
задан Faqa 4 June 2009 в 22:10
поделиться

5 ответов

Это канонический, потокобезопасный, ленивый шаблон Singleton в C # :

public sealed class Singleton
{
    Singleton(){}
    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }        
    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested() {}    
        internal static readonly Singleton instance = new Singleton();
    }
}
31
ответ дан 30 November 2019 в 02:45
поделиться

To prevent from having to copy the singleton code, you could make the type generic, as such:

public abstract class Singleton<T>
    where T: class, new()
{
    public static T Instance
    {
        get { return Nested.instance; }
    }

    private class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested() { }

        internal static readonly T instance = new T();
    }
}

public sealed class MyType : Singleton<MyType>
{
}

class Program
{
    static void Main()
    {
        // two usage pattterns are possible:
        Console.WriteLine(
            ReferenceEquals(
                Singleton<MyType>.Instance, 
                MyType.Instance
            )
        );
        Console.ReadLine();
    }
}
10
ответ дан 30 November 2019 в 02:45
поделиться

Вы измеряли производительность?

Считаете ли вы, что вызов дополнительной функции дешевле, чем если бы?

Я согласен с другими, что использование статического ctor работает хорошо для этого инициализация. Это также избавит вас от неотъемлемого состояния гонки, которое существует с тех пор, как .net гарантирует, что статические конструкторы будут вызываться только один раз.

4
ответ дан 30 November 2019 в 02:45
поделиться

Все дело в неэффективности: ...

Какая неэффективность?

Эти инструкции приведут к чрезвычайно быстрой фрагменты ассемблерного кода. Я полностью уверен, что попытки «оптимизировать» это ничего не дадут. Даже если вы придумаете что-то более быстрое, это будет связано со значительной сложностью.

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

1
ответ дан 30 November 2019 в 02:45
поделиться

Я всегда использую этот обычный (неленивый) (вы можете вложить его, как другие примеры): (требуется с использованием System.Reflection; )

public class SingletonBase<T> where T : class
{
    static SingletonBase()
    {
    }

    public static readonly T Instance = 
        typeof(T).InvokeMember(typeof(T).Name, 
                                BindingFlags.CreateInstance | 
                                BindingFlags.Instance |
                                BindingFlags.Public |
                                BindingFlags.NonPublic, 
                                null, null, null) as T;
}
0
ответ дан 30 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: