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

时间:2011-05-10 21:40:29

标签: c# .net c#-4.0

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

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

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

7 个答案:

答案 0 :(得分:8)

您的静态变量TaxBrakets与实例无关。 this.TaxBrakets无法编译。所有出现的TaxBrakets都将引用相同的字典。通常,使用静态字典是完全可以接受的。这个特殊的用法看起来有点滑稽,但是我需要看到更多的代码来暗示任何变化。

答案 1 :(得分:6)

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

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

答案 2 :(得分:6)

是的,所有实例都将共享该静态成员。 (Visual Basic实际上使用Shared关键字对静态成员而不是static进行了明确说明。)

以这种方式使用字典是完全可以接受的,但有一点需要注意:如果您的代码是多线程的,那么您必须确保对静态成员的访问是线程安全的。 (当然,这适用于可能同时访问的任何成员,而不仅仅是静态。)

与问题没有直接关系,但您应该使用decimal而不是double来处理与货币价值或财务计算相关的任何事情。

答案 3 :(得分:1)

静态属性实际上不是共享本身,但您对它的使用是正确的。

答案 4 :(得分:1)

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

您需要像

一样访问它
return d * Tax.TaxBrackets[this.Type]

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

答案 5 :(得分:1)

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

例如:

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

// other code, even without instances of X alive:
Console.WriteLine(X.y);

答案 6 :(得分:1)

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

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