possibly add units to the coordinates on the diagram - eg polar r and theta, cartesian x and y

p10.

Listing 8.7 shows an example of a schemaless entity type with two regular properties, but which otherwise allows arbitrary key/value pairs for its data.

should this be schema-less?

p13.

* One technique I’ve found useful in my work Protocol Buffers is to create Add methods accepting collections – effectively like AddRange, but with the ability to be used in collection initializers. ?

should be (with)

* One technique I’ve found useful in my work with Protocol Buffers is to create Add methods accepting collections – effectively like AddRange, but with the ability to be used in collection initializers. ?

p13.

* For example, consider a Person class with a read-only Contacts property that we want to populate with all the contacts from another list who live in Reading. ?

possibly a line-break before this sentence to split the paragraph

p16.

Unfortunately, it still exposes the Add method to the rest of the code in the same class, but again you need to way up whether that’s worse than the alternatives.

should be weigh:

Unfortunately, it still exposes the Add method to the rest of the code in the same class, but again you need to weigh up whether that’s worse than the alternatives.

p16.

Likewise, if you use indexers in your collection initializers for tests and accidentally put the same key twice, chances are very high that your tests will fail – so again, the downside it minimized.

should be is, in:

Likewise, if you use indexers in your collection initializers for tests and accidentally put the same key in twice, chances are very high that your tests will fail – so again, the downside is minimized.

p18.

The “overall expression” here – the part where evaluation stops abruptly if a null value is encountered – is basically the sequence of property, field, indexer and method accesses involved.

I think the correct word may be accessors:

The “overall expression” here – the part where evaluation stops abruptly if a null value is encountered – is basically the sequence of property, field, indexer and method accessors involved.

p18.

The compiler treats that roughly as if we’d written:

should be present tense/state:

The compiler treats this roughly as if we’d written:

p19.

There are two common ways of doing this: comparing against a bool constant, or using the null coalescing ?? operator.

using a colon with a list - probably should be bullet points or reworded

p19.

The behavior of bool? in comparisons with non-nullable values caused concern for the language designers in the C# 2 timeframe.

possibly should be comparison:

The behavior of bool? in comparison with non-nullable values caused concern for the language designers in the C# 2 timeframe.

p20.

There’s really not a lot more to say about how the null-conditional operator works with indexers – it’s as simple as that.

Does this check work with events/event handlers? It would be very handy (pardon the pun) if it did. Ah - answered on the next page.

p23.

Beyond occasionally at having to deal with nullable value types where you were previously only using non-nullable values, there are very few unpleasant surprises with the null conditional operator.

remove the at, tense before the subject:

Beyond occasionally having to deal with nullable value types, and where previously you were only using non-nullable values, there are very few unpleasant surprises with the null conditional operator.

p23.

The upshot of that is that you can’t use the null-conditional operator as the left-hand side of an assignment.

should be this (present tense):

The upshot of this is that you can’t use the null-conditional operator as the left-hand side of an assignment.

p23.

person?.Name = "";
In those cases, you simply need to use the old-fashioned if statement.

could this also be done using a ternary operator? (this was more just to prove that it could be done than an actual practical example)

Finally got round to implementing these (mostly) now the reorg is done.

For the retry questions: I don't know if "when" improves performance at all, but I wouldn't make that a reason for using it; the circuit-breaker pattern is somewhat related to this, but doesn't really address the way that retries don't compose well. (It may be a workaround for that in many cases, but it doesn't actually stop it from being an initial issue.)

I probably won't add the r/theta/x/y to the figure, but we'll see what my copy editor thinks.

I'm not sure if the diagram was wrong at some point, but that's definitely the correct order. It looks like you expect the *body* of the catch block to execute before any intervening finally blocks - it doesn't, and never has.

Thanks for that. Yes, that makes sense, albeit a bit confusing. So the "when"s are just iterated over first before the catch bodies are executed. Could possibly rename e.g. "Middle filter" to "Middle when" or "Middle when filter" to help when matching sequence to syntax?
The diagrams were definitely different but may have not been the latest version.
Thanks again.