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比较器;
}
}
我真的不明白你怎么会不知道初始值设定项。是的。或者可以使用初始值设定项对其进行初始化。真的,真的没关系。你是说初始值设定项吗?