[C#] C #에서 “사용”의 용도는 무엇입니까?

사용자 kokos 는 키워드 를 언급하여 C # 의 멋진 숨겨진 기능 질문에 답변했습니다 using. 그것에 대해 자세히 설명해 주시겠습니까? 용도는 using무엇입니까?



답변

using명령문 의 이유 는 오브젝트가 범위를 벗어나 자마자 처리되도록하기위한 것이며 명시적인 코드가 필요하지 않습니다.

마찬가지로 C #을 (CodeProject의)에서 ‘사용’문을 이해 하고 는 IDisposable (마이크로 소프트) 구현하는 객체 사용 , C # 컴파일러의 변환을

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

C # 8에는 ” using declarations ” 라는 새로운 구문이 도입되었습니다 .

using 선언은 using 키워드가 앞에 오는 변수 선언입니다. 선언 된 변수가 둘러싸는 범위의 끝에 배치되어야한다고 컴파일러에 알려줍니다.

따라서 위와 동등한 코드는 다음과 같습니다.

using var myRes = new MyResource();
myRes.DoSomething();

그리고 제어가 포함 범위를 벗어나면 (보통 방법이지만 코드 블록 일 수도 있음) myRes폐기됩니다.


답변

많은 사람들이 여전히하기 때문에 :

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()함수를 호출 할 필요없이 닫 히며 , / / 필요없이 예외가 발생하더라도 발생합니다 .trycatchfinally


답변

사용하여 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();
}

우리의 솔루션에 대한 자세한 내용과 여기 에서 우리가 그 솔루션을 도출 한 방법에 대해 읽을 수 있습니다 .


답변

Microsoft 설명서에는 using지시문명령문 으로 두 가지 기능 ( https://msdn.microsoft.com/en-us/library/zhdeatwt.aspx ) 이 있다고 명시되어 있습니다. A와 은 다른 답변에서 여기에서 지적 된 바와 같이, 키워드는 기본적으로 처분 할 수있는 범위를 결정하는 문법 설탕이다 는 IDisposable 개체를. A와 지시어 , 그것은 정기적으로 수입 네임 스페이스 및 유형에 사용됩니다. 또한 지시자로, 당신은 만들 수 있습니다 별칭 이 책에서 지적 밖으로로서, 네임 스페이스 및 유형을 “간단히 말해서 C # 5.0 : 확실한 가이드”( http://www.amazon.com/5-0-Nutshell-The-을 확정 참조 전자 책 / dp / B008E6I1K8), 조셉과 벤 알바 하리 한 가지 예 :

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 ) 에는 장단점을 언급하는 C # 별칭에 대한 좋은 설명이 있습니다 .


답변

과거에는 입력 및 출력 스트림으로 작업하는 데 많이 사용했습니다. 그것들을 멋지게 중첩시킬 수 있으며 일반적으로 (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();
                }
            }
        }