是在所有实例之间共享的静态变量

本文关键字:共享 静态 变量 之间 实例 | 更新日期: 2023-09-27 17:55:49

在公共类中,我有一个私有静态字典。由于字典是静态的,这是否意味着它在同一对象的所有其他实例之间共享(请参阅下面的示例)。

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];
    }
}

以这种方式使用字典(作为静态变量)是否可以接受?

是在所有实例之间共享的静态变量

您的静态变量TaxBrakets不与实例关联。 this.TaxBrakets不会编译。 所有出现的TaxBrakets都将引用同一字典。 一般来说,使用静态词典是完全可以接受的。 这种特殊用法似乎有点有趣,但我需要查看更多代码来建议任何更改。

是的,静态变量在整个程序中只存在一次,我认为它会按照您期望的方式运行。

IANAA认为这是否是解决会计问题的正确解决方案是有争议的,但我的理解是,税级(注意:"括号"的正确拼写有c)将收入水平等同于边际税率,知道实体的类型本身不足以确定税率。

是的,该静态成员将由所有实例共享。(Visual Basic 实际上通过使用静态成员的 Shared 关键字而不是static来明确这一点。

以这种方式使用字典是完全可以接受的,但有一个警告:如果你的代码是多线程的,那么你必须确保对静态成员的访问是线程安全的。(当然,这适用于可能并发访问的任何成员,而不仅仅是静态成员。

问题没有直接关系,但对于与货币价值或财务计算相关的任何内容,您可能应该使用decimal而不是double

是的,它将被共享,是的,这应该没问题,它将是线程安全的并且没有更新。我只想在声明中添加readonly

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

静态属性本身并不真正由实例共享,但您对它的用法是正确的。

是的

,static 表示它是类 Tax 中的单个变量。

您需要像访问它一样

return d * Tax.TaxBrackets[this.Type]

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

是的。事实上,如果它没有被隐藏 private ,那么即使没有任何实例,它也可以使用。

例如:

public class X
{
    public static String y = "abc";
}
// other code, even without instances of X alive:
Console.WriteLine(X.y);