문제

사용자 코코스 훌륭하게 대답했다 C#의 숨겨진 기능 언급하면서 질문 using 예어.그것에 대해 자세히 설명해주실 수 있나요?용도는 무엇입니까 using?

도움이 되었습니까?

해결책

그 이유는 using 문은 개체가 범위를 벗어나는 즉시 삭제되도록 보장하며, 이를 보장하기 위해 명시적인 코드가 필요하지 않습니다.

에서와 같이 C#의 'using' 문 이해, .NET CLR은 변환합니다.

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();
}

에게

{ // Limits scope of myRes
    MyResource myRes= new MyResource();
    try
    {
        myRes.DoSomething();
    }
    finally
    {
        // Check for a null resource.
        if (myRes != null)
            // Call the object's Dispose method.
            ((IDisposable)myRes).Dispose();
    }
}

다른 팁

아직도 많은 사람들이 그렇게 하기 때문에:

using (System.IO.StreamReader r = new System.IO.StreamReader(""))
using (System.IO.StreamReader r2 = new System.IO.StreamReader("")) {
   //code
}

아직도 많은 사람들이 당신이 할 수 있다는 것을 모르는 것 같아요:

using (System.IO.StreamReader r = new System.IO.StreamReader(""), r2 = new System.IO.StreamReader("")) {
   //code
}

다음과 같은 것:

using (var conn = new SqlConnection("connection string"))
{
   conn.Open();

    // Execute SQL statement here on the connection you created
}

이것 SqlConnection 명시적으로 호출할 필요 없이 닫힙니다. .Close() 기능을 수행하면 이런 일이 발생합니다 예외가 발생하더라도, 필요 없이 try/catch/finally.

using을 사용하여 IDisposable을 호출할 수 있습니다.별칭 유형에도 사용할 수 있습니다.

using (SqlConnection cnn = new SqlConnection()) { /*code*/}
using f1 = System.Windows.Forms.Form;

사용하다, 의미에서

using (var foo = new Bar())
{
  Baz();
}

실제로 try/finally 블록을 줄여서 표현한 것입니다.이는 다음 코드와 동일합니다.

var foo = new Bar();
try
{
  Baz();
}
finally
{
  foo.Dispose();
}

물론 첫 번째 스니펫은 두 번째 스니펫보다 훨씬 더 간결하며, 예외가 발생하더라도 정리로 수행할 수 있는 작업이 많다는 점을 알 수 있습니다.이 때문에 우리는 Dispose 메서드에서 임의의 코드를 실행할 수 있는 Scope라는 클래스를 고안했습니다.예를 들어, 작업을 수행하려고 시도한 후에 항상 false로 설정하고 싶은 IsWorking이라는 속성이 있는 경우 다음과 같이 수행합니다.

using (new Scope(() => IsWorking = false))
{
  IsWorking = true;
  MundaneYetDangerousWork();
}

당사의 솔루션과 이를 도출한 방법에 대해 자세히 알아볼 수 있습니다. 여기.

나는 과거에 입력 및 출력 스트림 작업을 위해 이 방법을 많이 사용했습니다.멋지게 중첩할 수 있으며 자동으로 dispose를 호출하여 일반적으로 직면하게 되는 많은 잠재적인 문제를 제거합니다.예를 들어:

        using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open))
        {
            using (BufferedStream bs = new BufferedStream(fs))
            {
                using (System.IO.StreamReader sr = new StreamReader(bs))
                {
                    string output = sr.ReadToEnd();
                }
            }
        }

Microsoft 문서에 따르면 사용하여 이중 기능을 가지고 있습니다 (https://msdn.microsoft.com/en-us/library/zhdeatwt.aspx), 둘 다 지령 그리고 진술.로서 성명, 여기 다른 답변에서 지적했듯이 키워드는 기본적으로 처리 범위를 결정하는 구문 설탕입니다. IDisposable 물체.로서 지령, 네임스페이스와 유형을 가져오는 데 일상적으로 사용됩니다.또한 지시어로 다음을 생성할 수 있습니다. 별칭 "C# 5.0 In a Nutshell:" 책에서 지적한 대로 네임스페이스 및 유형에 대해최종 가이드"(http://www.amazon.com/5-0-Nutshell-The-Definitive-Reference-ebook/dp/B008E6I1K8), 조셉 알바하리(Joseph Albahari)와 벤 알바하리(Ben Albahari).한 가지 예:

namespace HelloWorld
{
    using AppFunc = Func<IDictionary<DateTime, string>, List<string>>;
    public class Startup
    {
        public static AppFunc OrderEvents() 
        {
            AppFunc appFunc = (IDictionary<DateTime, string> events) =>
            {
                if ((events != null) && (events.Count > 0))
                {
                    List<string> result = events.OrderBy(ev => ev.Key)
                        .Select(ev => ev.Value)
                        .ToList();
                    return result;
                }
                throw new ArgumentException("Event dictionary is null or empty.");
            };
            return appFunc;
        }
    }
}

이 관행을 남용하면 코드의 명확성이 손상될 수 있으므로 이는 현명하게 채택해야 할 사항입니다.DotNetPearls(http://www.dotnetperls.com/using-alias).

내가 놀란 것을 조금 추가하는 것만으로는 나오지 않았습니다.내 생각에 using의 가장 흥미로운 특징은 using 블록을 어떻게 종료하든 관계없이 항상 개체를 삭제한다는 것입니다.여기에는 반품 및 예외가 포함됩니다.

using (var db = new DbContext())
{
    if(db.State == State.Closed) throw new Exception("Database connection is closed.");
    return db.Something.ToList();
}

예외가 발생하거나 목록이 반환되는지는 중요하지 않습니다.DbContext 개체는 항상 삭제됩니다.

using의 또 다른 유용한 용도는 모달 대화 상자를 인스턴스화할 때입니다.

Using frm as new Form1

Form1.ShowDialog

' do stuff here

End Using

결론적으로, 구현하는 유형의 지역 변수를 사용하면 IDisposable, 언제나, 예외 없이 사용 using1.

비로컬을 사용하는 경우 IDisposable 변수, 그럼 언제나 구현 IDisposable 무늬.

두 가지 간단한 규칙, 예외 없음1.그렇지 않으면 리소스 누출을 방지하는 것이 *ss의 진짜 고통입니다.


1):유일한 예외는 – 예외를 처리하는 경우입니다.그러면 호출할 코드가 줄어들 수 있습니다. Dispose 명시적으로 finally 차단하다.

흥미롭게도 다른 흥미로운 것에도 using/IDisposable 패턴을 사용할 수 있습니다(예: Rhino Mocks가 사용하는 방식의 다른 지점).기본적으로 컴파일러가 다음을 수행한다는 사실을 활용할 수 있습니다. 언제나 "사용된" 개체에 대해 .Dispose를 호출합니다.특정 수술 후에 꼭 해야 할 일이 있다면...시작과 끝이 정해져 있는 것...그런 다음 생성자에서 작업을 시작한 다음 Dispose 메서드에서 완료하는 IDisposable 클래스를 만들면 됩니다.

이를 통해 정말 멋진 using 구문을 사용하여 해당 작업의 명시적인 시작과 끝을 나타낼 수 있습니다.이는 System.Transactions가 작동하는 방식이기도 합니다.

다음 예를 통해 별칭 네임스페이스를 활용할 수 있습니다.

using LegacyEntities = CompanyFoo.CoreLib.x86.VBComponents.CompanyObjects;

이것은 별칭 지시어 사용 보시다시피, 코드에서 당신이 말하는 것을 명확하게 만들려면 긴 바람개비를 숨기는 데 사용될 수 있습니다.

LegacyEntities.Account

대신에

CompanyFoo.CoreLib.x86.VBComponents.CompanyObjects.Account

아니면 단순히

Account   // It is not obvious this is a legacy entity

ADO.NET을 사용할 때 연결 개체나 판독기 개체와 같은 항목에 대한 키워크를 사용할 수 있습니다.이렇게 하면 코드 블록이 완료되면 연결이 자동으로 삭제됩니다.

"using"은 이름 공간 충돌을 해결하는 데에도 사용할 수 있습니다.보다 http://www.davidarno.org/c-howtos/aliases-overcoming-name-contributes/ 나는 주제에 관해 쓴 짧은 튜토리얼을 위해.

public class ClassA:IDisposable

{
   #region IDisposable Members        
    public void Dispose()
    {            
        GC.SuppressFinalize(this);
    }
    #endregion
}

public void fn_Data()

    {
     using (ClassA ObjectName = new ClassA())
            {
                //use objectName 
            }
    }

사용하여 사용 후 폐기하려는 리소스가 있는 경우에 사용됩니다.

예를 들어 File 리소스를 할당하고 약간의 읽기 또는 쓰기를 위해 코드의 한 섹션에서만 사용해야 하는 경우 사용이 완료되자마자 File 리소스를 삭제하는 데 도움이 됩니다.

사용되는 리소스가 제대로 작동하려면 IDisposable을 구현해야 합니다.

예:

using (File file = new File (parameters))
{
    *code to do stuff with the file*
}

using 키워드는 개체의 범위를 정의한 다음 범위가 완료되면 개체를 삭제합니다.예를 들어.

using (Font font2 = new Font("Arial", 10.0f))
{
    // use font2
}

보다 여기 C# using 키워드에 대한 MSDN 기사를 참조하세요.

매우 중요한 것은 아니지만 using을 사용하여 즉시 리소스를 변경할 수도 있습니다.예, 앞서 언급한 대로 일회용이지만 특히 나머지 실행 동안 다른 리소스와 일치하지 않는 리소스를 원하지 않을 수도 있습니다.그래서 다른 곳에 방해가 되지 않도록 처리하고 싶습니다.

아래 댓글 덕분에 이 게시물을 조금 정리하겠습니다. (당시에는 '쓰레기 수집'이라는 단어를 사용하지 말았어야 했는데, 죄송합니다.)
using을 사용하면 using 범위 끝에 있는 개체에 대해 Dispose() 메서드가 호출됩니다.따라서 Dispose() 메서드에 꽤 많은 훌륭한 정리 코드가 있을 수 있습니다.
여기에 표시되지 않은 내용을 얻을 수 있는 주요 항목은 다음과 같습니다.IDisposable을 구현하는 경우 Dispose() 구현에서 GC.SuppressFinalize()를 호출해야 합니다. 그렇지 않으면 자동 가비지 수집이 수행되어 특정 시점에 완료하려고 시도합니다. 이는 최소한 리소스 낭비가 됩니다. 이미 Dispose()했습니다.

객체를 즉시 폐기하는 합리적인 사용의 또 다른 예:

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

중괄호 밖의 모든 항목은 폐기되므로 사용하지 않는 객체를 폐기하는 것이 좋습니다.이는 SqlDataAdapter 개체가 있고 이를 애플리케이션 수명 주기에서 한 번만 사용하고 하나의 데이터 세트만 채우고 더 이상 필요하지 않은 경우 다음 코드를 사용할 수 있기 때문입니다.

using(SqlDataAdapter adapter_object = new SqlDataAdapter(sql_command_parameter))
{
   // do stuff
} // here adapter_object is disposed automatically

using 문은 IDisposable 개체를 올바르게 사용하기 위한 편리한 메커니즘을 제공합니다.일반적으로 IDisposable 개체를 사용하는 경우 using 문에서 해당 개체를 선언하고 인스턴스화해야 합니다.using 문은 올바른 방식으로 개체에 대해 Dispose 메서드를 호출하며, (앞서 설명한 대로 사용하는 경우) Dispose가 호출되자마자 개체 자체가 범위를 벗어나게 합니다.using 블록 내에서 개체는 읽기 전용이므로 수정하거나 다시 할당할 수 없습니다.

이는 다음에서 비롯됩니다. 여기

나에게 "using"이라는 이름은 약간 혼란스럽습니다. 왜냐하면 이는 오류 처리를 위해 네임스페이스나 명령문(여기서 설명한 것과 같은)을 가져오라는 지시문일 수 있기 때문입니다.

오류 처리에 대한 다른 이름이 있었으면 좋았을 것이고 어쩌면 좀 더 분명한 이름이었을 것입니다.

또한 예를 들어 범위를 생성하는 데에도 사용할 수 있습니다.

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

}

using 문은 더 이상 필요하지 않은 경우 using 블록에 지정된 개체를 해제하도록 .NET에 지시합니다.따라서 System.IO 유형과 같이 이후 정리가 필요한 클래스에는 'using' 블록을 사용해야 합니다.

C#에서는 다음과 같이 키워드를 사용하는 두 가지 사용법이 있습니다.

  1. 지시어로

일반적으로 우리는 코드 숨김 파일과 클래스 파일에 네임스페이스를 추가하기 위해 using 키워드를 사용합니다.그런 다음 현재 페이지에서 모든 클래스, 인터페이스, 추상 클래스와 해당 메서드 및 속성을 사용할 수 있게 만듭니다.

전:

using System.IO;  
  1. 성명서로

이는 C#에서 using 키워드를 사용하는 또 다른 방법입니다.Garbage Collection의 성능을 향상시키는 데 중요한 역할을 합니다.using 문을 사용하면 개체를 만들고 메서드, 속성 등을 호출할 때 예외가 발생하더라도 Dispose()가 호출됩니다.Dispose()는 사용자 지정 가비지 수집을 구현하는 데 도움이 되는 IDisposable 인터페이스에 있는 메서드입니다.즉, 일부 데이터베이스 작업(삽입, 업데이트, 삭제)을 수행 중인데 어떻게든 예외가 발생하면 여기에서 using 문이 자동으로 연결을 닫습니다.연결 Close() 메서드를 명시적으로 호출할 필요가 없습니다.

또 다른 중요한 요소는 연결 풀링에 도움이 된다는 것입니다..NET의 연결 풀링은 데이터베이스 연결이 여러 번 닫히는 것을 방지하는 데 도움이 됩니다.나중에 사용할 수 있도록 연결 개체를 풀로 보냅니다(다음 데이터베이스 호출).다음에 애플리케이션에서 데이터베이스 연결이 호출되면 연결 풀은 풀에서 사용 가능한 개체를 가져옵니다.따라서 애플리케이션의 성능을 향상시키는 데 도움이 됩니다.따라서 using 문을 사용하면 컨트롤러가 개체를 연결 풀에 자동으로 전송하므로 Close() 및 Dispose() 메서드를 명시적으로 호출할 필요가 없습니다.

try-catch 블록을 사용하고 finally 블록 내에서 Dispose()를 명시적으로 호출하여 using 문이 수행하는 작업과 동일한 작업을 수행할 수 있습니다.그러나 using 문은 코드를 더 깔끔하고 우아하게 만들기 위해 자동으로 호출을 수행합니다.using 블록 내에서 개체는 읽기 전용이므로 수정하거나 다시 할당할 수 없습니다.

전:

    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 문은 using 문(using (SqlConnection conn = new SqlConnection(connString))으로 인해 자동으로 conn.Close()를 호출하며 SqlDataReader 개체에도 동일합니다.또한 예외가 발생하면 자동으로 연결이 닫힙니다.

더 많은 정보를 원하시면 --> https://www.c-sharpcorner.com/UploadFile/manas1/usage-and-importance-of-using-in-C-Sharp472/

그만큼 Rhino는 녹음 재생 구문을 모의합니다. 흥미롭게 활용한다 using.

명령문으로 사용하면 지정된 객체의 폐기를 자동으로 호출합니다.개체는 IDisposable 인터페이스를 구현해야 합니다.동일한 유형 인 한 한 명령문에서 여러 객체를 사용할 수 있습니다.

CLR은 코드를 MSIL로 변환합니다.그리고 using 문은 try 및 finally 블록으로 변환됩니다.이것이 IL에서 using 문이 표현되는 방식입니다.using 문은 세 부분으로 변환됩니다.획득, 사용 및 폐기.리소스가 먼저 획득된 다음 finally 절이 있는 try 문에 사용법이 포함됩니다.그런 다음 개체는 finally 절에서 삭제됩니다.

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.
            }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top