我遇到了这段代码:
pc = new PendingCommands(pause, wait);
PendingCommands.ProcessCommands = true;
我想知道两件事:
1)编码器是否意味着写:pc.ProcessCommands = true?
2)为什么第二行甚至被允许? PendingCommands未标记为静态...
如果我右键单击“pc”并选择“转到定义”或“转到声明”,则会将我带到此处(在相同的类/文件中):
public static PendingCommands pc = null;
如果我右键单击“PendingCommands”(从任一点)并选择“转到定义”或“转到声明”,它会在此处(在单独的类/文件中):
public class PendingCommands : IDisposable
“ProcessCommands”成员以这种方式在“PendingCommands”类中定义:
public volatile static bool ProcessCommands = true;
我错过了什么吗?
答案 0 :(得分:2)
看看这个:
public volatile static bool ProcessCommands = true;
注意ProcessCommands
是如何静态的。这意味着它与类型(PendingCommands
)相关,而不是类型的实例。
这几乎肯定不是一个好的设计(公共领域很少,静态可变字段很少,很少有易变的字段),但它解释了为什么写PendingCommands.ProcessCommands = true;
很难知道它是否真的意味着是静态的 - 不管它只是一个错误,还是它的设计方式没有任何更多信息,遗憾的是。 (我只是在这个领域的基础上使用这个课我很紧张,但是......)
请注意,您提到“PendingCommands
未标记为静态” - 它不是类,它需要是静态的。静态类只是一个只有静态成员,不能实例化(或用作变量类型等)的类。这是您正在访问的成员,这很重要。
答案 1 :(得分:1)
即使班级本身不是static
,您也可以通过班级名称访问任何班级的static
个字段。
答案 2 :(得分:1)
1)这是一个错误吗?编码员是不是要写:
pc.ProcessCommands = true
?
可能 - 如果没有关于PendingCommands
的完整文档,就无从知晓。
2)为什么第二行甚至被允许? PendingCommands未标记为静态...
PendingCommands
类可能未标记为static
,但ProcessCommands
属性为。
答案 3 :(得分:1)
ProcessCommands
可以访问,因为它是static
。删除static
关键字,只有与该类的实例相关才能访问它。即pc
。
PendingCommands.ProcessCommands = true
打算用作单身人士,否则 PendingCommands
可能会出错。也就是说,只打算成为该类的一个实例,因此静态方法ProcessCommands
将处理其唯一实例的所有“命令”。