略有可能重复:
如果我有一个类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
被称为有所不同,这有关系吗?