Как правильно использовать точки останова при использовании инициализатора объекта? - PullRequest
3 голосов
/ 25 февраля 2011

Например, делая что-то вроде этого:

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

Или, может быть, я что-то упустил. Может ли правильно отлаживаться при использовании инициализатора объекта?

1 Ответ

2 голосов
/ 25 февраля 2011

Инициализаторы объектов являются просто синтаксическим сахаром и переводятся при компиляции.Ваш первоначальный инициализатор объекта становится примерно таким:

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. Переменные Temp.Вместо непосредственного присвоения Id = row.Field<int>("Id"), присвойте row.Field<int>("Id") сначала временной переменной (или той, которую вы хотите отладить), а затем назначьте переменную temp свойству инициализатора объекта.

  3. Вызов метода.Вы можете заключить часть кода в вызов пользовательского метода исключительно для того, чтобы позволить вам добавить точку останова в свой пользовательский метод.Вы можете даже обобщить это так:

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

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