我应该在静态字段中缓存比较器吗?

Should I cache a comparer in a static field?

我已将以下 属性 添加到我的 ApplicationUser class,这应该是 return 当前用户在其他结果之上。

public static IComparer<string> IdComparer
{
  get
  {
    return Comparer<string>.Create((x, y) =>
        {
          var curUser = HttpContext.Current.User;
          if (curUser != null)
          {
            var curId = curUser.Identity.GetUserId();
            if (x == curId)
              return -1;
            else if (y == curId)
              return 1;
          }
          return string.Compare(x, y);
        });
  }
}

无论如何,生成一个比较器比存储它花费更多吗?我应该为此 属性 添加静态字段和 return 单例吗?

我正在考虑 return 使用相同的比较器:

private static object sync = new object();
private static IComparer<string> _IdComparer;
public static IComparer<string> IdComparer
{
  get
  {
    if (_IdComparer == null)
      lock (sync)
        if (_IdComparer == null)
          _IdComparer = Comparer<string>.Create((x, y) =>
              {
                var curUser = HttpContext.Current.User;
                if (curUser != null)
                {
                  var curId = curUser.Identity.GetUserId();
                  if (x == curId)
                    return -1;
                  else if (y == curId)
                    return 1;
                }
                return string.Compare(x, y);
              });
    return _IdComparer;
  }
}

这里安全吗?有任何更正或改进吗?

生成比较器肯定比存储它花费更多。这是一个堆分配,而且不止一个(您必须为 lambda 分配自动生成的 class)。

虽然你可能不应该担心它。开销很小。

您的编辑很好。您甚至不需要使用锁或检查是否为空。赋值操作保证是原子的。在最坏的情况下,您只需两次创建相同的比较器。

下面的初始化程序我的意思是:

    static readonly IComparer<string> _IdComparer = Comparer<string>.Create((x, y) => {
        var curUser = HttpContext.Current.User;
        if (curUser != null) {
            var curId = curUser.Identity.GetUserId();
            if (x == curId)
                return -1;
            else if (y == curId)
                return 1;
        }
        return string.Compare(x, y);
    });

    public static IComparer<string> IdComparer {
        get {
            return _IdComparer;
        }
    }

我真的不明白你怎么会不知道初始化程序。