繁体   English   中英

了解静态类和静态方法

[英]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字段在线程之间共享。 并且++操作不是原子的。 也就是说,它涉及三个步骤

  1. 检索存储在_retrievalCount中的_retrievalCount
  2. 加1
  3. 并将结果存储回_retrievalCount

如果两个线程同时执行此操作,并且交错了这三个步骤,则可能会发生这种情况(假设_retrievalCount从0开始,并且有2个线程在运行):

  1. 线程A读取_retrievalCount为0
  2. 线程A将1加0,结果= 1
  3. 线程B读取_retrievalCount为0
  4. 线程B将1加0,结果= 1
  5. 线程A将结果= 1存储在_retrievalCount
  6. 线程B将结果= 1存储在_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM