2011-02-25 2 views
3

:개체 이니셜 라이저를 사용할 때 어떻게 중단 점을 올바르게 사용할 수 있습니까? 이 같은 일 예

foreach (DataRow row in data.Rows) 
{ 
    Person newPerson = new Person() 
    { 
     Id = row.Field<int>("Id"), 
     Name = row.Field<string>("Name"), 
     LastName = row.Field<string>("LastName"), 
     DateOfBirth = row.Field<DateTime>("DateOfBirth") 
    }; 

    people.Add(newPerson); 
} 

개별 대입에 브레이크 설정이 브레이크는 전체 블록에 설정되어 불가능하다.

foreach (DataRow row in data.Rows) 
{ 
    Person newPerson = new Person(); 
    newPerson.Id = row.Field<int>("Id"); 
    newPerson.Name = row.Field<string>("Name"); 
    newPerson.LastName = row.Field<string>("LastName"); 
    newPerson.DateOfBirth = row.Field<DateTime>("DateOfBirth"); 

    people.Add(newPerson); 
} 

을 아니면 내가 뭔가를 놓친 해요 : 내 코드가 파괴되어 특별히 위치를 확인하려면

, 나는 사용해야합니다. 개체 이니셜 라이저를 사용할 때 올바르게 디버그 할 수 있습니까?

답변

2

개체 이니셜 라이저는 구문 설탕 일 뿐이며 컴파일 될 때 변환됩니다. 원래의 개체 이니셜 라이저는 다음과 같이됩니다.

var temp = new Person(); 
temp.Id = row.Field<int>("Id"); 
temp.Name = row.Field<string>("Name"); 
temp.LastName = row.Field<string>("LastName"); 
temp.DateOfBirth = row.Field<DateTime>("DateOfBirth"); 
var person = temp; 

전체 블록이 한 단계 내에서 깨질 수 있으므로 번역됩니다. 특정 단계를 중단해야하는 경우 몇 가지 옵션이 있습니다.

  1. 해체. 디버깅하는 동안 객체 이니셜 라이저를 사용하지 말고 나중에 다시 넣을 수 있습니다.

  2. 온도 변수. Id = row.Field<int>("Id")을 직접 할당하는 대신 row.Field<int>("Id")을 먼저 임시 변수 (또는 디버깅하려는 변수)에 할당 한 다음 임시 변수를 개체 이니셜 라이저 속성에 할당하십시오.

  3. 메서드 호출. 사용자 지정 메서드 호출에서 코드 일부를 래핑하여 사용자 지정 메서드 내에 중단 점을 추가 할 수 있습니다. 당신은 이런 식으로 일반화 수 : ReSharper에서 같은 도구가 당신을 위해 초기화를 중단 할 수 있으며, 작업이 완료되면 다시 함께 다시 넣을 수 있습니다

Id = BreakThenDoSomething(() => row.Field<int>("Id")); 

    public static T BreakThenDoSomething<T>(Func<T> f) 
    { 
     Debugger.Break(); 
     return f(); 
    } 
+1

참고. –

+0

@ John Saunders, ReSharper는 훌륭한 도구입니다. –

+0

네,하지만 ... 객체 이니셜 라이저를 사용할 때의 이점은 무엇입니까? – Ozkan

관련 문제