
This video provides an overview of the entire course.
In this video, we will learn about Pass by Reference.
• Understand how references are passed by
• Observe assigning a reference doesn't change the actual reference
• Use ref keyword to modify the original reference
In this video, we will learn how developers usually mix up disposing and garbage collection.
• Create a disposable object
• Dispose it
• Observe if the object is still alive
In this video, we will learn how to implement Equals and GetHashCode correctly.
• Override Equals properly
• Override GetHashCode properly
• Understand GetHashCode doesn't have to be unique
In this video, we will learn where and how to handle exceptions.
• Spot the exception location
• Move as high as possible in the call stack
• Add exception handling if necessary or consider not implementing handling at all
In this video, we will learn which method is called if there is a virtual override pair.
• Create a virtual method
• Override in the derived method
• Observe regardless the reference type the actual object's method is called
In this video, we will learn how to deal with warnings.
• Always observe the warnings
• Either suppress or fix them
• Without existing warnings new warnings will easily take your attention
In this video, we will learn about potential problems with DateTime.
• Understand DateTime constructor
• Understand Ticks and resolution
• Introduce NodaTime
In this video, we will learn about Parse and print numbers and DateTime under different cultures.
• Understand the impact of culture for parsing and printing
• Apply appropriate parsing and comparison method for strings
In this video, we will learn when to use int and long.
• Understand the data sizes and structures for int and long
• Understand potential multi-threaded problems
• Use Interlocked class to tackle multi-threading problems
In this video, we will learn when to use float, double and decimal.
• Understand the data sizes and structures for use float, double and decimal
• Understand rounding problems with float, double and decimal
• Choose the appropriate type depending on performance or rounding requirements
In this video, we will learn what boxing is and how it works. We will also discuss potential problems with mutable value types.
• Understand how value types work
• Understand how polymorphic methods causes boxing
• Understand how mutating read-only structs cause a hidden copy
In this video, we will discuss SOLID principles and show examples of violations.
• Understand SOLID is append only
• Show examples of violation
• Move the change to outer layers
In this video, we will understand problems with changing the code and discuss moving code to outer layers.
• Understand that change is inevitable
• Understand the onion model
• Move the change to outer layers
In this video, we will look at an example to add logging without changing any code.
• Study an example and think about it
• Apply decorator pattern to do change by appending only
• Move the change to the outer layer for the client
In this video, we will discuss various implementations of singleton.
• Discuss the non-thread safe version of singleton
• Discuss the thread safe version with locking
• Implement singleton via Lazy<T>
In this video, we will learn to use lists and arrays for all our collection needs.
• Understand how array and list is implemented
• See other collections like LinkedList and HashSet
• Compare respective operations and their speeds for different collections
In this video, we will learn the impact on performance using OrderBy.
• Understand how OrderBy is used
• Understand how Sort is used
• Compare their performances
In this video, we will learn the impact on performance using ‘where'.
• Understand how Where is used
• Understand how Find is used
• Compare their performances
In this video, we will learn about IQueryable
• Understand the difference of Queryable.Where and Enumerable.Where
• Understand what an expression tree is
• Be aware of memory impact of LINQ
In this video, we will learn why tasks are better abstractions than threads.
• Understand the differences between tasks and threads
• Understand what features tasks offer instead of threads
• Understand when to drop threads instead of task
In this video, we will learn the importance of thread safety.
• Understand what thread safety is
• See what happens when you ignore thread safety
• Learn how to make code thread-safe
In this video, we will learn the impact of ‘fences' and ‘memory barriers'.
• Understand out of order execution
• Study an example problem
• Fix the problem using memory barriers
In this video, we will learn about interference signatures with I/O.
• Decorate your return types as tasks
• See various ways to return tasks
• Keep your options available even if there is no asynchronicity
In this video, we will learn the significance of .Result or .Wait.
• Understand problems with .Result or .Wait
• Refactor your code
• Understand when to use .Result or .Wait
There are three lifetimes in most DI frameworks. Transient, Scoped and Singleton. In this video, we will learn which one to choose.
• Get an overview of the lifetimes
• Understand how different lifetimes affect creating of instances
• Learn how different lifetimes affect disposing of instances
In this video, we will learn about the service locator.
• Learn how service locator is applied
• Understand the problems with service locator
• Understand where service locator makes sense
In this video, we will learn the effect of injecting too many parameters.
• Look at an example of service with many dependencies
• Split the dependencies into multiple components
• Inject the components instead of dependencies
In this video, we will learn the objectives of dependency injection.
• Manually construct an object with dependencies
• Understand dependencies
• Construct the object
In this video, we'll understand the problem with public setters.
• Understand that the default documentations encourage all properties be public
• Change relevant public properties to private
• See how everything still works fine
Transactions are very deceptive. Entity framework hides them so well that people ignore them many times. In this video, we'll learn about transactions.
• Understand what SaveChanges does
• Understand the potential problems with multiple SaveChanges
• See how using transactions change the behavior of SaveChanges
In domain driven design we have invariants and aggregates. In this video, we'll learn about aggregate boundaries.
• Understand concepts of Domain Model. Aggregates, Entities, Value Types
• See examples of aggregate boundaries
• Discuss how to model entity relations across aggregate boundaries
In this video, we'll understand the problems of concurrent transactions.
• Discuss optimistic concurrency and pessimistic concurrency
• See how we structure our code to retry the same transaction on concurrency failures
• See how to configure row versioning and concurrency tokens via entity framework
Auto incremented keys are great but Seq-HiLo can be better. In this video, we will see how.
• Understand the problems with auto-incremented keys
• See how SeqHiLo is configured
In this video, we will learn the different kinds of models, and which ones to use for which application.
• Understand the resource model
• Understand the domain model
• Understand the data model
In this video, we will learn about different methods.
• Look at the different methods
• See their characteristics and behaviors under different situations
In this video, we will get familiar with concepts like HTTP redirection and caching.
• Learn different caching hints from HTTP
• See how redirection works with respect to HttpClient
In this video, we will understand the problems with HttpClient and how to use HttpClientFactory.
• Understand the problems with HttpClient
• See how HttpClientFactory is used
In this video, we will learn how to share a database between microservices.
• Understand that creating data source dependencies for microservices defeats the goal of microservices in the first place
• Think vertically including the data sources
• Do not share the same tables or data source between microservices
In this video, we will learn how to deal with chatty traffic.
• Be aware of the consequences of fully going RESTful style especially when you need lot of data
• Consider retrieving batch data by using ODATA or GraphQL
In this video, we will understand the impact of ignoring latency concerns.
• We should acknowledge the performance impact of moving monolith to microservices
• Acknowledge how chaining calls between microservices would increase the total response time
• Consider solutions like caching
In this video, we will learn the impact of having cyclic dependencies.
• Just like in regular software development, cyclic dependencies cause code copulation
• If Service A depends on Service B and Service B depends Service A, updating Service B might break Service A, but we cannot fix Service A without re-fixing Service B
• Design your services in a cyclic manner
In this video, we will learn how to properly hash passwords.
• Understand why hashing is important
• Understand the hashing process
• Look at a demo
In this video, we will look at misusing cookies.
• Understand cross-site request forgery
• Learn the cures for cross-site request forgery
• Understand same site cookie
In this video, we will look at how we do not hide our secrets in the development environment.
• Get an overview of dotnet user secrets
• Look at a demo
In this video, we will learn about client validation.
• Look at what happens on the client side when we tweak the code
In this video, we will look at SQL injections.
• Understand the problem with SQL injection
• Look at the three solutions
Professional software development involves many different skills. As a C# developer, you must be skilled in the C# language and the .NET Core runtime. With this course, you'll take your C# and .NET Core skills to the next level by avoiding common mistakes when coding, using design patterns, developing microservices, persisting your data, securing your application, and even debugging problems.
Learning the basics of a language or platform can easily be done by following a course/book and with some hands-on practice. The path to becoming a software developer encounters many edge cases. During this course, you'll learn from my hard-earned experience, garnered from real-life situations, regarding the C# language and .NET platform. You can take this course as a vaccination against future coding infections!
By the time you finish this course, you will have developed your skills to "sniff out" coding issues effectively and avoid mistakes. Whatever your issues, the aim of this course is to take you to the 'Bring it on!' point when it comes to solving your .NET and C# problems.
Please note that this course assumes familiarity with C#, .NET Core, and ASP.NET Core, together with Visual Studio (2017 or 2019).
About the Author
Onur Gumus works as a lead software engineer in Dubai UAE. He has 15 years of experience in .NET and web development. He is a functional programming enthusiast and has completed many large projects with ASP.NET.