0

略有可能重复:

实例方法与带有 ref 参数的静态方法

如果我有一个类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,然后将该雇员类的实例添加到数据库中,就像这样

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# 特定的,相关问题不是特定于语言的。

现在,在开始时,由于这部分,我说可能会重复。
我正在通过 C# 阅读 CLR,在第 8 章 Section Type Constructors中,它就像

编译方法时,JIT 编译器确定它必须发出调用以在方法中执行类型构造函数。如果 JIT 编译器决定发出调用,它必须决定它应该在哪里发出调用。有两种可能

  • 精确的语义,在创建第一个实例的代码之前或在访问类成员的非继承字段的代码之前立即发出调用。

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

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

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

现在,如果我的Employee班级中有一个静态字段,情况会有什么不同?据我所知,会有4种不同的情况

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

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

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

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

在所有这些情况下,性能会有什么不同,假设每次AddEmployee调用方法buttonClick时都会创建一个员工实例(在这两种情况下,无论是否静态方法,因为它们都需要一个实例),因此每次都会创建一个新的创建实例。另外,如果这AddEmployee被称为有所不同,这有关系吗?

4

2 回答 2

2

抛开性能不谈,我更愿意将保存 Employee 的责任转移到另一个类。符合 SRP,也许还有一点 OCP。

于 2012-07-19T12:22:35.817 回答
0

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

于 2012-07-20T02:02:01.217 回答