Каковы виды использования «using» в C # - PullRequest
289 голосов
/ 16 сентября 2008

Пользователь kokos ответил на замечательный вопрос Скрытые возможности C # , упомянув ключевое слово using. Можете ли вы уточнить это? Каковы виды использования using?

Ответы [ 29 ]

1 голос
/ 02 апреля 2015

Оператор using обеспечивает удобный механизм для правильного использования IDisposable объектов. Как правило, когда вы используете объект IDisposable, вы должны объявить и создать его экземпляр в операторе using. Оператор using вызывает метод Dispose для объекта правильным образом и (когда вы используете его, как показано ранее), он также заставляет сам объект выходить из области действия, как только вызывается Dispose. Внутри блока using объект доступен только для чтения и не может быть изменен или переназначен.

Это происходит от: здесь

1 голос
/ 27 апреля 2015

Для меня имя «использование» немного сбивает с толку, потому что это может быть директивой для импорта пространства имен или оператора (как обсуждалось здесь) для обработки ошибок.

Было бы неплохо другое имя для обработки ошибок, а может быть, и более очевидное.

1 голос
/ 16 сентября 2008

Не то чтобы это крайне важно, но использование может также использоваться для изменения ресурсов на лету. Да, одноразовые, как уже упоминалось ранее, но, возможно, вам не нужны ресурсы, которые они не соответствуют другим ресурсам во время остальной части вашего исполнения. Итак, вы хотите избавиться от него, чтобы он не мешал другим.

1 голос
/ 30 июля 2018

Существует два варианта использования ключевого слова в C # следующим образом.

  1. как директива

Обычно мы используем ключевое слово using для добавления пространств имен в коде и файлах классов. Затем он делает доступными все классы, интерфейсы и абстрактные классы, а также их методы и свойства на текущей странице.

Ex:

using System.IO;  
  1. как утверждение

Это еще один способ использовать ключевое слово using в C #. Это играет жизненно важную роль в улучшении производительности в сборке мусора. Оператор using гарантирует, что Dispose () вызывается, даже если возникает исключение при создании объектов и вызове методов, свойств и т. Д. Dispose () - это метод, присутствующий в интерфейсе IDisposable, который помогает реализовать пользовательскую сборку мусора. Другими словами, если я выполняю какую-либо операцию с базой данных (Вставка, Обновление, Удаление), но каким-то образом происходит исключение, то здесь оператор using автоматически закрывает соединение. Нет необходимости явно вызывать метод Close () подключения.

Другим важным фактором является то, что он помогает в пуле соединений. Пул подключений в .NET помогает избежать многократного закрытия соединения с базой данных. Он отправляет объект подключения в пул для будущего использования (следующий вызов базы данных). При следующем вызове соединения с базой данных из вашего приложения пул соединений извлекает объекты, доступные в пуле. Так что это помогает улучшить производительность приложения. Поэтому, когда мы используем оператор using, контроллер автоматически отправляет объект в пул соединений, поэтому нет необходимости явно вызывать методы Close () и Dispose ().

Вы можете сделать то же, что и оператор using, используя блок try-catch и явно вызывая Dispose () внутри блока finally. Но оператор using делает вызовы автоматически, чтобы сделать код чище и элегантнее. Внутри блока using объект доступен только для чтения и не может быть изменен или переназначен.

Ex:

    string connString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;";  

using (SqlConnection conn = new SqlConnection(connString))  
{  
      SqlCommand cmd = conn.CreateCommand();  
      cmd.CommandText = "SELECT CustomerId, CompanyName FROM Customers";  
      conn.Open();  
      using (SqlDataReader dr = cmd.ExecuteReader())  
      {  
         while (dr.Read())  
         Console.WriteLine("{0}\t{1}", dr.GetString(0), dr.GetString(1));  
      }  
}  

В предыдущем коде я не закрываю соединение, оно автоматически закрывается. Оператор using вызовет conn.Close () автоматически из-за оператора using (using (SqlConnection conn = new SqlConnection (connString)) и того же для объекта SqlDataReader. А также, если произойдет любое исключение, он автоматически закроет соединение. 1024 *

Для получения дополнительной информации -> https://www.c -sharpcorner.com / UploadFile / manas1 / использование и важность использования в C-Sharp472 /

1 голос
/ 16 сентября 2008

Другой пример разумного использования, при котором объект немедленно утилизируется:

using (IDataReader myReader = DataFunctions.ExecuteReader(CommandType.Text, sql.ToString(), dp.Parameters, myConnectionString)) 
{
    while (myReader.Read()) 
    {
        MyObject theObject = new MyObject();
        theObject.PublicProperty = myReader.GetString(0);
        myCollection.Add(theObject);
    }
}
1 голос
/ 04 января 2017

Он также может быть использован для создания областей, например:

class LoggerScope:IDisposable {
   static ThreadLocal<LoggerScope> threadScope = 
        new ThreadLocal<LoggerScope>();
   private LoggerScope previous;

   public static LoggerScope Current=> threadScope.Value;

   public bool WithTime{get;}

   public LoggerScope(bool withTime){
       previous = threadScope.Value;
       threadScope.Value = this;
       WithTime=withTime;
   }

   public void Dispose(){
       threadScope.Value = previous;
   }
}


class Program {
   public static void Main(params string[] args){
       new Program().Run();
   }

   public void Run(){
      log("something happend!");
      using(new LoggerScope(false)){
          log("the quick brown fox jumps over the lazy dog!");
          using(new LoggerScope(true)){
              log("nested scope!");
          }
      }
   }

   void log(string message){
      if(LoggerScope.Current!=null){
          Console.WriteLine(message);
          if(LoggerScope.Current.WithTime){
             Console.WriteLine(DateTime.Now);
          }
      }
   }

}
1 голос
/ 08 марта 2018

Оператор using указывает .NET освободить объект, указанный в блоке using, когда он больше не нужен. Поэтому вы должны использовать блок «using» для классов, которые требуют очистки после них, таких как System.IO Types.

0 голосов
/ 11 мая 2018

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

CLR преобразует ваш код в MSIL. А оператор using переводится в блок try and finally. Вот как оператор использования представлен в IL. Заявление об использовании переводится на три части: приобретение, использование и утилизация. Ресурс сначала запрашивается, затем использование включается в оператор try с предложением finally. Затем объект располагается в предложении finally.

0 голосов
/ 28 ноября 2013

Параметр Using используется для определения области действия конкретной переменной. Например:

     Using(SqlConnection conn=new SqlConnection(ConnectionString)
            {
                Conn.Open()
            // Execute sql statements here.
           // You do not have to close the connection explicitly here as "USING" will close the connection once the object Conn becomes out of the defined scope.
            }
...