在公共类中,我有一个私有静态字典。由于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是否可以接受(作为静态变量)?
答案 0 :(得分:8)
您的静态变量TaxBrakets
与实例无关。 this.TaxBrakets
无法编译。所有出现的TaxBrakets
都将引用相同的字典。通常,使用静态字典是完全可以接受的。这个特殊的用法看起来有点滑稽,但是我需要看到更多的代码来暗示任何变化。
答案 1 :(得分:6)
是的,一个静态变量在整个程序中只存在一次,我认为它会按照你期望的方式运行。
这是否是您的会计问题的正确解决方案是有争议的,IANAA,但我的理解是税收括号(注意:“括号”的正确拼写有c
)将收入水平等同于边际税率,知道实体的类型本身不足以确定税率。
答案 2 :(得分:6)
是的,所有实例都将共享该静态成员。 (Visual Basic实际上使用Shared
关键字对静态成员而不是static
进行了明确说明。)
以这种方式使用字典是完全可以接受的,但有一点需要注意:如果您的代码是多线程的,那么您必须确保对静态成员的访问是线程安全的。 (当然,这适用于可能同时访问的任何成员,而不仅仅是静态。)
答案 3 :(得分:1)
静态属性实际上不是共享本身,但您对它的使用是正确的。
答案 4 :(得分:1)
是的,static表示它是Tax类中的单个变量。
您需要像
一样访问它return d * Tax.TaxBrackets[this.Type]
答案 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 },
};