是在所有实例之间共享的静态变量
本文关键字:共享 静态 变量 之间 实例 | 更新日期: 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);