How to debug object initializer code?
Asked Answered
A

5

41

Is there a way to step by step debug the object initializer code in Visual Studio?

Example:

return new Veranstaltung()
            {
                ID = tblVeranstaltung.VeranstaltungsID,
                Titel = tblVeranstaltung.Titel,
                KursNummer = tblVeranstaltung.Kursnummer,
                ErsterTermin = tblVeranstaltung.ersterTermin,
                Dauer = tblVeranstaltung.schulungsTage,
                StartZeit = tblVeranstaltung.BeginnZeit,
                EndZeit = tblVeranstaltung.Endzeit,
                KostenNettoValue = tblVeranstaltung.PreisNetto ?? default(decimal),
                IsLastMinute = tblVeranstaltung.lastMinute == 1,
                IsVerkuerzt = tblVeranstaltung.istVerkuerzt == 1,
                IsGeschlossen = tblVeranstaltung.istGeschlosseneVeranstaltung == 1,
                IsIntern = tblVeranstaltung.istInterneVeranstaltung == 1,
                StandortID = Convert.ToInt32(tblVeranstaltung.StandortID),
                LastMinuteRabatt = tblVeranstaltung.lastMinuteRabatt ?? default(decimal)
            };

Sometimes I get errors in this kind of code (for example when a conversion to int fails) and VS seems to be unable to step through it, it just throws an error for the whole line and I have to try out which of the initializations failed.

Is there an easy way to debug this or is it better to avoid the object initializer for large or complex initializiations?

I am using VS 2010 and C# 4.0.

Auteur answered 30/3, 2011 at 16:47 Comment(0)
O
18

Object initializers should be kept for simple object initialization. If you are in the point where your object constructor has code that may fail (e.g. throwing an exception), don't use it. Better rely on an object construction pattern, which depending on your needs may be a factory method, an abstract factory,etc... This also ensures that all the users of your class cannot build an instance that is in an invalid state (e.g. they forget to initialize a member, or they initialize related members with incorrect values, etc...)

Oliverolivera answered 3/4, 2011 at 9:32 Comment(0)
D
9

or is it better to avoid the object initializer for large or complex initializiations?

Yes, it becomes hard to maintain (and debug).

Drape answered 30/3, 2011 at 16:50 Comment(0)
W
7

Not sure whether it's possible in Visual Studio 2010, but in Visual Studio 2017, you can do that by disabling the option to step over property setters in Visual Studio Debug settings:

enter image description here

Wildawildcat answered 11/10, 2018 at 9:22 Comment(0)
T
4

The debugging support for object initializers isn't very good in Visual Studio 2010. It may be pragmatic to avoid using object initializers for large or complex initializiations for that reason, but I don't consider using large or complex (e.g. nested) object initializations a bad design choice in and of itself.

I have found that for mapping objects that represent documents/records (like your example), it makes for a very readable declarative style, minimizing "noise" in the code, and allowing the reader to more clearly see the relationship between the source and target. This approach also encourages a separation of data mapping from data validation, which I think is desirable.

A null-safe dereference operator would also help a lot when coding in this style, but that's another topic! Hopefully, a future relase of Visual Studio may improve the debugging of these useful constructs.

Tapping answered 17/8, 2012 at 16:20 Comment(0)
I
1

Step Into (F11) works while debugging in VS2015 and up, without any configuration.

Intarsia answered 30/4, 2019 at 9:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.