Является ли статическая переменная общей для всего экземпляра? - PullRequest
7 голосов
/ 11 мая 2011

В общедоступном классе у меня есть частный статический словарь. Поскольку Словарь является статическим, означает ли это, что он является общим для всех остальных экземпляров того же объекта (см. Пример ниже).

public class Tax
{
    private static Dictionary<string, double> TaxBrakets = new Dictionary<string, double>(StringComparer.OrdinalIgnoreCase)
    {
        { "Individual",   0.18 },
        { "Business",     0.20 },
        { "Other",        0.22 },
    };

    public string Type { get; set; }
    public double ComputeTax(string type, double d)
    {
        return d * TaxBrakets[this.Type];
    }
}

Допустимо ли использовать словарь таким образом (в качестве статической переменной)?

Ответы [ 7 ]

8 голосов
/ 11 мая 2011

Ваша статическая переменная TaxBrakets не связана с экземпляром. this.TaxBrakets не будет компилироваться. Все вхождения TaxBrakets будут ссылаться на один и тот же словарь. В общем, вполне допустимо использовать статические словари. Это конкретное использование кажется немного забавным, но мне нужно увидеть больше кода, чтобы предложить какие-либо изменения.

6 голосов
/ 11 мая 2011

Да, этот статический член будет доступен всем экземплярам. (Visual Basic фактически делает это явным образом, используя ключевое слово Shared для статических элементов, а не static.)

Вполне допустимо использовать словарь таким образом, с одной оговоркой: если ваш код является многопоточным, то вы должны гарантировать, что доступ к статическому члену является потокобезопасным. (Конечно, это относится ко всем членам, к которым можно получить доступ одновременно, а не только к статическим данным.)

Не имеет прямого отношения к вопросу, но вам, вероятно, следует использовать decimal вместо double для всего, что связано с денежными значениями или финансовыми расчетами.

6 голосов
/ 11 мая 2011

Да, статическая переменная существует только один раз во всей вашей программе, я думаю, что она будет вести себя так, как вы ожидаете.

Вопрос о том, является ли это правильное решение вашей проблемы бухгалтерского учета спорным, IANAA, но, насколько я понимаю, налоговые скобки (примечание: правильное написание "скобок" имеет c) приравнивают уровни дохода к предельным налоговым ставкам, зная тип предприятия недостаточно для определения ставки налога.

1 голос
/ 11 мая 2011

Да , это будет общедоступно и да , что должно быть хорошо, оно будет поточно-ориентированным и не будет обновляться.Я бы просто добавил readonly к объявлению:

private static readonly Dictionary<string, double> TaxBrakets = new Dictionary<string, double>(StringComparer.OrdinalIgnoreCase)
    {
        { "Individual",   0.18 },
        { "Business",     0.20 },
        { "Other",        0.22 },
    };
1 голос
/ 11 мая 2011

Да. Фактически, если бы он не был скрыт private, он был бы доступен даже без какого-либо экземпляра.

Например:

public class X
{
    public static String y = "abc";
}

// other code, even without instances of X alive:
Console.WriteLine(X.y);
1 голос
/ 11 мая 2011

Да, статический означает, что это единственная переменная в классе Tax.

Вам нужно было бы получить к нему доступ, как

return d * Tax.TaxBrackets[this.Type]

http://msdn.microsoft.com/en-us/library/98f28cdx.aspx

1 голос
/ 11 мая 2011

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

...