24

我正在审查 log4net 的一些代码,我遇到了这个。

private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient));

我想知道为什么你需要私有静态只读。

根据我的理解,私有意味着该变量不能在类外部使用,除非有访问器方法或获取属性。

static 意味着该变量仅在此文件中起作用。

readonly 意味着您只能从值中读取而不能分配它。

所以,我在想写这段代码的人。将其声明为私有,因为他们不希望它在类外部使用,并且是静态的,因此不希望它在文件外部使用。但是,如果有一个 get 属性,则静态会阻止这种形式的发生。

我想我可以理解 readonly 并且该值只能从中读取而不是设置。

非常感谢您的任何建议,

4

9 回答 9

48
  • private没有人应该在类之外使用记录器字段(即使在子类中),如果你不设置这个,任何其他类都可以使用你的记录器来登录你的类名。
  • static该属性附加到类,因此它不会与类的每个实例重复。如果你不设置这个 logger 属性将在系统创建对象的每个实例中占用额外的内存空间(你误解了这一点)。
  • readonly不应修改记录器字段。
于 2009-06-09T04:32:28.360 回答
10

我认为你误解了静态。静态并不意味着“不能在文件外使用”。静态意味着:每个类都有一个。这个声明所做的是创建一个只分配一次的记录器(静态),只在类中可用(在派生类中也不可用)(私有),并且在初始化之后不能被写入(只读)。

不过问题很好!

于 2009-06-09T04:33:04.273 回答
6

static 并不意味着不能从其他文件访问它 - 这不是 C。 static 关键字意味着记录器对象是类变量而不是实例变量,因此即使从该类的不同对象访问,它们也会都引用同一个记录器对象。

于 2009-06-09T04:32:55.710 回答
2

c# 中的 static 表示该成员与类相关联,而不是与类的实例相关联。Readonly 很重要,因为在 c# 中,大多数变量,尤其是这个变量,都是引用变量。readonly 意味着此变量将始终引用相同的记录器。

于 2009-06-09T04:45:32.250 回答
2

开发人员的意思是,当他们在此类的任何实例中调用 logger.Info(...) 时,他们希望使用公共(静态)实例(因此不需要为每个类实例创建新的记录器),他们想确定它自创建以来没有改变(只读),如果我们在派生类的虚函数中,那么我想确保我不会错误地使用基类(私有)。

于 2009-06-09T08:52:45.843 回答
1

只读变量与const 非常相似,因为它的值在其整个生命周期内都是恒定的。不同之处在于只读变量在运行时初始化,而 const 在编译时初始化。静态,用外行的话来说,意味着变量的实例不依赖于声明它的对象的实例。它的生命周期从函数调用到函数调用持续存在。静态变量的访问速度更快,因为它的存储在整个程序期间保持分配状态。所以知道了这一点,我们可以回到你的问题。

为什么“记录器”是静态成员?这是一个设计决定。我需要知道你是如何使用它来回答这个问题的。为什么它是只读的?因为它似乎被初始化了一次,并且它的实例在整个过程中都被使用。我们可以确保没有其他人篡改 logger 的值,方法是在我们初始化它之后立即将其设为“只读”。

于 2009-06-09T04:59:24.353 回答
1

在私有变量上放置只读标志的原因是声明该变量将始终引用同一个对象。确实,私有使得它对类外的任何人都不可见,但是这样我们可以确保我们不会意外地用新对象覆盖变量,方法是编写类似的东西

logger = LogManager.GetLogger(typeof(AdminClient));

我们班的其他地方。使用 readonly 它不会编译(除非它之前没有初始化,并且我们在(静态)构造函数中)

于 2009-06-09T09:03:03.873 回答
1

静态变量属于“类变量”的类别,类变量是与类而不是类对象相关联的变量,另一方面,实例变量是与类对象相关联的变量,这意味着每次类对象初始化时该对象将拥有该“实例变量”(非静态)的自己的副本,而静态变量在运行程序中的所有类对象之间共享,例如链表的大小等。 readonly 是用于使变量只读的 c# 关键字,java 没有提供这样的设施,你必须编写一个公共方法来访问你不想被调和的变量。

于 2009-09-09T18:06:26.923 回答
0

抱歉,我知道这已经得到了回答,而且它真的很老了,但我想让任何看到这篇文章的人都知道,这就是你设置“单例”模式的方式。任何想了解更多关于问题中的代码示例的人都可能会从了解更多关于单例及其使用方式(调解器、记录器、异步回调等)中受益。

// 关于单身人士的母题
http://msdn.microsoft.com/en-us/library/ff650316.aspx
http://msdn.microsoft.com/en-us/library/ff650849.aspx

// 一个关于它们的很棒的 SO 讨论
单例有什么不好?

于 2013-06-07T14:03:30.237 回答