[英]Understanding Static Class and static method
假设我有一个这样的方法:
public class MyDataAccess
{
public static StudentDataTable GetStudentRecords(int schoolID)
{
var ta = new StudentTableAdapter();
using (ta.Connection = new SqlConnection(GetCS()))
{
var result = ta.GetStudentRecords(schoolID);
return result;
}
}
}
如果使用控制台应用程序或任何其他方式一次访问此方法1,000次,那么是否有可能将一所学校的学生的记录返回另一所学校?
例如
var records1 = GetStudentRecords(1);
.....
var records1000 = GetStudentRecords(1000);
即使records1
变量的调用来自自己的线程,是否有可能使schoolID = 1
记录与records1000
记录混合在一起?
另外,如果我也将此类更改为static,将会发生什么?
我目前的理解
1)是的,我知道什么是课程
2)是的,我知道静态类不需要使用必需的实例
3)我知道应该有简单的静态代码,例如转换数据类型。
但是我感到困惑的是:
当只有一个静态类并且有上百万个对象试图访问STACK中的同一对象时会发生什么
特别是当它是dataAccess
类或访问activeDirectory
对象的类时。
我在程序员SE聊天室聊天。 他们没有明确说出来,但是我的印象是永远不要使用静态类进行查询,例如sql,活动目录等。而且,静态类应仅限于简单的静态代码-不进行查询。
查看您提供给我们的代码,该代码似乎是线程安全的。 线程之间没有共享(内存中的)数据。
我唯一关心的是db层-确保使用正确的隔离级别以避免脏读。
同样,如果我也将此类更改为静态,将会发生什么。
关于GetStudentRecords
? 没有。
这是线程不安全代码的经典示例。
public class MyDataAccess
{
private static int _retrievalCount = 0;
public static StudentDataTable GetStudentRecords(int schoolID)
{
_retrievalCount ++;
// retrieve and return records;
}
}
_retrievalCount
字段在线程之间共享。 并且++
操作不是原子的。 也就是说,它涉及三个步骤
_retrievalCount
中的_retrievalCount
_retrievalCount
。 如果两个线程同时执行此操作,并且交错了这三个步骤,则可能会发生这种情况(假设_retrievalCount
从0开始,并且有2个线程在运行):
_retrievalCount
为0 _retrievalCount
为0 _retrievalCount
_retrievalCount
预期输出为2,但实际输出为1。
在C#中,“静态”仅意味着您可以直接从类定义中调用该方法,而不是针对该类的实例调用该方法。
将“类”视为对象的蓝图。 创建对象的实例时,蓝图会告诉计算机如何创建对象。 但是,该类的某些方面不需要实际的对象实例,而这些方面都是通过“静态”方法提供的候选对象。
如果将方法的声明更改为包括“ static”,则它将更改必须调用的方式。
public class Example
{
static void StaticMethod() {...}; // object instance *not* required
void InstanceMethod() {...}; // object instance *is* required
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.