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

C# C中相同函数的静态和非静态版本#,c#,asp.net,static,readability,maintainability,C#,Asp.net,Static,Readability,Maintainability,我有自己的GetUserId()函数的静态实现,以便能够在静态上下文中检索ID。但我也有很多地方使用asp.net UserManager库中内置的标准GetUserId()函数。我对同一事物不使用不同逻辑的修正是重写非静态方法并在其中使用静态方法(这在UserManagerService类中): 我之所以这样做是因为我更喜欢在非静态上下文中调用非静态方法(通常超过90%的调用)。因此,只要有可能,我宁愿调用\u userManagerService.GetUserId(User)而不是user

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

我之所以这样做是因为我更喜欢在非静态上下文中调用非静态方法(通常超过90%的调用)。因此,只要有可能,我宁愿调用
\u userManagerService.GetUserId(User)
而不是
userManagerService.GetUserIdStatic(User)


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

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

看起来你的方法就是所谓的“纯函数”,也就是说,不管输入是什么,它只返回相同的东西,没有副作用。在这种情况下,将方法用于实例是没有意义的,因为它不处理实例的数据。因此,从这个角度来看,调用应该是静态的


然而,根据OOP原则,这种方法的最佳位置似乎是作为一种非静态方法出现在
用户
类中。

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

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

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


我添加了一个关于函数在何处实现的小注释。我同意,作为一个实例方法没有明显的意义,但它看起来确实是一个可读性改进,由于该类方法执行的几乎所有操作都是使用正在注入的实例执行的。这是一个很好的答案,但您不应该对特定类型使用
var
,谢谢您的建议。它看起来确实是一个更好的解决方案,尽管我自己不知道如何实例化UserManagerService对象,因为构造函数使用了多个我没有显式控制的参数,而在其他任何地方DI都会为我处理这些参数(我自己从来没有实例化过对象)。但是我相信这可能超出了这个问题的范围。@AIDAN直接使用
var
可以帮助您避免重复您在其他地方提供的信息,例如方法的返回类型。为了简洁和一致性,我到处使用
var
。@dasblinkenlight在配置例程期间,我在Startup.cs类中分配了服务对象:
LogHelpers.userManagerService=app.ApplicationServices.GetService()
DI以这种方式处理对象构造-我认为这可能对研究此问题的人有所帮助-我是否可以将其添加到您的答案中(我认为这是另一种.net核心方法,可以实现您所描述的自定义方法)。
var userId = StaticGetUserManagerSerice().GetUserIdStatic(user);
var userId = UserManagerSerice.Instance.GetUserIdStatic(user);