2009-11-23 3 views
0

Mvc.JsonResultMvc.ViewResult 사이에는 암시 적 변환이 없으므로 조건부 연산자를 사용할 수는 없지만 대신 캐스트로 끝낼 수 있습니다.IsAjaxRequest와 함께 조건부 연산자를 사용하여 ActionResult를 반환합니다.

내 질문에 이르게하는 성능은 내가 JsonResult의 가치가있는 복싱을 위해 취하는 성과입니다. 아니면 정상적인 if...else 블록을 수행해야합니까?

아래 코드는 정상적인 컨트롤러 액션 내부에 나타납니다 public ActionResult Inactivate()

없음 복싱

if (Request.IsAjaxRequest()) 
{ 
    return Json(foo); 
} 
else 
{ 
    return View(bar); 
} 

VS 복싱

return Request.IsAjaxRequest() ? (ActionResult)Json(foo) : View(bar); 

답변

2

당신이 더 잘할 수있는 것을 할 수 있습니다. 성능에 미치는 영향이 없어야하므로 코딩 스타일과 명확성의 문제 일뿐입니다.

두 번째 예에서는 Json (foo) 또는 View (bar) 중 하나를 캐스팅해야합니다. 이는? : 연산자가 인수의 유형을 알아야하기 때문에 공통 기본 유형을 파악할만큼 똑똑하지 않기 때문입니다. 그것은 엄격하게 컴파일 타임이며 성능에 아무런 영향을 미치지 않습니다.

또한 여기에는 복싱이 없습니다. JsonResult와 ViewResult는 모두 구조체가 아닌 클래스이기 때문에 둘 다 이미 힙에 있습니다.

권투가 있었다고해도 성능에 실제 영향을 미칠 것입니다. ASP.NET MVC는 장면의 뒤에서 반성을하고 있으며 이는 복싱보다 비용이 많이 듭니다.

+0

답변에서 여러 가지를 배웠습니다. 고맙습니다. – ahsteele

0

나는 JsonResult 및 ViewResult 모두 ActionResult에서 상속 생각 , 캐스팅이 필요 없습니다. "No Boxing"코드 블록에서 Json과 View의 키워드 반환이 필요합니다.

+0

'ActionResult'에'Json'을 캐스팅하지 않으면 컴파일러 오류가 발생합니다. – ahsteele