c # asp mvc сборщик мусора - PullRequest
       19

c # asp mvc сборщик мусора

1 голос
/ 26 марта 2011

В моем приложении asv mvc есть класс, который хранит некоторые «глобальные» данные. он реализован как синглтон. Это выглядит примерно так:

class InfoStrings  
{
    public List<string> strings = new List<string>();
    static InfoStrings me = null;

    private InfoStrings()
    { }
    public static InfoStrings GetMe()
    {
        if(me == null)
            me = new InfoStrings();

        return me;
    }
}

Теперь из кода контроллера я получаю доступ к этому классу, блокируя его следующим образом:

lock (InfoStrings.GetMe())
{
 ...
}

Хорошо, 2 вопроса:

1) Теоретически, мой InfoStrings объект может быть собран мусором?

2) Я делаю там правильную блокировку?

Ответы [ 3 ]

3 голосов
/ 26 марта 2011

1) Теоретически, мой объект InfoStrings может быть собран мусором?

Нет, это статическое поле, которое после назначения не будет собирать мусор.

2) Я делаю там правильную блокировку?

Я бы порекомендовал вам заблокировать частный статический объект:

private static object _syncRoot = new object();
...
lock (_syncRoot)
{
    var instance = InfoStrings.GetMe();
}

Вы также можете найти следующую статью полезной при реализации шаблона синглтона в C #. Пример:

public sealed class InfoStrings
{
    private InfoStrings()
    {
    }

    public static InfoStrings Instance 
    { 
        get { return Nested.instance; } 
    }

    private class Nested
    {
        static Nested()
        {
        }
        internal static readonly InfoStrings instance = new InfoStrings();
    }
}

и тогда вам не нужно блокировать, чтобы получить экземпляр:

var instance = InfoStrings.Instance;
1 голос
/ 27 марта 2011

Если вы работаете в .NET 4.0, вам не нужно ничего этого делать. Вы можете создать статическое поле только для чтения типа Lazy, передав LazyThreadSafetyMode.ExecutionAndPublication в конструктор (вместе с вашим Func, чтобы указать, как создать экземпляр), чтобы гарантировать, что значение будет создано только один раз.

Затем вы открываете свойство, которое просто вызывает свойство Lazy.Value, чтобы возвращать загруженное ленивым одноэлементное значение.

(текст скопирован из одноэлементного шаблона в vb )

0 голосов
/ 27 марта 2011

Вы можете найти единственную реализацию defacto здесь http://www.yoda.arachsys.com/csharp/singleton.html

...