2015-08-25 2 views
0

Допустим, у меня есть метод, как это:Понимание Статический класс и статический метод

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; 
     } 
    } 
} 

Если этот метод доступен в 1000 раз за один раз, с помощью консольного приложения или любые другие средства, будет ли какой-либо вероятность того, что он вернет записи для ученика одной школы в другую школу?

например.

var records1 = GetStudentRecords(1); 
..... 
var records1000 = GetStudentRecords(1000); 

Есть ли шанс из records1 переменных получать записей schoolID = 1 смешанных с записями из records1000, даже если они приходят звонки от своих собственных потоков?

Также, что произойдет, если я изменю этот класс на статику?

Мое понимание в этом пункте

1) Да, я понимаю, что такое класс

2) Да, я знаю, что статические классы не нужны необходимые экземпляры, которые будут использоваться

3) Я знаю, что должен быть простой статический код, например, преобразование типов данных.

Но что я запутался с это:

Что происходит, когда есть один статический класс и есть миллион объектов, пытающиеся получить доступ к тем же целям в СТОГЕ

особенно когда это dataAccess класс или класс, который обращается к объектам activeDirectory.

У меня был чат в комнате для программистов SE. Они не сказали это явно, но у меня сложилось впечатление, что никогда не используйте статические классы для запросов, например. sql, active directory и т. д. И эти статические классы должны быть ограничены простым статическим кодом - без запроса.

+3

Попробуй и узнать ... – TheLethalCoder

+0

не ответ на ваш вопрос, но это не выглядит хорошим кандидатом для статического мне. Вы можете прочитать это: http://stackoverflow.com/questions/241339/when-to-use-static-classes-in-c-sharp?rq=1 – Paddy

+1

Нет, все в порядке. 'что произойдет, если я тоже изменю этот класс на статику'. Ничего, в рамках вашего вопроса. – Jonesopolis

ответ

5

Рассматривая код, который вы нам предоставили, код кажется потокобезопасным. Нет данных (в памяти), разделяемых между потоками.

Моя единственная забота будет о слое db - убедитесь, что вы используете правильный isolation level, чтобы избежать грязных чтений.

Также, что произойдет, если я изменю этот класс на статику.

Относительно GetStudentRecords? Ничего.


Вот классический пример небезопасного кода.

public class MyDataAccess 
{ 

    private static int _retrievalCount = 0; 

    public static StudentDataTable GetStudentRecords(int schoolID) 
    { 
     _retrievalCount ++; 

     // retrieve and return records;    
    } 
} 

_retrievalCount делится на темы. И операция ++ не является атомарной.То есть, она включает в себя три этапа

  1. извлечения integered хранится в _retrievalCount
  2. добавления к нему 1
  3. и хранить результат обратно в _retrievalCount.

Если две нити делают это одновременно, и эти 3 шага перемежаются, то это может произойти вместо (предположим, что _retrievalCount начинается с 0 и есть 2 нити бегущие):

  1. Поток А читает _retrievalCount, как 0
  2. Поток А добавляет 1 к 0, результат = 1
  3. резьбы Б читает _retrievalCount как 0
  4. резьбы Б добавляет 1 к 0, результат = 1
  5. резьбы A сохраняет результат = 1 в _retrievalCount
  6. резьбы B сохраняет результат = 1 в _retrievalCount

Ожидаемый выход составил 2, но фактический выход был 1.

+0

Можете ли вы показать мне пример того, как данные распределяются между потоками, может быть, это то, что я путайте его с – Mathematics

+0

Что это такое, что вас смущает? Вы опубликовали, по-видимому, совершенно прекрасный пример кода, который на самом деле не выделяет ничего о том, как работает стати или используется. Если вы укажете, я могу попытаться уточнить ответ. –

+0

@ Математика Я добавил пример. – dcastro

4

В C#, "статический" просто означает, что вы можете вызвать метод непосредственно из определения класса, а не вызвать его против экземпляра класса.

Подумайте о «классе» в качестве чертежа для объекта. Когда вы создаете экземпляр объекта, проект указывает компьютеру, как его создать. Однако есть некоторые аспекты класса, которые не требуют фактического экземпляра объекта, и эти аспекты являются кандидатами, которые предоставляются через «статические» методы.

Если вы изменили объявление своего метода на включение «статического», оно изменит способ его вызова.

public class Example 
{ 
    static void StaticMethod() {...}; // object instance *not* required 
    void InstanceMethod() {...};  // object instance *is* required 
} 
Смежные вопросы