为什么我们使用 class 名称调用委托?为什么不能在 class 对象列表中列出?

why we call delegate using class name?? Why can't it list out in class Object list?

参见下面的示例...

public class Test
  {
    public delegate void Logger(string s);

    public void Process(Logger logger)
    {
      if (logger!= null)
      {
        logger("Process Started");
      }
      if (logger != null)
      {
        logger("Process End");
      }
    }
  }

  class Program
  {
    public static void LogMe(string s)
    {
      Console.WriteLine(s);
    }

    static void Main(string[] args)
    {
      Test obj = new Test();
      Test.Logger del = new Test.Logger(LogMe);
      obj.Process(del);
    }
  }

这里的委托记录器是在 class 测试中编写的...当我创建 Class 测试的对象时,即对象...委托记录器未在此处列出,当尝试使用 class name 我可以得到 Logger。

我知道委托的概念,但我只是想了解为什么对象列表中没有列出委托。

when I create the object of Class Test i.e. obj... the delegate Logger is not listed there and when tried using class name I'm able to get the Logger

嵌套在另一个类型中的类型不是实例成员。尽管关键字 static 未应用于嵌套类型的声明,但在某种意义上它仍然是 "static"。 (不过,从可以调用方法或访问字段或 属性 的意义上说,它不是 运行 时间成员,所以我不确定我是否真的认为它是 "static member")。

更基本地说,委托类型 Logger 无论如何都不是 class 的每个实例成员。 IE。每个实例不能有不同的 Logger。因此,通过实例引用访问 Logger 类型没有任何意义。

对于 class 的任何非实例成员,您可以使用类型名称访问它。例如。 Test.Logger.

如果委托类型在某种程度上是 Test 所特有的,并且与 Test 的 public API 密切相关,那么嵌套类型也许有意义这里。也就是说,我倾向于尝试避免 public 嵌套类型,仅在看起来 确实 时才使用它们,这是非常正确的做法,主要是因为这个特定问题。我不喜欢必须使用包含类型名称的质量类型名称。 :)

您确实有一些选择:

  • 甚至不要声明自定义委托类型。只需使用预定义的。在您的示例中,Action<string> 也可以。
  • 不要嵌套类型。然后它只需要用命名空间限定,当然你可以用 using 语句隐含。
  • 别名类型。例如。您可以在要使用该类型的源代码文件的顶部写入 [​​=19=],然后您可以只使用较短的 Logger。 (当然,将 MyNamespace 替换为该类型的实际完全限定名称空间)。

如果您要在 class 名称 space 级别提及测试之外的委托:

namespace Whosebug{
  public delegate void Logger(string s);
  public class Test
  {
  }
}

您可以在没有测试前缀的情况下访问 Logger 类型 class。部分原因是因为我们经常将 Delegate 视为嵌套类型,所以我们没有意识到它是一种类型并且可以在名称 space 中独立存在。