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

C# 我应该在静态字段中缓存比较器吗?,c#,.net,performance,singleton,icomparer,C#,.net,Performance,Singleton,Icomparer,我已将以下属性添加到我的ApplicationUser类中,该类应在其他结果的基础上返回当前用户 public static IComparer<string> IdComparer { get { return Comparer<string>.Create((x, y) => { var curUser = HttpContext.Current.User; if (curUser != n

我已将以下属性添加到我的
ApplicationUser
类中,该类应在其他结果的基础上返回当前用户

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);
        });
  }
}
公共静态IComparer IdComparer
{
得到
{
返回比较器。创建((x,y)=>
{
var curUser=HttpContext.Current.User;
if(curUser!=null)
{
var curId=curUser.Identity.GetUserId();
if(x==curId)
返回-1;
else如果(y==curId)
返回1;
}
返回字符串。比较(x,y);
});
}
}
无论如何,生成比较器比存储比较器花费更多吗?我应该为这个属性添加一个静态字段并返回一个单例吗

我正在考虑返回相同的比较器:

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;
  }
}
private static object sync=new object();
专用静态IComparer\u IdComparer;
公共静态IComparer IdComparer
{
得到
{
if(_IdComparer==null)
锁定(同步)
if(_IdComparer==null)
_IdComparer=Comparer.Create((x,y)=>
{
var curUser=HttpContext.Current.User;
if(curUser!=null)
{
var curId=curUser.Identity.GetUserId();
if(x==curId)
返回-1;
else如果(y==curId)
返回1;
}
返回字符串。比较(x,y);
});
返回ID比较器;
}
}

这安全吗?任何更正或增强功能?

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

不过你可能不该担心。开销很小

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

下面的初始值设定项是指:

    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;
        }
    }
static readonly IComparer\u IdComparer=Comparer.Create((x,y)=>{
var curUser=HttpContext.Current.User;
if(curUser!=null){
var curId=curUser.Identity.GetUserId();
if(x==curId)
返回-1;
else如果(y==curId)
返回1;
}
返回字符串。比较(x,y);
});
公共静态IComparer IdComparer{
得到{
返回ID比较器;
}
}

我真的不明白你怎么会不知道初始值设定项。

是的。或者可以使用初始值设定项对其进行初始化。真的,真的没关系。你是说初始值设定项吗?