定义和实例化访问者的模式

问题描述

所以我在很多地方都有一些非常标准的访问者模式代码一个简单的例子如下(有时它更复杂,但这说明了这一点):

public class Singleton<T> where T : new()
{
  public static readonly T Instance = new T();
}

public interface IBlahVisitor<TResult> 
{
  TResult Visit(A a);
  TResult Visit(B b);
}

public interface MyInterface
{
  TResult Accept(IBlahVisitor<TResult> visitor);
}

public sealed class A : MyInterface
{
  TResult Accept(IBlahVisitor<TResult> visitor) => visitor.Visit(this);
}

public sealed class B : MyInterface
{
  TResult Accept(IBlahVisitor<TResult> visitor) => visitor.Visit(this);
}

private sealed class GiveMeAnInt : IBlahVisitor<int>
{
  ...
}

private sealed class GiveMeAString : IBlahVisitor<string>
{
  ...
}

所以通常我会有一个函数并像这样调用它:

public SomeType F(MyInterface x)
{
   // some stuff
   int blah = x.Accept(Singleton<GiveMeAnInt>.Instance);
   // some more stuff   
}

我有两个问题。我应该用哪种方式实例化访问者?

int blah = x.Accept(Singleton<GiveMeAnInt>.Instance);

int blah = x.Accept(new GiveMeAnInt());

我应该如何定义访问者?

private sealed class GiveMeAnInt : IBlahVisitor<int>
{
  ...
}

private struct GiveMeAnInt : IBlahVisitor<int>
{
  ...
}

只是我自己的想法。我知道单例会在程序的整个生命周期内存活,但我认为它们占用的内存相对微不足道,因为它们没有数据,而且与代码本身的大小相比,单例的大小可能微不足道。我认为这可能是最好的方法,因为它减轻了垃圾收集器的压力,垃圾收集器大概不需要收集或扫描单例对象,特别是因为它们没有指向其他对象的指针。

但是,也许只是在本地使用 new() 创建这些对象意味着可以更有效地优化它们的方法调用耸耸肩。或者也许让它们作为单例存活更长时间将有助于运行时更好地预测虚方法调用,因为它们在技术上实现了一个接口。

关于访问者对象的类与结构,它们肯定是小的只读对象,暗示struct,但它们总是用作接口的参数,这意味着它们可能应该是类以避免装箱。另一方面,也许如果它们是空结构,C# 运行时甚至根本不需要分配它们,所以也许装箱它们是微不足道的或不需要的?

也许所有这些都会使性能有所不同,但我必须选择某种方法来做到这一点,所以也许我应该在 4 个选项中使用一些与性能无关的“最佳”方法有建议吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)