C# 除了创建helper之外,创建静态方法的理想情况(现实生活中的示例)是什么?

C# 除了创建helper之外,创建静态方法的理想情况(现实生活中的示例)是什么?,c#,.net,oop,static,static-methods,C#,.net,Oop,Static,Static Methods,我只是想了解静态方法的用途,以及我可以创建静态方法的理想情况,除非有人说静态方法用于创建助手 考虑到我有一个网站,将在我的公司只使用像人力资源管理系统一样的网站 现在,管理员登录到系统后,管理员将看到员工列表。因此,该方法非常简单,只需从员工表中获取员工的所有详细信息,并将其显示在网站上,该方法将在业务访问层中定义,如.net中所示: public class EmployeeBal { public List<Employee> GetAllEmploye

我只是想了解静态方法的用途,以及我可以创建静态方法的理想情况,除非有人说静态方法用于创建助手

考虑到我有一个网站,将在我的公司只使用像人力资源管理系统一样的网站

现在,管理员登录到系统后,管理员将看到员工列表。因此,该方法非常简单,只需从员工表中获取员工的所有详细信息,并将其显示在网站上,该方法将在业务访问层中定义,如.net中所示:

 public class EmployeeBal
    {
        public List<Employee> GetAllEmployees()
        {
                 return Select * from Employee
        }
     }
所以我的问题是我应该创建静态方法还是非静态方法

注意:这只是方法的一个示例,此方法位于my业务访问层中

假设我有一个电子商务网站,我在主页上显示了一些产品列表,在访问该网站时,每个用户都可以看到该产品列表

因此,我的功能与上面在业务访问层中定义的功能相同:

public class ProductBal
    {
        public List<Product> DisplayProductonHomePage()
        {
                 return Select * from Products
        }
     }
公共类ProductBal
{
公共列表DisplayProductionHomepage()
{
从产品返回选择*
}
}
因此,我的问题与是否将此方法创建为静态方法或非静态方法相同,如果超过10个用户同时访问此网站,将发生什么情况,那么此方法的行为/含义是什么

如果我们将此方法声明为静态方法,则此方法是否将为每个用户服务


有人能简单地解释每个场景来回答这个问题吗?

如果多个线程执行同一个静态方法,只要该方法不访问静态状态(如字段或属性),就可以了。在这种情况下,存储在字段/属性中的共享对象本身必须是线程安全的。Net的数据访问部分不是为线程安全而设计的

<> P>当您开始考虑诸如管理一个数据库连接的方面时,可以在执行单个Web请求时重用多个查询,您应该考虑静态是否是最好的方法。由于不能像上面解释的那样将连接存储在静态字段中,因此必须将其作为参数传递给每个静态方法。另一方面,如果将连接传递给构造函数并将其存储在(非静态)字段中,则可以从该实例的多个非静态方法访问它,这将更易于管理


然而,这是一个相当大的主题,一般来说,在OOP中要正确地管理类依赖关系是相当棘手的。一些程序员更喜欢将此任务委托给“控制反转”库。有许多可用于.Net的方法,如Microsoft Unity、StructureMap、AutoFac等。

当没有状态可维护时,静态方法是有意义的。我所说的国家是什么意思?考虑下面的内容:你有两个不同的对象:<代码> A<代码>代码> B>代码>。在你的程序中是否有过这样一种情况,
a.GetAllEmployees()
b.GetAllEmployees()
会产生不同的结果

如果没有,那么为什么对象
a
b
存在呢?拥有对象的全部意义在于将一些不同的状态与它们关联起来。如果两个不同的对象永远不能指向不同的状态,那么它们就没有任何意义

事实上,在这种情况下,您的
EmployeeBal
将完全等同于
System.Math
,并且它的所有方法都是“助手方法”(如果您想这样称呼它们的话)。在这种情况下,暂时忘记静态方法:整个类应该是静态的(
staticclassemployeebal
),并且不应该有任何构造函数;因为
EmployeeBal
类型的对象的概念根本没有意义。事实上,在其他语言中,EmployeeBal根本就不是一个类;相反,它通常被称为一个模块:一个对代码进行逻辑分组的单元。C#没有模块,所有代码都必须驻留在类中。因此,类实现了双重目的:它们对代码进行分组,并生成对象。1

现在考虑一个不太极端的例子:<代码> EngEbAb< /Cord>对象实际上保持状态,并且不同。但是无论哪个对象调用该方法,

GetAllEmployees()
仍将产生相同的结果

在这种情况下,
EmployeeBal
显然不能是静态类。但是
GetAllEmployees
仍然是无状态的,因此不属于
EmployeeBal
类型的对象。因此,该方法应该是静态的



1在两个根本不同的概念(模块和类)之间缺乏区别实际上是非常令人讨厌的,C#以这种方式工作的主要原因是它被认为与Java类似。事后看来,这是一个错误,但不是一个严重的错误。

是否有理由认为该方法应该是静态的?如果不是,我总是站在非静态的一边。 一个重要原因是能够编写单元测试。 为了编写单元测试,您希望能够将正在测试的类与其他类隔离开来。但是如果类A包含对静态类B的引用,那么在不测试B的情况下就不能测试A。可能B取决于连接字符串或配置设置。可能B依赖于其他静态类。现在你不能测试A,除非B和它所依赖的一切都准备好了

另一方面,如果类A依赖于通过其构造函数提供的接口,如
IEMPloyeProvider
,那么您可以使用
IEMPloyeProvider
的模拟实现来测试类A

如果有
public class ProductBal
    {
        public List<Product> DisplayProductonHomePage()
        {
                 return Select * from Products
        }
     }
var client = new SqlClient();
var allEmployeeData = EmployeeBal.GetAllEmployees(client);

class EmployeeBal
{
    public static Employee GetAllEmployees(ISqlClient client)
    {
        return client.Execute("Select * from Employee");
    }
}
var session =  SessionFactory.OpenSession();