답변
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()
함수를 호출 할 필요없이 닫 히며 , / / 필요없이 예외가 발생하더라도 발생합니다 .try
catch
finally
답변
사용하여 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();
}
}
}