Welcome to this review of the Pluralsight course C# Tips and Traps 2 by Jason Roberts.
With over 15 years industry experience, Jason is a Microsoft .NET MVP who has has written multiple books including Clean C#, and C# Tips. He is also an open source contributor and the creator of FeatureToggle.
This course forms part of the following learning paths:
C# Tips & Traps 2 by Jason Roberts
This is volume 2 of Jason’s compendium of Tips and Tricks. It is shorter than the first volume with only four modules. The same productivity and note taking tips for C# Tips & Traps also apply to this course.
This module builds on what you learned two of the previous courses in this learning path.
If you have watched C# Events, Delegates and Lambdas, Dan Wahlin’s coverage of Delegates will come back into mind as Jason teaches Multicast Delegates, and Compatibility and Equality of Delegates.
If you have watched Scott Allen’s C# Generics course you will have seen some of the ways in which you can constrain Generics. In Part 1 of this C# Tips & Traps 2, you will see all of the ways in which you can constrain them: by base class, by interface, by value type and by parameterless constructor.
Jason also shows how to use these constraints in combination with each other.
Jason shows that when structs contain only value members, performance of equality checks is much faster. This is because reflection is used to determine equality for reference types. The MSDN documentation for ValueType.Equals Method explains more. Overriding the equals method is a technique for dramatically improving performance.
Then Jason shows that conditional operators such as && or || are short circuited (or lazy evaluated) but the & and | operators are not short circuited.
Enumerable.Range is introduced. This is also featured in the Practical LINQ course, and is useful for auto-generating a sequence of Integer values.
If you have an enumerable sequence of strings, such as name, and a sequence of integers, such as ages, you might want to merge them together into one sequence. Jason demonstrates that using a lambda can protect you in cases where the length of the two sequences are not the same.
You might also want to perform set operations on your sequence, such as Concat, Union, Intersect and Except. This tip is covered both here and also in the Practical LINQ course.
A LINQ tip that is not covered in the Practical LINQ course, is how to do custom aggregation. Jason uses an overload of Aggregate specifying a seed value.
I had never seen interface members explicitly implemented before, always implementing them implicitly. It was good to learn this, but it seems like a strange thing to do and I don’t plan to start using this technique.
Task.Delay can be a better alternative than Thread.Sleep, and Jason demonstrates how this is used.
For a more in-depth look at Sets in C#, see module 9 of Simon Robinson’s C# Collections Fundamentals course.
Customizing The Display of An Object in The Debugger Window with the DebuggerTypeProxy attribute
Recreating Hidden Files Without Exceptions
Working with Zip Files – System.IO.Compression and System.IO.Compression.FileSystem
Compressing and Decompressing in-memory Streams
Working with URIs
Using Generic Methods in Non-Generic Classes
Deferring Creation of Resource Intensive Objects Until Use https://msdn.microsoft.com/en-us/library/dd997286.aspx
Automatically Skip Code When Debugging with the [DebuggerStepThrough] attribute
Subscribing to File Changed Events with System.IO.FileSystemWatcher
Nullable Value Types and Ambient Properties
Recommended speed: 1.6x