我应该在静态字段中缓存比较器吗?
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;
}
}
我真的不明白你怎么会不知道初始化程序。
我已将以下 属性 添加到我的 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;
}
}
我真的不明白你怎么会不知道初始化程序。