C#中相同功能的静态和非静态版本

时间:2017-07-28 10:05:24

标签: c# asp.net static readability maintainability

我有自己的GetUserId()函数实现静态,以便能够在静态上下文中检索ID。但我也有很多地方使用内置于asp.net UserManager库中的标准GetUserId()函数。我没有对同一件事使用不同逻辑的修复是覆盖非静态方法并使用其中的静态方法(这在UserManagerService类中):

public override string GetUserId(ClaimsPrincipal user)
{
    return GetUserIdStatic(user);
}

public static string GetUserIdStatic(ClaimsPrincipal user)
{
    return user.FindFirst(ClaimTypes.NameIdentifier).Value;
}

我这样做是因为我更喜欢在非静态上下文中调用非静态方法(通常它超过90%的调用)。所以我愿意尽我所能致电_userManagerService.GetUserId(User)而不是UserManagerService.GetUserIdStatic(User)

从可读性和可维护性的角度来看(以及我现在无法预见的最终有害后果)是否更好地按照上述方式进行;将所有调用切换到静态版本;或者其他一些我没有想到的方式?

2 个答案:

答案 0 :(得分:2)

制作执行相同操作的方法的静态和非静态版本是非常值得怀疑的。

您应该替换静态方法以获取具有静态方法或静态属性的用户标识以获取用户管理器服务。这将允许您通过调用非静态方法获取静态上下文中的用户ID:

var userId = StaticGetUserManagerSerice().GetUserIdStatic(user);

var userId = UserManagerSerice.Instance.GetUserIdStatic(user);

答案 1 :(得分:1)

首先,您不清楚将这种静态和非静态方法放在哪个类中。

看起来你的方法就是所谓的“纯函数”,即无论输入如何,它都会返回相同的东西并且没有副作用。在这种情况下,对于实例的方法来说实际上没有意义,因为它不会将实例的数据进行交易。所以从这个角度来看,呼叫应该是静态的。

但是,根据OOP原理,这个方法的最佳位置似乎是User类,作为非静态方法。