C# 中相同函数的静态和非静态版本

Static and non-static version of the same function in C#

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

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) 只要我能。

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

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

看来您的方法就是所谓的 "pure function",即无论输入如何,它都只是 returns 相同的东西,并且没有副作用。在这种情况下,将方法用于实例并没有真正意义,因为它不处理 with 实例的数据。所以从这个角度来看,调用应该是静态的。

但是,根据 OOP 原则,此方法的最佳位置似乎是 User class,作为一种非静态方法。

制作一个方法的静态和非静态版本来做同样的事情是非常值得怀疑的。

您应该将获取用户 ID 的静态方法替换为静态方法或静态 属性 以获取用户管理器服务。这将使您可以通过调用非静态方法在静态上下文中获取用户 ID:

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

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