gpt4 book ai didi

c# - User 对象上的静态扩展方法安全吗?

转载 作者:行者123 更新时间:2023-11-30 22:53:10 25 4
gpt4 key购买 nike

我们已经在 ASP.NET MVC 的 User 对象上创建了自定义扩展方法,例如:

public static bool IsInAnyRole(this IPrincipal principal, params Role[] roles)
{
return roles.Select(x => x.ToString()).Any(principal.IsInRole);
}

在我们的 Controller /Razor View 中,我们可以简单地说:

if (User.IsInAnyRole(Role.SystemAdmin, Role.Management))
{
// Do something...
}

SO 上的各种帖子表明静态成员不是线程安全的,并且它们为整个应用程序创建一次。我们担心相同的 IPrincipal 将被所有用户使用,但我们认为这不可能发生,因为它是扩展方法的参数。唯一对所有用户保持不变的是该方法的内部功能。

我们的理解正确吗?谢谢。

更新:“安全”是指IPrincipal 上的静态方法不共享相同的UserRole[] 对象。我们认为他们不会,但想检查一下。

最佳答案

您将线程安全与跨对象实例共享变量的能力混为一谈。实例变量也可以是非线程安全的,而不是线程安全的仅意味着无法跨线程保证变量的值。

据我了解,您正在寻找的是“安全”两种情况中的后者:例如,该方法能否返回另一个用户对象的角色。答案是:不,除非该扩展方法从静态(共享)变量中提取。在您的示例中,它从它正在扩展的类的实例中提取它的值,这意味着它不会获得另一个实例的值。

另一种方法是:扩展方法不是确定对象的状态,而是属性(在本例中为 IsInRole)。由于该属性是通过实例成员调用的,因此您不必担心会在此处返回错误的值。

“我们的理解正确吗?”:是的。其实你已经在你的帖子中给出了正确的答案,只是换句话说。

关于c# - User 对象上的静态扩展方法安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com