1. C# / Говнокод #2182

    +135.6

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    public class Singleton<T> where T : class
        {
            private static T _Instance = null;
            protected static readonly object locker = new object();
    
            public static T Instance
            {
                get
                {
                    if (_Instance == null)
                    {
                        lock (locker)
                        {
                            if (_Instance == null)
                            {
                                ConstructorInfo[] info = typeof(T).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);
                                if (info.Length > 0)
                                    _Instance = (T)info[0].Invoke(null);
                            }
                        }
                    }
                    return _Instance;
                }
            }
    
            protected Singleton() { }
    
            static Singleton() { }
    
        }

    Вот такой вот универсальный сиглтон нашел в проекте

    Запостил: sven47, 26 Ноября 2009

    Комментарии (10) RSS

    • суть в том что всю эту лабудень:

      ConstructorInfo[] info = typeof(T).GetConstructors(BindingFlags.I nstance | BindingFlags.NonPublic);
      if (info.Length > 0)
      _Instance = (T)info[0].Invoke(null);

      можно заменить одной строчкой

      _Instance = default(T);
      Ответить
      • Интересно вот, а на уровне байткода для default(T) отдельная инструкция, или оно в вышеуказанное расширяется?
        Ответить
      • Интересно, а default(T) для Т=object расширяется в:
        1. null
        2. new object()

        как вы думаете?
        Ответить
      • учи матчасть, в таком случае Null там будет
        Ответить
    • А вообще это попытка юзать логику сиплюсных шаблонов сишарповыми дженерикуами... Автор, случайнр, auto_ptr там не реализовывал?

      Класс абсолюнто бессмысленный...
      Ответить
    • public class Singleton<T> where T : class, new()

      ...

      _Instance = new T();
      Ответить
      • Конструктор Т может быть приватным
        Ответить
        • более того, он должен быть приватным, иначе какой это нафиг синглтон.
          Ответить
    • Нужно сделать метод GetInstance вместо свойства и сделать перегруженный метод, принимающий в аргумент делегат для указания "как создавать объект"
      Ответить
    • Если конструктор открытый то проще через where T: class, new(), как уже писали.
      Ну а если закрытый, то: Activator.CreateInstance(typeof(T)); работает быстрые для конструктора по умолчанию (он сам достучится до закрытого конструктора).
      Ответить

    Добавить комментарий