【问题标题】:Why can this class and its member be directly referenced?为什么可以直接引用这个类及其成员?
【发布时间】:2013-02-27 20:13:19
【问题描述】:

我遇到了这段代码:

pc = new PendingCommands(pause, wait);
PendingCommands.ProcessCommands = true;

我想知道两件事:

1) 编码员的意思是写:pc.ProcessCommands = true?

2) 为什么允许第二行? PendingCommands 未标记为静态...

如果我右键单击“pc”并选择“Go to Definition”或“Go To Declaration”,它会将我带到这里(在同一个类/文件中):

public static PendingCommands pc = null;

如果我右键单击“PendingCommands”(从任一位置)并选择“Go to Definition”或“Go To Declaration”,它会将我带到这里(在单独的类/文件中):

public class PendingCommands : IDisposable

“ProcessCommands”成员在“PendingCommands”类中以这种方式定义:

public volatile static bool ProcessCommands = true;

我错过了什么吗?

【问题讨论】:

  • Did the coder mean to write: pc.ProcessCommands = true? 不,他没有。 PendingCommands is not marked static 是的,但是ProcessCommands 被声明为静态并且属于类,而不是对象。

标签: c# object properties static instantiation


【解决方案1】:

看看这个:

public volatile static bool ProcessCommands = true;

注意ProcessCommands 是静态的。这意味着它与类型 (PendingCommands) 相关,而不是类型的实例。

这几乎肯定不是一个好的设计(公共字段很少,静态可变字段很少,易失字段很少),但它解释了为什么可以写PendingCommands.ProcessCommands = true;

很难知道它是否真的意味着是静态的 - 不幸的是,它只是一个错误,或者它是否是在没​​有任何更多信息的情况下以这种方式设计的。 (我会担心仅仅基于那个领域来使用这个类,但是......)

请注意,您提到“PendingCommands 未标记为静态” - 它不是需要静态的 。静态类只是一个只有静态成员的类,不能被实例化(或用作变量类型等)。 您正在访问的成员很重要。

【讨论】:

    【解决方案2】:

    你可以通过类名访问任何类的static字段,即使类本身不是static

    【讨论】:

      【解决方案3】:

      1) 这是一个错误吗?编码员的意思是写:pc.ProcessCommands = true

      可能 - 如果没有关于 PendingCommands 的完整文档,就无法知道。

      2) 为什么允许第二行? PendingCommands 未标记为静态...

      PendingCommands 类可能不标记为 static,但 ProcessCommands 属性是。

      【讨论】:

      • 文档?!?哈!完整的文档?!? ROTFLMAO。
      【解决方案4】:

      ProcessCommands 是可访问的,因为它是 static。删除 static 关键字,它只能在与类的实例相关的情况下访问。即pc

      PendingCommands.ProcessCommands = true 可能是一个错误,除非 PendingCommands 打算用作单例。也就是说,该类只有一个实例,因此静态方法ProcessCommands 将处理其唯一实例的所有“命令”。

      【讨论】:

        猜你喜欢
        • 2014-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-23
        • 2012-01-08
        • 2012-07-23
        • 1970-01-01
        • 2018-05-06
        相关资源
        最近更新 更多