의 메소드 값 반환 내부 의 DataContext를 가져옵니다 using 문은 항상 일 것 같습니다 잘 같은 :
public static Transaction GetMostRecentTransaction(int singleId)
{
using (var db = new DataClasses1DataContext())
{
var transaction = (from t in db.Transactions
orderby t.WhenCreated descending
where t.Id == singleId
select t).SingleOrDefault();
return transaction;
}
}
그러나 항상 사용 대괄호를 벗어나기 전에 무언가 를 닫아야 한다고 생각합니다 . 예를 들어 using 문 전에 트랜잭션을 정의 하고 대괄호 내부 에서 값 을 얻은 다음 대괄호 뒤에 반환 합니다.
사용 괄호 밖에서 변수를 정의하고 리턴하는 것이 더 나은 방법이거나 자원을 보존 하는가?
답변
아니, 나는 이것이 더 분명하다고 생각한다. 걱정하지 마십시오. Dispose
여전히 “나갈 때”라고 부릅니다 . 반환 값이 완전히 평가 된 후에 만 가능 합니다. 언제라도 예외가 발생하더라도 (반환 값 평가 포함) Dispose
여전히 호출됩니다.
확실히 더 긴 경로를 취할 수 는 있지만 (정신적으로) 추적하기 위해 부스러기와 추가 컨텍스트를 추가하는 두 개의 추가 라인입니다. 실제로 추가 로컬 변수는 필요하지 않지만 디버깅 측면에서 편리 할 수 있습니다. 당신 은 단지 가질 수 있습니다 :
public static Transaction GetMostRecentTransaction(int singleId)
{
using (var db = new DataClasses1DataContext())
{
return (from t in db.Transactions
orderby t.WhenCreated descending
where t.Id == singleId
select t).SingleOrDefault();
}
}
사실, 난 점 표기법을 사용하고 넣어 유혹 될 수 Where
내에서 조건을 SingleOrDefault
:
public static Transaction GetMostRecentTransaction(int singleId)
{
using (var db = new DataClasses1DataContext())
{
return db.Transactions.OrderByDescending(t => t.WhenCreated)
.SingleOrDefault(t => t.Id == singleId);
}
}
답변
이것 좀 봐
CLR은 코드를 MSIL로 변환합니다. using 문은 try 및 finally 블록으로 변환됩니다. 이것이 using 문이 IL에서 표현되는 방식입니다. using 문은 획득, 사용 및 폐기의 세 부분으로 번역됩니다. 자원을 먼저 확보 한 후 사용법은 finally 절과 함께 try 문으로 묶습니다. 그런 다음 객체는 finally 절에 배치됩니다.
답변
명세서 내부에서 돌아 오는 부작용 은 없습니다using()
.
가장 읽기 쉬운 코드인지 여부는 또 다른 토론입니다.
답변
내 생각 엔 다 똑같아 코드에는 나쁘지 않습니다. .NET 프레임 워크는 객체가 생성 된 위치를 신경 쓰지 않습니다. 중요한 것은 참조 여부입니다.
답변
예, 부작용이있을 수 있습니다. 예를 들어 ASP.NET MVC 작업 메서드에서 동일한 기술을 사용하면 “ObjectContext 인스턴스가 삭제되어 더 이상 연결이 필요한 작업에 사용할 수 없습니다”라는 오류가 발생합니다.
public ActionResult GetMostRecentTransaction(int singleId)
{
using (var db = new DataClasses1DataContext())
{
var transaction = (from t in db.Transactions
orderby t.WhenCreated descending
where t.Id == singleId
select t).SingleOrDefault();
return PartialView("_transactionPartial", transaction);
}
}