带有实例参数的静态方法或没有参数的实例方法?

时间:2012-07-19 11:53:33

标签: c# performance types clr jit

稍有可能重复:

  

Instance method vs. static method with ref parameter

如果我有一个类Employee,并且有一个方法AddEmployee,它将员工添加到数据库中。我可以采用哪种方法,一种是这样的,

protected void AddEmployee(SQLConnection con)
{
    // this is an instance method, 
    // connection is passed in parameter
    // add this class to database, using the connection
}

我会这样称呼它

   var emp = new Employee();
   // set its properties
   emp.AddEmployee(theSQLConnectionObject);

另一种方法是,我创建一个静态方法,然后传递Employee类的实例和SQLConnecion,然后将该实例的employee类添加到数据库中,像这样

static protected void AddEmployee(Employee emp, SQLConnection Con)
{
    // this is static method
    // connection again in parameter
    // add emp class to database, using the connection
}

这可以添加为,

var emp = new Employee();
// set its properties
Employee.AddEmployee(emp, theSQLConnectionObject);

我想知道哪一个是好的方法,你更喜欢哪一个,为什么?另外,我想知道C#具体,相关的问题不是任何特定的。

现在,在开始时我说因为这个部分可能会有一点重复 我正在阅读 CLR通过C#,并在第8章节类型构造函数中,它就像

  

编译方法时,JIT编译器会确定它必须发出的天气   调用在方法中执行类型构造函数。如果是JIT   编译器决定发出调用,它必须决定它应该发射的位置   电话。有两种可能性

     
      
  • 精确语义,在创建第一个实例的代码之前或紧接在访问之前的代码之前发出调用   非继承的班级成员。

  •   
  • before-field-init语义,在代码访问静态字段或静态或实例方法之前的某个时间发出代码,或调用   实例构造函数。

  •   

更多的描述,然后给出了一个性能比较的例子,并且在性能方面存在很大的差异,为了简洁起见,我不包括它,但如果有人想要,请评论,我会更新问题。
在例子之后,他继续

  

当C#编译器看到一个类时   使用内联初始化的静态字段,编译器发出   元数据的类型定义表中的before-field-init。当它看到一个   具有显式构造函数的类,它不会在before-field-into之前发出   到元数据。

现在,如果我的Employee课程中有静态字段,情况会有何不同?根据我的想法,会有4个不同的案例

  • AddEmployee是实例,类没有静态构造函数

  • AddEmployee是实例,类有一个静态构造函数

  • AddEmployee是静态的,类没有静态构造函数

  • AddEmployee是静态的,class有一个静态构造函数

假设在AddEmployee调用方法buttonClick并且每次创建一个雇员实例(在两种情况下,静态方法与否,因为它们都需要一个实例),因此每次创建一个新实例。此外,如果调用此AddEmployee的方式有所不同,这是否重要?

2 个答案:

答案 0 :(得分:2)

除了性能之外,我更倾向于将将Employee保存到另一个类的责任。符合SRP,也许还有一点OCP。

答案 1 :(得分:0)

我建议你不要在这种情况下使用静态方法。在许多情况下,静态方法是非常难看的解决方案。更好的方法是,如果使用实例方法创建数据映射器类,例如,当您决定需要使用继承来扩展数据映射器类的行为以获得不同的保存操作时,它可以帮助您。一开始不要考虑性能,特别是在这个时刻,优秀程序员的经验告诉我们,当你面对它时,我们需要解决性能问题。如果优化应用程序的每行代码,您将无法完成应用程序。通常情况下,有时我们需要2-3个地方来提高代码的性能,但有时候根本就没有这样的地方。所以,首先考虑一下你的设计,关于它的可读性和可扩展性。