我正在审核log4net的一些代码,我遇到了这个。
private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient));
我想知道为什么你需要私有静态只读。
从我的理解私有意味着变量不能在类外使用,除非有一个访问器方法或获取属性。
static意味着该变量仅在此文件中作用域。
readonly意味着您只能从值中读取并且无法分配它。
所以,我在想那个写这段代码的人。声明它是私有的,因为他们不希望它在类和静态之外使用,因此不希望它在文件外部使用。但是,如果有一个get属性会静态阻止这种形式发生。
我认为我可以理解只读,并且只能从中读取值而不是设置。
非常感谢任何建议,
答案 0 :(得分:45)
答案 1 :(得分:9)
我认为你误解了静态。静态并不意味着“不能在文件外使用”。静态意味着:每班有一个。这个声明所做的是创建一个只分配一次(静态)的记录器,只在类中可用(不在派生类中)(私有),并且不能写入超过其初始化(readonly)。
虽然好问题!
答案 2 :(得分:6)
static not 意味着它无法从其他文件访问 - 这不是C. static关键字意味着logger对象是类变量而不是实例变量,所以即使从该类的不同对象访问,它们都将引用相同的记录器对象。
答案 3 :(得分:2)
静态在c#中表示该成员与该类相关联,而不是与该类的实例相关联。 Readonly很重要,因为在c#中,大多数变量,特别是这个变量,都是参考变量。 readonly意味着该变量将始终引用相同的记录器。
答案 4 :(得分:2)
开发人员说的是,当他们在这个类的任何实例中调用logger.Info(...)时,他们想要使用一个公共(静态)实例(所以不需要为每个类创建一个新的记录器实例),他们希望确定它自创建以来没有改变(只读),如果我们在派生类中的虚函数中,那么我想确保我不会错误地使用基类(私人的)。
答案 5 :(得分:1)
readonly 变量与const非常相似,因为该值在整个生命周期内都是常量。不同之处在于,readonly变量在运行时初始化,const在编译时初始化。 静态,在外行术语中,意味着变量的实例不依赖于它所声明的对象的实例。它的生命周期从函数调用到函数调用持续存在。静态变量访问速度更快,因为其存储在程序的整个持续时间内保持分配状态。所以我们知道这一点,我们可以回到你的问题。
为什么'logger'是静态成员?这是一个设计决定。我需要知道你是如何使用它来回答这个问题的。为什么只读?因为它似乎已初始化一次,并且其实例全程使用。我们可以确保没有其他人在我们初始化之后立即将其设置为“只读”,从而篡改了记录器的价值。
答案 6 :(得分:1)
在私有变量上放置readonly标志的原因是声明变量将始终引用同一个对象。 确实,私有使得它对类外的任何人都不可见,但是这样我们可以确保我们不会意外地用新对象覆盖变量,通过编写像
这样的东西logger = LogManager.GetLogger(typeof(AdminClient));
我们班上的其他地方。使用readonly它只是不会编译(除非之前没有初始化,和我们在(静态)构造函数中)
答案 7 :(得分:1)
静态变量属于“类变量”的类别,类变量是与类而不是类对象关联的变量,另一方面,实例变量是与类对象关联的变量,每次类对象都是初始化此对象将拥有自己的“实例变量”(非静态)副本,而静态变量在运行程序中的所有类对象之间共享,如链接列表的大小等。 readonly是用于创建变量readonly的c#关键字,java不提供这样的工具,你必须编写一个公共方法来访问你不想得到缓和的变量。
答案 8 :(得分:0)
很抱歉,我知道这已经得到了解答而且已经很老了,但我想让任何遇到这篇文章的人知道这就是你设置“ Singleton ”模式的方式。任何想要了解问题代码示例的人都可能会从了解更多关于单身人士及其使用方式(调解员,记录器,异步回调等)中获益。
//关于单身人士的母舰事
http://msdn.microsoft.com/en-us/library/ff650316.aspx
http://msdn.microsoft.com/en-us/library/ff650849.aspx
//关于他们的一个很好的讨论 What is so bad about singletons?