Course Overview
Welcome to the "Ultimate C# Masterclass" course - the only course you need to master C#!
With 47 hours of video, 67 coding exercises, 86 quizzes, and 16 assignments, this course is packed with hands-on learning.
As a .NET Technical Lead with over a decade of experience, I'll be guiding you every step of the way—whether you're a complete beginner or an experienced developer looking to level up.
Why learn C#?
C# is the backbone of modern software development, powering desktop applications, web services, cloud computing, and game development with Unity.
Mastering C# isn’t just about learning syntax—it’s about writing efficient, maintainable, and professional-grade code. That’s exactly what this course will teach you.
What makes this course different?
We go beyond syntax. You'll learn why all the things we learn are needed and how to use them right.
We emphasize clean code and good design principles from the start.
Design patterns will be demonstrated in practice, not just as abstract concepts that seem impossible to apply in real-world challenges.
Refactoring will be something we practice all the time.
You'll gain hands-on experience through implementing various projects, from processing API data to analyzing PDF files.
You'll learn how things work under the hood, and thanks to that, you will gain an in-depth understanding of C#.
You'll master asynchrony, multithreading, and performance tuning.
You'll practice unit testing with NUnit and Moq to build reliable software.
No fluff. No endless theory. You’ll learn by doing. You will solve dozens of coding exercises right in the browser.
Additional perks:
Full Git repository with all code shown in the course.
This course is covered by Udemy’s 30-day Refund Policy, so you can try it out risk-free.
C# is one of the most in-demand programming languages today. Learn it the right way and accelerate your career.
Enroll now and start coding like a pro!
FAQ
FAQ area empty
Course curriculum
-
Welcome! Basic information & how to get help
93 Xem trước -
50 seconds about your instructor
50 Xem trước -
72 seconds about what this course is
72 Xem trước -
105 seconds about what this course isn’t
105 -
97 seconds about practicing what you learn
97 -
112 seconds about time optimization
112 Xem trước -
(Windows) Installing Visual Studio Community
151 Xem trước -
(MacOS) Installing Visual Studio Code
376 -
(Windows) Accessing the code
174 -
(MacOS) Accessing the code
217 Xem trước -
Resources you can download
-
Coding exercises issues troubleshooting
-
Section introduction
58 Xem trước -
Our first C# program (using Visual Studio Community)
379 -
Our first C# program (using Visual Studio Code)
492 -
From a text file to an executable program
224 -
Programmer's most important skill
472 -
The goal for this section
83 -
Variables
504 -
Naming variables & introduction to clean code
409 -
Variables
-
Operators
314 -
Implicitly typed variables
117 -
User input
133 -
Debugging with breakpoints
388 -
Coding exercises introduction
448 -
Variables and operators
0 -
Comments
234 -
Boolean type. Logical negation, equality, comparison, and modulo operators
378 -
Bools & operators
-
AND and OR logical operators
327 -
Boolean type and operators
0 -
If/else conditional statement
354 -
If/else conditional statement
0 -
The scope of local variables
287 -
Booleans, operators and if/else conditional statement.
-
Methods - part 1 - void methods
461 -
Methods - part 2 - non-void methods
573 -
Methods - AbsoluteOfSum method
0 -
Methods - part 3 - parameters types and the return type. Static typing in C#
250 -
Methods and typing
-
Parsing a string to an int (int.Parse method)
172 -
The first exception
131 -
Adding a new project to a solution
256 -
Assignments - Introduction
111 -
Assignment - Simple Calculator - Description and requirements
147 -
Assignment - Simple Calculator - It's time for you to implement it
-
Assignment - Simple Calculator - Solution
728 -
String interpolation
184 -
String interpolation - FormatDate
0 -
Switch statement
473 -
Switch statement - DescribeDay
0 -
Switch expressions
344 -
Char
100 -
A need for loops
115 -
While loop - part 1
194 -
+= and ++ operators. Infinite loops
228 -
While loop - part 2
173 -
While loop - CalculateSumOfNumbersBetween
0 -
Do...while loop
269 -
Do-while loop - RepeatCharacter
0 -
For loop
364 -
For loop - Factorial
0 -
Break
209 -
Continue
339 -
Break and continue
-
Nested loops
108 -
Loops performance
212 -
Arrays
648 -
Arrays
-
Arrays (1) - BuildHelloString
0 -
Arrays (2) - IsWordPresentInCollection
0 -
Multi-dimensional arrays
417 -
Multi-dimensional arrays - FindMax
0 -
Foreach loop
105 -
Foreach loop - IsAnyWordLongerThan
0 -
Lists
651 -
Lists - GetOnlyUpperCaseWords
0 -
"out" keyword
545 -
TryParse method
250 -
Assignment - TODO List - Description and requirements
148 -
Assignment - TODO List - It's time for you to try to solve it
-
Assignment - TODO List - Implementation - User options & adding a TODO
411 -
Assignment - TODO List - Implementation - Listing and Removing TODOs
510 -
Assignment - TODO List - Refactoring
722 -
Section final quiz
-
Section introduction
76 -
The issues in our code. A need for Object-Oriented Programming
350 -
Introduction to object-oriented programming
319 -
Understanding OOP with the DateTime type
363 -
Basics of OOP
-
Abstraction
215 -
Our first class
230 -
Data hiding
244 -
Custom constructor
359 -
HotelBooking class
0 -
C# restrictions on code outside classes. Top-level statements
378 -
Adding methods to classes
212 -
Basics of classes
-
Encapsulation
276 -
The Triangle class
0 -
Methods overloading
344 -
Constructors overloading. Calling one constructor from another
147 -
Encapsulation & overloading
-
Expression-bodied methods
138 -
"this" keyword (current instance reference)
220 -
Optional parameters
374 -
Dog class
0 -
Validation of constructor parameters
323 -
Readonly and const
319 -
Optional parameters and more
-
Limitations of fields. A need for properties
219 -
Properties
556 -
Properties of the Order class
0 -
Object initializers
310 -
Computed properties
174 -
Computed properties - DailyAccountState class
0 -
Static methods and classes
500 -
Static classes - NumberToDayOfWeekTranslator
0 -
Static fields, properties and constructors
277 -
Properties & static
-
String.Split and string.Join methods
0 -
Single Responsibility Principle - Introduction
583 -
Single Responsibility Principle - Refactoring (part 1)
602 -
Single Responsibility Principle - Refactoring (part 2)
352 -
Single Responsibility Principle - Refactoring (part 3)
290 -
Single Responsibility Principle
-
Files, namespaces and the using directive
624 -
Global using directives
405 -
Assignment - Dice Roll Game - Description and requirements
143 -
Assignment - Dice Roll Game - It's time for you to try to solve it
-
Assignment - Dice Roll Game - Random
333 -
Assignment - Dice Roll Game - Magic Number Antipattern
242 -
Assignment - Dice Roll Game - Designing classes
590 -
Assignment - Dice Roll Game - Enums
307 -
Assignment - Dice Roll Game - Ternary conditional operator
382 -
Section final quiz
-
Section introduction
57 -
A need for polymorphism
333 -
Inheritance
272 -
Inheriting members from the base class. Protected access modifier
328 -
Basics of polymorphism
-
Overriding members from the base class. Virtual methods and properties
675 -
Virtual methods - practice
468 -
Inheritance & Overriding - Animals
0 -
Virtual methods - StringsProcessor classes
0 -
A deeper inheritance hierarchy
128 -
Multiple inheritance
178 -
System.Object and the ToString method
461 -
Virtual methods and properties
-
Inheriting constructors and the "base" keyword
470 -
Implicit conversion
216 -
Explicit conversion
336 -
Conversion
-
Upcasting and downcasting
144 -
"is" operator
235 -
Null
286 -
"is" operator and null object -NumericTypesDescriber class
0 -
"as" operator
156 -
Abstract classes
92 -
Abstract methods
378 -
Abstract methods - Shapes
0 -
A need for abstract methods
210 -
Sealed classes and methods
228 -
Static classes are always sealed
189 -
Abstract & sealed
-
Extension methods
526 -
Extension methods - List extensions
0 -
A need for interfaces
219 -
Interfaces
607 -
Interfaces - Applying multiple transformations to a number
0 -
Interfaces vs abstract classes
282 -
Interfaces
-
JSON
296 -
Assignment - Cookies Cookbook - Description and requirements
353 -
Assignment - Cookies Cookbook - It's time for you to try to solve it
-
Assignment - Cookies Cookbook - High-level design
575 -
Assignment - Cookies Cookbook - Dependency Inversion and Dependency Injection
601 -
Assignment - Cookies Cookbook - Designing data types
528 -
Assignment - Cookies Cookbook - Printing data object. LINQ.
505 -
Assignment - Cookies Cookbook - Printing the ingredients
208 -
Assignment - Cookies Cookbook - Composing the recipe by the user
310 -
Assignment - Cookies Cookbook - Reading and writing from and to a *.txt file
682 -
Assignment - Cookies Cookbook - Reading and writing from and to a *.json file
503 -
Assignment - Cookies Cookbook - Template Method Design Pattern
334 -
Assignment - Cookies Cookbook - Cleanup and project organizing
342 -
Section final quiz
-
Section introduction
48 -
Exception object
261 -
Stack trace
286 -
Handling exceptions. Try-catch-finally
677 -
Try-catch-finally. DivideNumbers
0 -
Multiple catch blocks
319 -
Basics of exceptions
-
Throwing exceptions explicitly
548 -
Built-in exception types
300 -
Built-in exceptions
-
StackOverflowException. Recursive methods
146 -
Precise exceptions
407 -
Rethrowing exceptions. "throw" vs "throw ex"
440 -
Rethrowing exceptions
0 -
Rethrowing a System.Exception object
208 -
Global try-catch block
236 -
Code inside the catch block
206 -
Exception filters
228 -
Exception handling
-
Custom exceptions
300 -
When to define custom exceptions
396 -
Custom exception - InvalidTransactionException
0 -
Exceptions as a hidden part of a method signature
298 -
Two extreme schools of using exceptions
406 -
Smart usage of exceptions - throw
407 -
Smart usage of exceptions - catch
510 -
Smart usage of exceptions
-
Assignment - Game Data Parser - Description and requirements
183 -
Assignment - Game Data Parser - It's time for you to try to solve it
-
Assignment - Game Data Parser - Sunny day scenario
557 -
Assignment - Game Data Parser - Flow controlled by exceptions
408 -
Assignment - Game Data Parser - Adding details to JsonException
393 -
Assignment - Game Data Parser - Custom logger
436 -
Assignment - Game Data Parser - Reducing usage of exception
252 -
Assignment - Game Data Parser - Refactoring - Extracting methods
262 -
Assignment - Game Data Parser - Refactoring - SRP, DI and classes decoupling
922 -
Section final quiz
-
Section introduction
61 -
Introduction to generic types
217 -
Understanding how List works under the hood
319 -
Simplified List (adding a new item)
384 -
Simplified List (deleting an item at given index)
444 -
A need for generic types. Implementing a generic type
532 -
Generic types - Pair class
0 -
A need for tuples
508 -
Tuples
360 -
Generic types introduction
-
C# without generics. ArrayList
591 -
Generic methods
335 -
Generic methods with multiple type parameters
317 -
Generic methods - SwapTupleItems method
0 -
Convert.ChangeType method. "typeof" keyword and the Type object
488 -
Generic types and methods
-
A need for type constraints
497 -
Improving the performance of the List. Measuring the time of the code execution
411 -
Type constraints - the constraint on the base type
448 -
IComparable interface. Ordering objects
481 -
Type constraints - the constraint on the implemented interface
313 -
Type constraints & IComparable - SortedList of FullNames
0 -
Type constraints - numeric types. Generic math
215 -
Type constraints - summary. Multiple type constraints
183 -
Type constraints
-
Advanced use of methods - introduction
95 -
Funcs and Actions
337 -
Basics of Funcs and Actions
0 -
Lambda expressions
274 -
Basics of lambda expressions
0 -
Delegates
319 -
Funcs, lambda expressions and delegates
-
Dictionary - introduction
583 -
Dictionary - practice
598 -
Dictionaries - FindMaxWeights of pets
0 -
A need for the Strategy design pattern
504 -
Refactoring the code using Funcs and lambda expressions
178 -
Open-Closed Principle. Strategy design pattern
693 -
Generic filtering of collections
385 -
Advanced use of generic types
-
Caching
355 -
Assignment - Custom Cache - Description and requirements
236 -
Assignment - Custom Cache - It's time for you to try to solve it
-
Assignment - Custom Cache - Implementation
787 -
Assignment - Custom Cache - The Decorator design pattern
484 -
Assignment - Custom Cache - Composing many Decorators together
204 -
Section final quiz
-
Section introduction
57 -
What is LINQ?
491 -
LINQ and extension methods
200 -
LINQ, IEnumerable<T> and method chaining
333 -
Deferred execution
434 -
Basics of LINQ
-
Any
270 -
All
146 -
Any & All
0 -
Count
167 -
Contains
106 -
Count & Contains
0 -
OrderBy
306 -
First and Last
279 -
OrderBy, First & Last
0 -
Where
359 -
Distinct
57 -
Where & Distinct
0 -
Select
377 -
Average. Anonymous types
453 -
Select & Average
0 -
Assignment - Refactoring to LINQ - Description and requirements
263 -
Assignment - LINQ Refactoring - It's time for you to try to solve it
-
Assignment - Refactoring to LINQ - Nested loop and code readability
473 -
Assignment - Refactoring to LINQ - Find and Replace window
619 -
Assignment - Refactoring to LINQ - Fewer loops & multiline strings formatting
447 -
Assignment - Refactoring to LINQ - Checking if collection has duplicates
523 -
Section final quiz
-
LINQ Tutorial - Master the Key C# Library
-
Section introduction
78 -
.NET and C#
446 -
Common Intermediate Language (CIL)
226 -
Common Language Runtime (CLR)
352 -
.NET basics
-
Memory of a program. The stack and the heap
227 -
Value semantics vs reference semantics
351 -
Value types vs reference types
516 -
Memory of a program. Value vs reference types
-
Value types vs reference types - practical tips
498 -
"ref" keyword
441 -
"ref" modifier - FastForwardToSummer
0 -
Using "ref" with reference types
274 -
Unified type system. A need for boxing and unboxing
435 -
Boxing and unboxing
349 -
Boxing and unboxing - performance cost
359 -
Boxing and unboxing
-
Garbage Collector - introduction
323 -
Garbage Collector - memory fragmentation and defragmentation
177 -
Garbage Collector - the Mark-and-Sweep algorithm
429 -
Basics of Garbage Collector and memory management
-
Garbage Collector - generations of objects
353 -
Memory leaks
298 -
Finalizers
393 -
Garbage Collector and memory management - advanced
-
Dispose method - introduction
139 -
Dispose method - writing to a file using StreamWriter
328 -
Dispose method - reading from a file using StreamReader
404 -
Dispose method - implementation
412 -
Dispose method - AllLinesFromTextFileReader
0 -
CSV files
161 -
Reading CSV files
517 -
Assignment - CSV Processing Improvements - Description and requirements
579 -
Assignment - CSV Processing Improvements - It's time for you to try to solve it
-
Assignment - CSV Processing Improvements - Code analysis & tips
372 -
Assignment - CSV Processing Improvements - Reducing the size of Dictionaries
317 -
Assignment - CSV Processing Improvements - Reducing the number of boxings
736 -
Assignment - CSV Processing Improvements - Analysis
333 -
Section final quiz
-
Section introduction
69 -
Reflection
542 -
Attributes
636 -
Attributes - MustBeLargerThanAttribute
0 -
Limitations of attributes parameters types
164 -
Reflection
-
Structs
331 -
Structs vs Classes - crucial differences
317 -
Structs vs Classes - low-level differences
377 -
Choosing between structs and classes
372 -
Structs
-
Why should we make structs immutable?
237 -
Immutable struct - Time
0 -
Non-destructive mutation
147 -
"with" expression
213 -
Readonly structs
151 -
Immutable types
-
A close look at the System.Object type. The ReferenceEquals method
379 -
Equals method
238 -
Overriding the Equals method in classes
310 -
Overriding the Equals method in structs
428 -
Equals - overriding it in the FullName class
0 -
IEquatable<T> interface
432 -
== operator
210 -
Equality checks
-
Operators overloading
366 -
Overloading of implicit and explicit conversion operators
415 -
Operators overloading - Time structs
0 -
Hash functions
581 -
Default implementation of the GetHashCode method
293 -
When to override the GetHashCode method
176 -
GetHashCode
-
Overriding the GetHashCode method
382 -
GetHashCode - Time struct
0 -
ValueTuples
444 -
Benefits of immutable types
787 -
Immutable types
-
Records
490 -
Record structs
150 -
Records - GpsCoordinates
0 -
Nullable value types
463 -
Nullable reference types
721 -
Null-forgiving operator
546 -
Using nullable reference types. Generic type constraints related to nullability
424 -
Nullable types
-
APIs
311 -
Querying an API using C#
371 -
A class for querying APIs
456 -
Assignment - Star Wars Planets Stats - Description and requirements
315 -
Assignment - Star Wars Planets Stats - It's time for you to try to solve it
-
Assignment - Star Wars Planets Stats - JsonPropertyNameAttribute and DTOs
587 -
Assignment - Star Wars Planets Stats - Exceptions handling
469 -
Assignment - Star Wars Planets Stats - Type design
487 -
Assignment - Star Wars Planets Stats - Converting DTO to a custom type
505 -
Assignment - Star Wars Planets Stats - Finishing the app and the MaxBy method
518 -
Assignment - Star Wars Planets Stats - Refactoring
523 -
Assignment - Star Wars Planets Stats - Splitting the class
573 -
Assignment - Star Wars Planets Stats - Universal table printer
836 -
Section final quiz
-
Section introduction
41 -
The role of the IEnumerable interface
263 -
A close look at the IEnumerable interface
289 -
Implementing IEnumerable
376 -
Implicit and explicit interface implementation
380 -
Implementing IEnumerable<T>
408 -
IEnumerable & interfaces implementation
-
Indexers
317 -
ValueTuples & Custom indexer - PairOfArrays
0 -
Collection initializers
308 -
ICollection and IList interfaces
281 -
Breaking the Interface Segregation Principle
202 -
Interface Segregation Principle
297 -
The benefits of readonly collections
231 -
Readonly collections. ReadOnlyCollection and ReadOnlyDictionary
346 -
Collections - advanced topics
-
Big O Notation
463 -
Binary search algorithm
412 -
Binary search algorithm - implementation
367 -
Binary search algorithm - complexity
279 -
Complexity of algorithms
-
Improving performance when using Lists
586 -
Linked list
108 -
Linked list vs List
479 -
Dictionaries under the hood
609 -
Performance of Dictionaries
284 -
Performance of collections
-
HashSet
467 -
HashSet - CreateUnion method
0 -
Queue
372 -
Stack
248 -
"params" keyword
299 -
"params" keyword - Does Stack contain any of the given words?
0 -
A need for yield statement
245 -
Yield statement - behavior analysis
321 -
Yield statement and iterators
595 -
Yield statement - practice. yield break statement
463 -
Yield statement - GetAllAfterLastNullReversed method
0 -
Implementing IEnumerable interface using iterators
232 -
Assignment - Custom Linked List - Description and requirements
166 -
Assignment - Custom Linked List - It's time for you to try to solve it
-
Assignment - Custom Linked List - Data structures
390 -
Assignment - Custom Linked List - The AddToFront method
149 -
Assignment - Custom Linked List - Implementing IEnumerable
243 -
Assignment - Custom Linked List - Adding new items at the end of the list
154 -
Assignment - Custom Linked List - The Clear method
436 -
Assignment - Custom Linked List - Removing items and the Contains method
393 -
Assignment - Custom Linked List - The CopyTo method
187 -
Assignment - Custom Linked List - Summary and performance. Private classes
580 -
Section final quiz
-
Section introduction
26 -
Projects and solutions
366 -
Project properties
303 -
Debug build vs Release build
122 -
Projects and solutions
-
Assemblies
137 -
Referencing types from another assembly
322 -
Referencing types from another project
204 -
Internal access modifier. Principles of using access modifiers
370 -
Protected internal access modifier
147 -
Private protected access modifier
178 -
Access modifiers - summary
274 -
Access modifiers
-
How to structure the code in a solution
313 -
NuGet
603 -
*.csproj files
332 -
*.sln files
122 -
Updating the .NET version
234 -
Section final quiz
-
Section introduction
50 -
Char
163 -
Char representation in memory. Character encoding
305 -
Managing various encodings
285 -
Chars and encoding
-
Immutability of strings
144 -
Strings - value or reference types?
245 -
Strings as members in structs
243 -
Strings
-
A need for StringBuilder
195 -
StringBuilder
256 -
StringBuilder - The Reverse method
0 -
String interning
411 -
Flyweight design pattern
204 -
Advanced string formatting
443 -
Culture-specific string formatting
264 -
Specific culture vs Invariant culture
282 -
Advanced features of strings
-
Assignment - Tickets Data Aggregator - Description and requirements
316 -
Assignment - Tickets Data Aggregator - It's time for you to try to solve it
-
Assignment - Tickets Data Aggregator - Reading text from PDF
319 -
Assignment - Tickets Data Aggregator - List all PDFs from a folder
112 -
Assignment - Tickets Data Aggregator - Splitting a string by multiple separators
313 -
Assignment - Tickets Data Aggregator - Parsing culture-specific strings
323 -
Assignment - Tickets Data Aggregator - Saving result in a text file
345 -
Assignment - Tickets Data Aggregator - Refactoring
382 -
Assignment - Tickets Data Aggregator - Compliance with the SRP
538 -
Section final quiz
-
Section introduction
55 -
Decimal number system
199 -
Binary number system
75 -
Maximal numbers on a given number of digits
235 -
Binary number system
-
Numbers in memory. Integer
191 -
Adding binary numbers
183 -
Numeric overflow & silent failures
300 -
Numbers in memory
-
"checked" keyword
117 -
Checked context - when to use it?
212 -
Scope of the checked context. "unechecked" keyword
202 -
Checked - Fibonacci sequence
0 -
Integral numeric types overview
257 -
Floating-point numbers
132 -
Double and float
206 -
Smart usage of binary floating point numbers
351 -
Floating point numbers - The IsAverageEqualTo method
0 -
Decimal
265 -
Section final quiz
-
Section introduction
41 -
A need for communication between objects
326 -
A need for the Observer design pattern
121 -
Observer design pattern
517 -
Defining an event and subscribing to it
353 -
Raising events
299 -
Events - User and BankAccount
0 -
EventHandler delegate & EventArgs type
285 -
Observer design pattern & basics of events
-
Event vs delegate members
153 -
Memory leaks caused by events
325 -
Events - WeatherDataAggregator
0 -
Windows Forms - introduction
170 -
The first Windows Forms app
324 -
Understanding Windows Forms files
249 -
Events in Windows Forms
404 -
Windows Forms - basic UI elements
420 -
Assignment - Numeric Types Suggester - Description and requirements
273 -
Assignment - Numeric Types Suggester - It's time for you to try to solve it
-
Assignment - Numeric Types Suggester - User Interface & basic events
378 -
Assignment - Numeric Types Suggester - Handling KeyPress event
323 -
Assignment - Numeric Types Suggester - Numbers validation and BigInteger type
263 -
Assignment - Numeric Types Suggester - Choosing numeric type
717 -
Section final quiz
-
Section introduction
99 -
Manual tests vs Automated tests
189 -
Setting up the testing environment
360 -
First unit tests
262 -
Unit testing fundamentals
-
Running the tests
418 -
Naming unit tests
200 -
Test messages
358 -
AAA pattern
149 -
Valuable tests
-
TestCase
338 -
Naming parameterized tests
93 -
TestCaseSource
362 -
Test cases
-
Assertions on exceptions. Multiple assertions in single test
361 -
Value of unit tests
268 -
Basic assertions
268 -
Assertions
-
Testing private methods
290 -
Testing internal methods
167 -
Benefits of unit tests - no fear of refactoring
226 -
Benefits of unit tests - better design
281 -
Benefits of unit tests - early bug detection
196 -
Downsides of unit tests
401 -
Upsides and downsides of unit tests
-
Assignment - Fibonacci generator tests - Description and requirements
139 -
Assignment - Fibonacci generator tests - solution
555 -
Testing classes depending on other classes
281 -
A need for mocks
236 -
Mocks
292 -
Controlling the mock behavior
197 -
Basics of mocks
-
The benefits of using mocks
114 -
Advanced mock setup
346 -
Assertions checking if a method was called
252 -
Advanced assertions on method calls
186 -
Usage of mocks
-
Clean code in unit tests
125 -
Common setup for tests
369 -
Tests, Dependency Inversion and Dependency Injection
304 -
Untestable code - no Dependency Inversion
207 -
Untestable code - static methods
598 -
Unit tests quality and code testability
-
Other kinds of software tests
430 -
Different types of tests
-
Assignment - Unit tests for GuessingGame - Description and requirements
108 -
Assignment - Unit tests for GuessingGame - Basic scenarios
550 -
Assignment - Unit tests for GuessingGame - Verifying messages
440 -
Assignment - Unit tests for GuessingGame - Approaches for messages validation
416 -
Assignment - Unit tests for GuessingGame - Resource files
590 -
Section final quiz
-
Breaking changes in NUnit 4
-
Section introduction
51 -
The importance of clean code
356 -
Bad decisions related to code quality
264 -
Tech debt
209 -
Being professional
151 -
What is clean code?
281 -
The importance of clean code
-
The importance of meaningful names
183 -
Renaming. The Boy Scout Rule
246 -
Dealing with problematic naming
226 -
Naming fundamentals
-
Expressive names
195 -
Long and short names
371 -
Clean Code - Coding Exercises introduction
-
Naming refactoring - Reverse method
0 -
Principle of the least surprise
405 -
Good naming
-
Bad names - meaningless words
181 -
Bad names - overspecific names
235 -
Bad names - Hungarian notation
164 -
Bad names - confusing names
162 -
Bad names - abbreviations
238 -
Bad names
-
Reasonable abbreviations. Conventional names
198 -
Context
248 -
Naming refactoring - Building file path based on DateTime
0 -
Refactoring case study - naming
538 -
Good signatures of methods
181 -
Number of parameters
202 -
Fewer parameters - splitting the method
140 -
Fewer parameters - bundling related parameters
151 -
Fewer parameters - avoiding boolean parameters
157 -
Signatures
-
Small methods
207 -
Method refactoring - ChooseBetterPath method
0 -
One method, one job
166 -
One method, one job - refactoring
209 -
Levels of abstraction
235 -
Composing different levels of abstraction
161 -
Levels of abstraction within methods
256 -
Methods
-
Refactoring case study - methods - introduction
242 -
Refactoring case study - methods - signature
164 -
Refactoring case study - methods - body
654 -
Comments
191 -
Method refactoring - IsNameValid method
0 -
The worst comments
239 -
The reasonable comments
362 -
Comments
-
When to make methods static? Private methods
161 -
The risk of making public methods static
421 -
When to make methods static? Public methods
264 -
The issues of static methods
-
Composition over inheritance
360 -
The issues of inheritance
447 -
Replacing inheritance with composition
281 -
The benefits of composition
321 -
Composition over inheritance
-
Next steps: continuing your clean code journey
-
Assignment - Password Generator Refactoring - Description and requirements
184 -
Assignment - Password Generator Refactoring - Explaining the existing code
276 -
Assignment - Password Generator Refactoring - Fixing naming
233 -
Assignment - Password Generator Refactoring - Improving design
604 -
Section final quiz
-
Section introduction
94 -
The computer's processor
237 -
Threads and processes
241 -
Concurrency vs parallelism
140 -
Asynchrony
295 -
Multithreading basics
-
A single-threaded program
351 -
Starting a new thread. The Thread class
300 -
Multithreaded app’s code flow
166 -
Creating and starting new threads
0 -
The benefits of multithreading and asynchronous programming
130 -
The cost of threads. ThreadPool
355 -
Threads
-
Task Parallel Library (TPL)
150 -
Task class
236 -
Returning a value from a Task
263 -
Waiting for the Task result
310 -
Wait and WaitAll methods
281 -
Tasks & waiting
0 -
Continuations. The ContinueWith method
360 -
Chaining continuations. Continuations of multiple tasks
282 -
Continuations
0 -
Canceling a Task
407 -
Task lifecycle
265 -
OperationCanceledException
231 -
Exceptions thrown by other threads
338 -
Exceptions in tasks
383 -
Asynchronous exception handling
215 -
Handling AggregateException
422 -
Handling exceptions with continuations
0 -
Multiple continuations for one task
224 -
Handling task cancellation
207 -
The need for synchronization
219 -
Atomic operations
84 -
Race condition
204 -
Locks
238 -
Synchronization
-
The need for async/await
411 -
"await" keyword
404 -
Async methods
468 -
Async/await
-
Asynchrony vs multithreading
366 -
The flow of an asynchronous program
241 -
Async/await and threads
224 -
Async/await summary
355 -
Async/await practice
473 -
Async/await
0 -
Exceptions in async methods
323 -
Downsides of multithreading & asynchrony
287 -
Using async methods in practice. HttpClient
547 -
Assignment - Quote Finder - Description and requirements
290 -
Assignment - Quote Finder - Fetching data
345 -
Assignment - Quote Finder - Smart asynchrony
449 -
Assignment - Quote Finder - Single-threaded processing
455 -
Assignment - Quote Finder - Multi-threaded processing
359 -
Assignment - Quote Finder - Refactoring
569 -
Section final quiz
Requirment
-
No programming experience is needed. I'll teach you everything you need to know.
-
A computer (Windows/macOS) with an access to the Internet.
-
No paid software is needed; all tools used in this course are free.
Outcomes
-
Gain an in-depth understanding of C#.
-
Write high-performance, efficient C# code.
-
Master object-oriented programming principles.
-
Learn essential design patterns.
-
Write clean, maintainable code of excellent quality.
-
Prepare for C# job interviews with confidence.
-
Practice with browser-based exercises and advanced projects.
-
Use Visual Studio like a pro.
-
Create unit tests with NUnit and Moq.
-
Master asynchrony and multithreading.
0 Student
1 Course
0 review