DEV Community

Cover image for Learning .NET from Beginner to Advanced Level's
Sapana Pal
Sapana Pal

Posted on

Learning .NET from Beginner to Advanced Level's

Here's a comprehensive syllabus for learning .NET from beginner to advanced levels:


.NET Syllabus: From Zero to Pro

1. Introduction to .NET

  • Overview of .NET Framework, .NET Core, and .NET 5/6+
  • History and evolution
  • Applications of .NET
  • Setting up the development environment (Visual Studio, Visual Studio Code)

2. C# Basics

  • Variables, Data Types, and Constants
  • Operators and Expressions
  • Control Statements (if, switch, loops)
  • Methods and Parameters
  • Arrays and Collections
  • Exception Handling

3. Object-Oriented Programming (OOP) in C#

  • Classes and Objects
  • Properties and Fields
  • Methods and Constructors
  • Inheritance and Polymorphism
  • Interfaces and Abstract Classes
  • Encapsulation and Access Modifiers

4. Advanced C# Concepts

  • Delegates and Events
  • Lambda Expressions and LINQ
  • Generics
  • Namespaces and Assemblies
  • Asynchronous Programming (async/await)
  • Reflection

5. .NET Core / .NET 5/6+

  • Understanding the Runtime and SDK
  • Creating Console Applications
  • Dependency Injection
  • Configuration and Logging
  • Building RESTful APIs with ASP.NET Core
  • Middleware and Routing

6. Data Access

  • Entity Framework Core
  • LINQ to Entities
  • Working with Databases (SQL Server, SQLite)
  • Migrations and Data Seeding

7. Web Development

  • ASP.NET MVC vs. ASP.NET Core MVC
  • Razor Pages
  • Blazor Basics
  • Web APIs
  • Frontend Integration (HTML, CSS, JavaScript)

8. Desktop Application Development

  • Windows Forms
  • WPF (Windows Presentation Foundation)
  • MVVM Pattern

9. Testing and Deployment

  • Unit Testing with MSTest/NUnit/xUnit
  • Debugging and Logging
  • Deployment Strategies (IIS, Azure, Docker)

10. Modern .NET Features

  • Minimal APIs
  • gRPC
  • SignalR
  • Microservices Architecture
  • Cloud Integration (Azure/AWS)

11. Additional Topics

  • Security and Authentication
  • IdentityServer / OAuth2 / JWT
  • Docker and Containerization
  • CI/CD Pipelines

Certainly! Here's a detailed overview of the "Introduction to .NET" section:


1. Introduction to .NET

Overview of .NET Framework, .NET Core, and .NET 5/6+

.NET Framework

  • Definition: The original version of .NET, designed primarily for Windows desktop and web applications.
  • Release Year: 2002
  • Platform Support: Windows only
  • Features: Rich libraries, Windows Forms, WPF, ASP.NET Web Forms
  • Status: Legacy, with ongoing support mainly for existing applications

.NET Core

  • Definition: A cross-platform, open-source version of .NET designed for modern, scalable applications.
  • Release Year: 2016
  • Platform Support: Windows, Linux, macOS
  • Features: Modular architecture, improved performance, cloud readiness
  • Status: Deprecated in favor of .NET 5/6+

.NET 5/6+ (Unified .NET)

  • Definition: The evolution of .NET Core, unifying all .NET platforms into a single platform.
  • Release Year: .NET 5 (2020), .NET 6 (2021, Long-Term Support)
  • Platform Support: Cross-platform (Windows, Linux, macOS)
  • Features: Performance improvements, C# 9/10 features, minimal APIs, cloud-native capabilities
  • Status: The future of .NET development with long-term support

History and Evolution

Year Milestone Description
2002 .NET Framework 1.0 Launch of the first version, targeting Windows desktop/web apps
2005 .NET Framework 2.0 Introduction of generics, ASP.NET improvements
2008 .NET Framework 3.5 Language Integrated Query (LINQ), WPF, WCF
2016 .NET Core 1.0 Cross-platform, modular, open-source
2019 .NET Core 3.1 LTS release, support for Windows desktop apps
2020 .NET 5 Unified platform, dropping "Core" from branding
2021 .NET 6 Long-Term Support, focus on performance and cloud-native apps

Key Point: Microsoft shifted focus from the traditional .NET Framework to a modern, cross-platform, open-source platform with .NET Core and the unified .NET platform.


Applications of .NET

  • Web Applications: ASP.NET Core, MVC, Razor Pages
  • Desktop Applications: Windows Forms, WPF (.NET Framework and .NET 5/6+)
  • Mobile Apps: Xamarin (now part of MAUI in .NET 6+)
  • Cloud Services: Microservices, APIs, Serverless with Azure
  • Games: Unity (uses C# and .NET)
  • IoT Devices: Embedded systems and IoT solutions
  • Data Processing: Data-driven applications, big data integrations
  • AI & ML: Integration with ML.NET

Setting Up the Development Environment

Tools Needed:

  • Visual Studio: Full-featured IDE for Windows (Community, Professional, Enterprise)
    • Supports desktop, web, mobile, cloud
    • Download from Visual Studio
  • Visual Studio Code: Lightweight, cross-platform code editor
    • Supports C# via the C# extension
    • Download from VS Code

Installation Steps:

  1. Download and install Visual Studio with the ".NET desktop development" workload.
  2. Install the latest .NET SDK (from Microsoft .NET)
  3. For VS Code, install the C# extension from the Extensions marketplace.
  4. Create your first project:

    • Using Visual Studio: File > New > Project > Select Console App (.NET Core or .NET 6+)
    • Using CLI:
     dotnet new console -o MyFirstApp
     cd MyFirstApp
     dotnet run
    

Additional Tools:

  • SQL Server / SQLite for database management
  • Postman for API testing
  • Git for version control

Certainly! Here's a detailed explanation of the "Additional Topics" with examples for each:


11. Additional Topics in .NET Development


a) Security and Authentication

Overview:
Security is crucial in application development to protect data and resources. Authentication verifies user identity, while authorization determines what resources a user can access.

Key Concepts:

  • Authentication: Login process, identity verification
  • Authorization: Role-based or policy-based access control
  • Encryption: Protecting data in transit and at rest
  • Secure coding practices

Example: Implementing Basic Authentication in ASP.NET Core

// In Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication("BasicAuthentication")
        .AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("BasicAuthentication", null);
    services.AddAuthorization();
}

public void Configure(IApplicationBuilder app)
{
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
Enter fullscreen mode Exit fullscreen mode

This sets up a simple Basic Authentication scheme.


b) IdentityServer / OAuth2 / JWT

Overview:
These are standards and tools for secure API authentication and authorization.

  • OAuth2: Protocol for delegated access (e.g., login via Google)
  • JWT (JSON Web Token): Compact, URL-safe token for transmitting claims
  • IdentityServer: Open-source framework for building OAuth2 and OpenID Connect servers

Example: Securing an API with JWT in ASP.NET Core

  1. Generate a JWT token after user login.
  2. Protect API endpoints to accept only valid tokens.
// In Startup.cs
services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = "yourIssuer",
        ValidAudience = "yourAudience",
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yourSecretKey"))
    };
});
Enter fullscreen mode Exit fullscreen mode

Clients send the JWT token in the Authorization header:

Authorization: Bearer your_jwt_token
Enter fullscreen mode Exit fullscreen mode

c) Docker and Containerization

Overview:
Containerization packages applications and their dependencies into isolated containers, making deployment consistent across environments.

Steps to Containerize a .NET Application:

  1. Create a Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "./"]
RUN dotnet restore "MyApp.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]
Enter fullscreen mode Exit fullscreen mode
  1. Build and Run Docker Image
docker build -t myapp .
docker run -d -p 8080:80 myapp
Enter fullscreen mode Exit fullscreen mode

Access the app at http://localhost:8080.


d) CI/CD Pipelines

Overview:
CI/CD automates building, testing, and deploying applications, enabling rapid and reliable releases.

Example: Setting Up CI/CD with GitHub Actions for a .NET App

Create a file .github/workflows/dotnet.yml:

name: .NET Build and Test

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup .NET SDK
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: '6.0.x'
    - name: Restore dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --no-restore
    - name: Test
      run: dotnet test --no-build
    - name: Publish
      run: dotnet publish -c Release -o ./publish
    - name: Deploy (example placeholder)
      run: echo "Deploy step here"
Enter fullscreen mode Exit fullscreen mode

This pipeline automatically builds, tests, and prepares your app on every push.


Summary

Topic Description Example
Security & Authentication Protect applications with login, roles Basic Auth setup
OAuth2 / JWT Secure APIs with tokens JWT token validation
Docker & Containerization Package apps into containers Dockerfile for .NET app
CI/CD Pipelines Automate build/test/deploy GitHub Actions workflow

Certainly! Here's a detailed overview of "Modern .NET Features" with examples for each:


10. Modern .NET Features


a) Minimal APIs

Overview:
Introduced in .NET 6, Minimal APIs simplify building HTTP APIs with less boilerplate code, making startup and route definitions concise.

Key Features:

  • Single-file setup
  • No need for controllers
  • Uses top-level statements

Example: A simple Minimal API

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/hello", () => "Hello, World!");

app.Run();
Enter fullscreen mode Exit fullscreen mode

How to run:

  • Save as Program.cs
  • Run: dotnet run

This creates a lightweight API endpoint at /hello.


b) gRPC

Overview:
gRPC is a high-performance, language-neutral RPC framework that uses Protocol Buffers (protobuf) for serialization. It's ideal for microservices communication.

Features:

  • Strongly typed contracts
  • Supports streaming
  • Efficient binary protocol

Example: Basic gRPC Service

  1. Define a protobuf contract (greet.proto):
syntax = "proto3";

option csharp_namespace = "GrpcExample";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
Enter fullscreen mode Exit fullscreen mode
  1. Implement the service in C#:
public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply { Message = $"Hello, {request.Name}!" });
    }
}
Enter fullscreen mode Exit fullscreen mode
  1. Configure in Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();

var app = builder.Build();
app.MapGrpcService<GreeterService>();
app.Run();
Enter fullscreen mode Exit fullscreen mode

Clients can now call this gRPC service efficiently.


c) SignalR

Overview:
SignalR is a real-time communication library in ASP.NET Core, enabling server-to-client push notifications, chat apps, live dashboards, etc.

Features:

  • Real-time bi-directional communication
  • Supports WebSockets, Server-Sent Events, Long Polling

Example: Simple Chat Hub

  1. Create a Hub:
public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}
Enter fullscreen mode Exit fullscreen mode
  1. Configure in Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR();

var app = builder.Build();
app.MapHub<ChatHub>("/chathub");
app.Run();
Enter fullscreen mode Exit fullscreen mode
  1. Client-side (JavaScript):
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .build();

connection.on("ReceiveMessage", (user, message) => {
    console.log(`${user}: ${message}`);
});

connection.start().then(() => {
    connection.invoke("SendMessage", "User1", "Hello!");
});
Enter fullscreen mode Exit fullscreen mode

d) Microservices Architecture

Overview:
Breaking down monolithic applications into small, independently deployable services that communicate via APIs or messaging.

Features:

  • Scalability
  • Flexibility
  • Fault Isolation

Example: Basic Microservice with ASP.NET Core

  • Order Service: Handles orders
  • Product Service: Manages products

Order Service (simplified):

app.MapGet("/orders/{id}", (int id) => {
    // Fetch order by id
    return new { OrderId = id, Item = "Book", Quantity = 1 };
});
app.Run();
Enter fullscreen mode Exit fullscreen mode

Communication:

  • Services communicate via REST, gRPC, or message queues like RabbitMQ or Azure Service Bus.

e) Cloud Integration (Azure / AWS)

Overview:
.NET applications leverage cloud platforms for storage, hosting, AI, and more.

Azure Examples:

  • Azure App Service: Host web apps
  • Azure Functions: Serverless functions
  • Azure SQL Database: Managed relational DB
  • Azure Blob Storage: Store unstructured data
  • Azure Cognitive Services: AI capabilities

Sample: Upload file to Azure Blob Storage

var blobServiceClient = new BlobServiceClient(connectionString);
var containerClient = blobServiceClient.GetBlobContainerClient("mycontainer");
var blobClient = containerClient.GetBlobClient("myfile.txt");

using var uploadFileStream = File.OpenRead("localfile.txt");
await blobClient.UploadAsync(uploadFileStream, overwrite: true);
Enter fullscreen mode Exit fullscreen mode

AWS Examples:

  • Use AWS SDK for .NET to interact with S3, Lambda, DynamoDB, etc.

Summary Table

Feature Description Example Use Case
Minimal APIs Lightweight APIs with minimal code Simple REST endpoint /hello
gRPC High-performance RPC Microservices communication
SignalR Real-time communication Chat app, live dashboards
Microservices Modular, independent services E-commerce platform
Cloud Integration Deploy and scale in cloud File uploads to Azure Blob

Certainly! Here's a comprehensive overview of "Testing and Deployment" in modern .NET development, with examples for each topic:


9. Testing and Deployment in .NET


a) Unit Testing with MSTest / NUnit / xUnit

Overview:
Unit testing verifies individual components or methods in isolation to ensure correctness. Popular testing frameworks include MSTest, NUnit, and xUnit.

Example: Using xUnit to Test a Simple Calculator

  1. Create a class to test:
public class Calculator
{
    public int Add(int a, int b) => a + b;
}
Enter fullscreen mode Exit fullscreen mode
  1. Create a test project and write tests:
using Xunit;

public class CalculatorTests
{
    [Fact]
    public void Add_ReturnsCorrectSum()
    {
        // Arrange
        var calc = new Calculator();

        // Act
        var result = calc.Add(2, 3);

        // Assert
        Assert.Equal(5, result);
    }
}
Enter fullscreen mode Exit fullscreen mode
  1. Run tests:
  2. Using Visual Studio Test Explorer or CLI: dotnet test

b) Debugging and Logging

Debugging:

  • Use breakpoints, step execution, and inspection tools in Visual Studio.
  • Debug logs help trace issues in production.

Logging in ASP.NET Core:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    public IActionResult Index()
    {
        _logger.LogInformation("Index page visited");
        return View();
    }
}
Enter fullscreen mode Exit fullscreen mode

Best Practice:

  • Use structured logging (e.g., Serilog, NLog)
  • Log levels: Trace, Debug, Information, Warning, Error, Critical

c) Deployment Strategies

1. IIS (Internet Information Services):

  • Suitable for on-premises or cloud VM hosting.
  • Deploy via Visual Studio publish or Web Deploy.
  • Example: Publish your ASP.NET Core app as a folder, then configure IIS to host it.

2. Azure App Service:

  • Managed platform for hosting web apps.
  • Deploy via Visual Studio, Azure CLI, or GitHub Actions.

Example: Deploy via Visual Studio

  • Right-click project → Publish → Select Azure → Configure and publish.

3. Docker:

  • Containerize your app for consistent deployment.

Example: Dockerfile for ASP.NET Core app:

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "./"]
RUN dotnet restore "MyApp.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]
Enter fullscreen mode Exit fullscreen mode

Build and run:

docker build -t myapp .
docker run -d -p 8080:80 myapp
Enter fullscreen mode Exit fullscreen mode

Summary Table

Topic Description Example/Tool
Unit Testing Verify code correctness xUnit test for Calculator
Debugging & Logging Find issues and trace execution Visual Studio Debugger, Serilog
Deployment Publish and host app IIS, Azure App Service, Docker

Certainly! Here's a detailed overview of "Desktop Application Development" in .NET, covering Windows Forms, WPF, and the MVVM pattern, along with best examples:


8. Desktop Application Development in .NET


a) Windows Forms (WinForms)

Overview:

Windows Forms is a mature UI framework for building desktop applications with a drag-and-drop designer. It's simple and suitable for straightforward applications.

Key Features:

  • Rapid development
  • Event-driven programming
  • Rich controls

Example: Simple WinForms Application

Steps:

  1. Create a new Windows Forms App (.NET Framework or .NET Core)
  2. Add a Button and Label from Toolbox
  3. Handle button click to update label:
public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        var button = new Button { Text = "Click Me", Location = new Point(50, 50) };
        var label = new Label { Text = "Hello, World!", Location = new Point(50, 100), AutoSize = true };

        button.Click += (s, e) => label.Text = "Button Clicked!";

        Controls.Add(button);
        Controls.Add(label);
    }
}
Enter fullscreen mode Exit fullscreen mode

Run: Press F5 in Visual Studio.


b) WPF (Windows Presentation Foundation)

Overview:

WPF is a more modern UI framework for desktop apps, supporting rich graphics, styles, data binding, and MVVM pattern.

Key Features:

  • Declarative UI with XAML
  • Data binding
  • Styles and templates
  • Supports MVVM

Example: Simple WPF Application

MainWindow.xaml:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Title="WPF Example" Height="200" Width="300">
    <StackPanel Margin="20">
        <TextBlock Text="{Binding Message}" FontSize="16" Margin="0,0,0,20"/>
        <Button Content="Click Me" Command="{Binding ClickCommand}"/>
    </StackPanel>
</Window>
Enter fullscreen mode Exit fullscreen mode

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel();
    }
}
Enter fullscreen mode Exit fullscreen mode

MainViewModel.cs (MVVM ViewModel):

using System.ComponentModel;
using System.Windows.Input;

public class MainViewModel : INotifyPropertyChanged
{
    private string message = "Hello, WPF!";
    public string Message
    {
        get => message;
        set { message = value; OnPropertyChanged(nameof(Message)); }
    }

    public ICommand ClickCommand { get; }

    public MainViewModel()
    {
        ClickCommand = new RelayCommand(_ => Message = "Button Clicked!");
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
Enter fullscreen mode Exit fullscreen mode

RelayCommand.cs (for ICommand implementation):

using System;
using System.Windows.Input;

public class RelayCommand : ICommand
{
    private readonly Action<object> execute;
    private readonly Func<object, bool> canExecute;

    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        this.execute = execute;
        this.canExecute = canExecute;
    }

    public bool CanExecute(object parameter) => canExecute == null || canExecute(parameter);
    public void Execute(object parameter) => execute(parameter);
    public event EventHandler CanExecuteChanged;
}
Enter fullscreen mode Exit fullscreen mode

c) MVVM Pattern (Model-View-ViewModel)

Overview:

MVVM is a design pattern that separates UI (View), business logic (Model), and presentation logic (ViewModel). It enhances testability and maintainability.

Core Concepts:

  • Model: Data and business logic
  • View: UI (XAML)
  • ViewModel: Data binding and commands

Best Practices:

  • Use INotifyPropertyChanged for data binding
  • Use ICommand for commands
  • Keep logic out of code-behind

Example Summary:

  • WPF app with MVVM (as above)
  • Bindings in XAML
  • Commands for button actions

Summary Table

Framework Description Best Use Cases Example Summary
Windows Forms Simple, event-driven UI Legacy apps, quick tools Button click updates label
WPF Rich UI, data binding, graphics Modern desktop apps Data bound TextBlock + Button with MVVM
MVVM Pattern for decoupling UI & logic Maintainable, testable apps Data binding + commands in WPF

Certainly! Here's a comprehensive overview of "Web Development" in the .NET ecosystem, covering ASP.NET MVC vs. ASP.NET Core MVC, Razor Pages, Blazor, Web APIs, and Frontend Integration, along with best examples:


7. Web Development in .NET


a) ASP.NET MVC vs. ASP.NET Core MVC

ASP.NET MVC (Legacy)

  • Framework for building scalable web apps on .NET Framework.
  • Uses Razor views, controllers, and models.
  • Runs mainly on IIS.
  • Suitable for traditional enterprise apps.

ASP.NET Core MVC

  • Cross-platform, high-performance, modular.
  • Built on .NET Core/.NET 5+.
  • Supports dependency injection, middleware, and modern practices.
  • Recommended for new projects.

Example: Basic Controller in ASP.NET Core MVC

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}
Enter fullscreen mode Exit fullscreen mode

b) Razor Pages

Overview:

  • Simplifies page-focused scenarios.
  • Combines page logic and UI in a single .cshtml file.
  • Suitable for simple or page-centric apps.

Example: Razor Page for "Hello World"

Index.cshtml:

@page
<h2>Hello, Razor Pages!</h2>
<form method="post">
    <input type="text" name="name" />
    <button type="submit">Say Hello</button>
</form>

@if (Model.Message != null)
{
    <p>@Model.Message</p>
}
Enter fullscreen mode Exit fullscreen mode

Index.cshtml.cs:

using Microsoft.AspNetCore.Mvc.RazorPages;

public class IndexModel : PageModel
{
    public string Message { get; set; }

    public void OnPost(string name)
    {
        Message = $"Hello, {name}!";
    }
}
Enter fullscreen mode Exit fullscreen mode

c) Blazor Basics

Overview:

  • Framework for building interactive web UIs with C#.
  • Runs client-side via WebAssembly or server-side via SignalR.
  • Allows C# code instead of JavaScript for SPA.

Example: Blazor Server Counter

Counter.razor:

<h3>Counter</h3>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}
Enter fullscreen mode Exit fullscreen mode

Setup:

  • Create a Blazor project via Visual Studio.
  • Use components for interactive UIs.

d) Web APIs

Overview:

  • RESTful services exposing data/logic.
  • Built with ASP.NET Core Web API.
  • Can be consumed by frontend apps or other services.

Example: Simple Web API Controller

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private static readonly List<string> products = new List<string> { "Apple", "Banana", "Orange" };

    [HttpGet]
    public IEnumerable<string> Get()
    {
        return products;
    }

    [HttpPost]
    public IActionResult Add([FromBody] string product)
    {
        products.Add(product);
        return Ok();
    }
}
Enter fullscreen mode Exit fullscreen mode

Testing API: Use Postman or browser.


e) Frontend Integration (HTML, CSS, JavaScript)

Key Points:

  • Use HTML for structure.
  • CSS for styling.
  • JavaScript for interactivity.

Example: Simple integration with Razor View

<!-- Razor view example -->
<h1>My Page</h1>
<p id="demo">Click the button</p>
<button onclick="changeText()">Change Text</button>

<script>
function changeText() {
    document.getElementById("demo").innerText = "Text Changed!";
}
</script>
Enter fullscreen mode Exit fullscreen mode

Combining with AJAX:

fetch('/api/products')
  .then(response => response.json())
  .then(data => console.log(data));
Enter fullscreen mode Exit fullscreen mode

Summary Table

Topic Description Example / Tool
ASP.NET MVC Traditional MVC on .NET Framework Controller + Razor Views
ASP.NET Core MVC Modern, cross-platform MVC Controllers + Razor Views
Razor Pages Page-centric UI .cshtml + .cshtml.cs
Blazor C# SPA framework Components with Razor syntax
Web API RESTful services API Controller with JSON responses
Frontend HTML/CSS/JavaScript Dynamic UI, AJAX, fetch API

Certainly! Here's a comprehensive overview of "Data Access" in .NET, focusing on Entity Framework Core, LINQ, working with databases, migrations, and data seeding, along with illustrative examples:


6. Data Access in .NET


a) Entity Framework Core (EF Core)

Overview:

EF Core is an Object-Relational Mapper (ORM) that enables .NET developers to work with databases using .NET objects. It supports LINQ queries, change tracking, migrations, and more.

Key Features:

  • Code-first and database-first approaches
  • LINQ integration
  • Support for multiple databases (SQL Server, SQLite, PostgreSQL, etc.)
  • Migrations for schema management

b) LINQ to Entities

Overview:

LINQ (Language Integrated Query) allows querying data directly with C# syntax, making data access more intuitive and type-safe.

Example: Querying Data

var products = context.Products
                      .Where(p => p.Price > 50)
                      .OrderBy(p => p.Name)
                      .ToList();
Enter fullscreen mode Exit fullscreen mode

c) Working with Databases (SQL Server, SQLite)

Example: Setting up EF Core with SQL Server

1. Define the Entity:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

2. Define the DbContext:

using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer("Your_Connection_String_Here");
}
Enter fullscreen mode Exit fullscreen mode

3. Use the context:

using(var context = new AppDbContext())
{
    var productList = context.Products.ToList();
}
Enter fullscreen mode Exit fullscreen mode

Note: For SQLite, replace UseSqlServer with UseSqlite("Data Source=database.db").


d) Migrations and Data Seeding

Migrations:

  • Enable version control for your database schema.
  • Create migration scripts based on model changes.

Commands (via Package Manager Console or CLI):

# Enable migrations
Add-Migration InitialCreate

# Apply migrations to database
Update-Database
Enter fullscreen mode Exit fullscreen mode

Data Seeding:

  • Pre-populate database with initial data during migrations or startup.

Example: Seed data in OnModelCreating:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().HasData(
        new Product { Id = 1, Name = "Apple", Price = 1.2M },
        new Product { Id = 2, Name = "Banana", Price = 0.8M }
    );
}
Enter fullscreen mode Exit fullscreen mode

Note: For seed data to work, you should run Update-Database after adding seed data.


Complete Example Workflow

  1. Define Entity and Context
  2. Configure Database Provider
  3. Create and apply migrations
  4. Use LINQ to query/update data
  5. Seed initial data

Summary Table

Topic Description Key Commands / Notes
EF Core ORM for data access Supports multiple DBs
LINQ Query data with C# syntax .Where(), .Select(), .ToList()
Working with DBs Connect to SQL Server/SQLite UseSqlServer(), UseSqlite()
Migrations Manage schema changes Add-Migration, Update-Database
Data Seeding Preload initial data HasData() in OnModelCreating

Certainly! Here's a detailed overview of ".NET Core / .NET 5/6+" covering the runtime, SDK, console apps, dependency injection, configuration, logging, REST APIs, middleware, and routing, along with practical examples:


5. .NET Core / .NET 5/6+ in Web and Application Development


a) Understanding the Runtime and SDK

.NET SDK (Software Development Kit)

  • Contains compilers, libraries, and tools needed to build .NET applications.
  • Installed on development machines.
  • Used for creating, building, and publishing apps.

.NET Runtime

  • Contains the libraries and components needed to run a .NET application.
  • Multiple runtime versions can be installed side-by-side.
  • When deploying, you can publish self-contained (including runtime) or framework-dependent (requires runtime installed).

b) Creating Console Applications

Example: Create a simple console app

Step 1: Create project

dotnet new console -n MyConsoleApp
cd MyConsoleApp
Enter fullscreen mode Exit fullscreen mode

Step 2: Program.cs

using System;

namespace MyConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, .NET 6!");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Step 3: Run

dotnet run
Enter fullscreen mode Exit fullscreen mode

c) Dependency Injection (DI)

Overview:

  • Built-in in ASP.NET Core and .NET 5/6+.
  • Promotes loose coupling and testability.

Example: Simple DI in Console App

using Microsoft.Extensions.DependencyInjection;
using System;

public interface IGreetingService
{
    void Greet();
}

public class GreetingService : IGreetingService
{
    public void Greet()
    {
        Console.WriteLine("Hello from DI!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var serviceCollection = new ServiceCollection();
        serviceCollection.AddTransient<IGreetingService, GreetingService>();
        var serviceProvider = serviceCollection.BuildServiceProvider();

        var greeter = serviceProvider.GetService<IGreetingService>();
        greeter.Greet();
    }
}
Enter fullscreen mode Exit fullscreen mode

d) Configuration and Logging

Configuration:

  • Read settings from appsettings.json, environment variables, command-line args.

Example: appsettings.json

{
  "AppSettings": {
    "Message": "Welcome to .NET 6!"
  }
}
Enter fullscreen mode Exit fullscreen mode

Code to read config:

using Microsoft.Extensions.Configuration;

var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

string message = config["AppSettings:Message"];
Console.WriteLine(message);
Enter fullscreen mode Exit fullscreen mode

Logging:

  • Use Microsoft.Extensions.Logging for structured logging.

Example:

using Microsoft.Extensions.Logging;

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddConsole();
});
var logger = loggerFactory.CreateLogger<Program>();

logger.LogInformation("Application started");
Enter fullscreen mode Exit fullscreen mode

e) Building RESTful APIs with ASP.NET Core

Example: Simple Web API

1. Create Web API project

dotnet new webapi -n MyApi
cd MyApi
Enter fullscreen mode Exit fullscreen mode

2. Sample Controller

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private static readonly List<string> Products = new() { "Apple", "Banana" };

    [HttpGet]
    public IEnumerable<string> Get()
    {
        return Products;
    }

    [HttpPost]
    public IActionResult Add([FromBody] string product)
    {
        Products.Add(product);
        return Ok();
    }
}
Enter fullscreen mode Exit fullscreen mode

3. Run API

dotnet run
Enter fullscreen mode Exit fullscreen mode

Use Postman or browser to test endpoints like GET /api/products.


f) Middleware and Routing

Middleware:

  • Components that process HTTP requests in a pipeline.
  • Common middleware: routing, authentication, static files, etc.

Routing:

  • Determines how URLs map to endpoints/controllers.

Example: Custom Middleware

app.Use(async (context, next) =>
{
    Console.WriteLine("Handling request...");
    await next.Invoke();
    Console.WriteLine("Finished handling request");
});
Enter fullscreen mode Exit fullscreen mode

Example: Configuring Routing in Program.cs

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();
Enter fullscreen mode Exit fullscreen mode

In ASP.NET Core: routing is configured via UseRouting() and UseEndpoints() or MapGet(), etc.


Summary Table

Topic Description Example / Notes
Runtime & SDK Build and run apps Use dotnet CLI
Console Apps Basic CLI apps dotnet new console
Dependency Injection Built-in in .NET 5/6+ Register services with ServiceCollection
Configuration Read app settings appsettings.json + ConfigurationBuilder
Logging Structured logging LoggerFactory, ILogger
Web APIs RESTful services Controllers, endpoints
Middleware & Routing HTTP pipeline Use, MapGet, custom middleware

Certainly! Here's a comprehensive overview of "Advanced C# Concepts" with explanations and best examples:


4. Advanced C# Concepts


a) Delegates and Events

Delegates:

  • Type-safe pointers to methods.
  • Enable callback mechanisms and event-driven programming.

Example:

// Delegate declaration
public delegate void Notify(string message);

class Program
{
    static void Main()
    {
        Notify notifyDelegate = ShowMessage;
        notifyDelegate("Hello from delegate!");

        // Or using anonymous method
        Notify anonDelegate = delegate (string msg)
        {
            Console.WriteLine("Anonymous delegate says: " + msg);
        };
        anonDelegate("Hi!");
    }

    static void ShowMessage(string message)
    {
        Console.WriteLine("Delegate received: " + message);
    }
}
Enter fullscreen mode Exit fullscreen mode

Events:

  • Special type of delegate used for event-driven programming.
  • Encapsulate delegate invocation and provide publisher-subscriber pattern.

Example:

public class Publisher
{
    public event Action<string> OnMessage;

    public void SendMessage(string message)
    {
        OnMessage?.Invoke(message);
    }
}

class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        publisher.OnMessage += HandleMessage;
    }

    private void HandleMessage(string message)
    {
        Console.WriteLine("Received message: " + message);
    }
}

class Program
{
    static void Main()
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub);
        pub.SendMessage("Hello Events!");
    }
}
Enter fullscreen mode Exit fullscreen mode

b) Lambda Expressions and LINQ

Lambda Expressions:

  • Concise anonymous functions.
  • Use => syntax.

Example:

Func<int, int, int> add = (x, y) => x + y;
Console.WriteLine(add(3, 4)); // Output: 7
Enter fullscreen mode Exit fullscreen mode

LINQ:

  • Language Integrated Query enables querying collections/data sources.

Example:

int[] numbers = { 1, 2, 3, 4, 5, 6 };

// LINQ with lambda
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();

foreach (var num in evenNumbers)
{
    Console.WriteLine(num); // Output: 2, 4, 6
}
Enter fullscreen mode Exit fullscreen mode

c) Generics

  • Enable type-safe data structures and methods.
  • Improve code reusability.

Example:

public class GenericList<T>
{
    private T[] items = new T[10];
    private int count = 0;

    public void Add(T item)
    {
        items[count++] = item;
    }

    public T Get(int index)
    {
        return items[index];
    }
}

class Program
{
    static void Main()
    {
        var intList = new GenericList<int>();
        intList.Add(5);
        Console.WriteLine(intList.Get(0)); // Output: 5

        var stringList = new GenericList<string>();
        stringList.Add("Hello");
        Console.WriteLine(stringList.Get(0)); // Output: Hello
    }
}
Enter fullscreen mode Exit fullscreen mode

d) Namespaces and Assemblies

Namespaces:

  • Organize classes and avoid name conflicts.
namespace MyUtilities
{
    public class MathOperations
    {
        public static int Add(int a, int b) => a + b;
    }
}
Enter fullscreen mode Exit fullscreen mode

Assemblies:

  • Compiled units (DLLs or EXEs).
  • Reusable libraries or applications.

Usage:

using MyUtilities;

Console.WriteLine(MathOperations.Add(2, 3)); // Output: 5
Enter fullscreen mode Exit fullscreen mode

e) Asynchronous Programming (async/await)

Overview:

  • Write non-blocking code.
  • Improve scalability and responsiveness.

Example:

using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string content = await DownloadContentAsync("https://example.com");
        Console.WriteLine(content);
    }

    static async Task<string> DownloadContentAsync(string url)
    {
        using HttpClient client = new HttpClient();
        return await client.GetStringAsync(url);
    }
}
Enter fullscreen mode Exit fullscreen mode

f) Reflection

  • Inspect and manipulate metadata of types at runtime.
  • Create instances, invoke methods, access properties dynamically.

Example:

public class Person
{
    public string Name { get; set; }

    public void SayHello()
    {
        Console.WriteLine($"Hello, my name is {Name}");
    }
}

class Program
{
    static void Main()
    {
        Type personType = typeof(Person);
        var personInstance = Activator.CreateInstance(personType) as Person;

        // Set property via reflection
        var nameProp = personType.GetProperty("Name");
        nameProp.SetValue(personInstance, "Alice");

        // Invoke method via reflection
        var sayHelloMethod = personType.GetMethod("SayHello");
        sayHelloMethod.Invoke(personInstance, null);
        // Output: Hello, my name is Alice
    }
}
Enter fullscreen mode Exit fullscreen mode

Summary Table

Concept Description Example Highlights
Delegates & Events Callback mechanisms; publisher-subscriber Delegate method, event subscription
Lambda & LINQ Concise anonymous functions; data querying (x, y) => x + y, .Where(), .Select()
Generics Type-safe reusable data structures class MyList<T>
Namespaces & Assemblies Organize code; modularity namespace, DLLs
Async/Await Asynchronous, non-blocking code await, async methods
Reflection Inspect and manipulate types at runtime Type, GetProperty(), Invoke()

Certainly! Here's a comprehensive overview of Object-Oriented Programming (OOP) in C# with explanations and illustrative examples:


3. Object-Oriented Programming (OOP) in C


a) Classes and Objects

Classes:

  • Blueprints or templates defining properties and behaviors.
  • Define data and methods.

Objects:

  • Instances of classes.

Example:

// Define a class
public class Car
{
    public string Brand; // Field

    public void Drive()  // Method
    {
        Console.WriteLine($"The {Brand} is driving.");
    }
}

// Create an object
class Program
{
    static void Main()
    {
        Car myCar = new Car();
        myCar.Brand = "Toyota";
        myCar.Drive(); // Output: The Toyota is driving.
    }
}
Enter fullscreen mode Exit fullscreen mode

b) Properties and Fields

Fields:

  • Variables inside classes (usually private).

Properties:

  • Encapsulate fields with get/set accessors, enabling controlled access.

Example:

public class Person
{
    private string name; // Private field

    public string Name     // Property
    {
        get { return name; }
        set { name = value; }
    }
}

class Program
{
    static void Main()
    {
        Person p = new Person();
        p.Name = "Alice"; // Uses set
        Console.WriteLine(p.Name); // Uses get
    }
}
Enter fullscreen mode Exit fullscreen mode

Alternatively, auto-implemented properties:

public class Person
{
    public string Name { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

c) Methods and Constructors

Methods:

  • Define behaviors.

Constructors:

  • Special methods invoked during object creation, used for initialization.

Example:

public class Rectangle
{
    public int Width { get; set; }
    public int Height { get; set; }

    // Constructor
    public Rectangle(int width, int height)
    {
        Width = width;
        Height = height;
    }

    public int Area()
    {
        return Width * Height;
    }
}

class Program
{
    static void Main()
    {
        Rectangle rect = new Rectangle(5, 10);
        Console.WriteLine($"Area: {rect.Area()}"); // Output: Area: 50
    }
}
Enter fullscreen mode Exit fullscreen mode

d) Inheritance and Polymorphism

Inheritance:

  • Derive new classes from existing ones, inheriting properties and methods.

Polymorphism:

  • Ability to treat derived class objects as base class objects, with method overriding.

Example:

public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Some generic animal sound");
    }
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}

public class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Meow");
    }
}

class Program
{
    static void Main()
    {
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myDog.MakeSound(); // Output: Bark
        myCat.MakeSound(); // Output: Meow
    }
}
Enter fullscreen mode Exit fullscreen mode

e) Interfaces and Abstract Classes

Interfaces:

  • Define contracts; classes must implement members.

Example:

public interface IShape
{
    double GetArea();
}

public class Circle : IShape
{
    public double Radius { get; set; }
    public double GetArea() => Math.PI * Radius * Radius;
}
Enter fullscreen mode Exit fullscreen mode

Abstract Classes:

  • Can contain implementation; cannot instantiate directly.

Example:

public abstract class Vehicle
{
    public abstract void Start(); // Abstract method

    public void Stop()
    {
        Console.WriteLine("Vehicle stopped");
    }
}

public class Car : Vehicle
{
    public override void Start()
    {
        Console.WriteLine("Car started");
    }
}
Enter fullscreen mode Exit fullscreen mode

f) Encapsulation and Access Modifiers

  • Encapsulation: Hiding internal details and exposing only necessary parts.
  • Access Modifiers:
    • public: Accessible everywhere.
    • private: Accessible only within class.
    • protected: Accessible in class and derived classes.
    • internal: Accessible within assembly.
    • protected internal: Accessible in derived classes or within assembly.

Example:

public class BankAccount
{
    private decimal balance; // Encapsulated data

    public void Deposit(decimal amount)
    {
        if (amount > 0)
            balance += amount;
    }

    public decimal GetBalance()
    {
        return balance; // Read-only access
    }
}
Enter fullscreen mode Exit fullscreen mode

Summary Table

Concept Description Example / Note
Classes & Objects Blueprints and instances class Car {}, var c = new Car()
Properties & Fields Encapsulate data public string Name { get; set; }
Methods & Constructors Behaviors and initialization public Rectangle(int w, int h) {}
Inheritance & Polymorphism Reuse and override behavior class Dog : Animal
Interfaces & Abstract Classes Define contracts and base classes interface IShape, abstract class Vehicle
Encapsulation & Access Modifiers Data hiding & access control private, public

Certainly! Here's a comprehensive overview of C# Basics with explanations and best examples:


2. C# Basics


a) Variables, Data Types, and Constants

Variables:

  • Storage locations with a name and data type.

Data Types:

  • Common types include:
    • int (integer)
    • double (floating-point)
    • char (single character)
    • string (text)
    • bool (true/false)

Constants:

  • Immutable values declared with const.

Example:

class Program
{
    static void Main()
    {
        int age = 25;                 // Variable
        double pi = 3.14159;          // Double data type
        char grade = 'A';             // Char type
        string name = "Alice";        // String
        bool isStudent = true;        // Boolean

        const double Gravity = 9.8;   // Constant

        Console.WriteLine($"Name: {name}, Age: {age}, Pi: {pi}");
        Console.WriteLine($"Gravity constant: {Gravity}");
    }
}
Enter fullscreen mode Exit fullscreen mode

b) Operators and Expressions

Operators:

  • Arithmetic: +, -, *, /, %
  • Assignment: =, +=, -=, etc.
  • Comparison: ==, !=, >, <, >=, <=
  • Logical: &&, ||, !

Example:

int a = 10, b = 20;
int sum = a + b;                // Arithmetic
bool isEqual = (a == b);        // Comparison
bool result = (a < b) && (b > 15); // Logical
Console.WriteLine($"Sum: {sum}, Is Equal: {isEqual}, Result: {result}");
Enter fullscreen mode Exit fullscreen mode

c) Control Statements (if, switch, loops)

if statement:

int score = 85;
if (score >= 60)
{
    Console.WriteLine("Passed");
}
else
{
    Console.WriteLine("Failed");
}
Enter fullscreen mode Exit fullscreen mode

switch statement:

char grade = 'A';
switch (grade)
{
    case 'A':
        Console.WriteLine("Excellent");
        break;
    case 'B':
        Console.WriteLine("Good");
        break;
    default:
        Console.WriteLine("Average");
        break;
}
Enter fullscreen mode Exit fullscreen mode

Loops:

for loop:

for (int i = 1; i <= 5; i++)
{
    Console.WriteLine($"Iteration {i}");
}
Enter fullscreen mode Exit fullscreen mode

while loop:

int count = 1;
while (count <= 5)
{
    Console.WriteLine($"Count: {count}");
    count++;
}
Enter fullscreen mode Exit fullscreen mode

do-while loop:

int num = 0;
do
{
    Console.WriteLine($"Number: {num}");
    num++;
} while (num < 3);
Enter fullscreen mode Exit fullscreen mode

d) Methods and Parameters

Methods:

  • Blocks of code to perform specific tasks.

Parameters:

  • Inputs to methods.

Example:

class Program
{
    static void Main()
    {
        int result = Add(10, 20);
        Console.WriteLine($"Sum: {result}");
    }

    static int Add(int a, int b)
    {
        return a + b;
    }
}
Enter fullscreen mode Exit fullscreen mode

e) Arrays and Collections

Arrays:

  • Fixed-size collection of elements.
int[] numbers = { 1, 2, 3, 4, 5 };
Console.WriteLine($"First element: {numbers[0]}");
Enter fullscreen mode Exit fullscreen mode

Collections (List, Dictionary):

List:

using System.Collections.Generic;

List<string> fruits = new List<string>() { "Apple", "Banana" };
fruits.Add("Cherry");
Console.WriteLine($"Fruits: {string.Join(", ", fruits)}");
Enter fullscreen mode Exit fullscreen mode

Dictionary:

Dictionary<int, string> students = new Dictionary<int, string>();
students.Add(1, "Alice");
students.Add(2, "Bob");
Console.WriteLine($"Student 1: {students[1]}");
Enter fullscreen mode Exit fullscreen mode

f) Exception Handling

  • Handle runtime errors gracefully using try-catch.

Example:

try
{
    int a = 10;
    int b = 0;
    int c = a / b; // Throws DivideByZeroException
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("Cannot divide by zero!");
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}
finally
{
    Console.WriteLine("Execution completed.");
}
Enter fullscreen mode Exit fullscreen mode

Summary Table

Concept Description Example / Notes
Variables & Data Types Store data of various types int, string, bool
Constants Immutable values const double Pi = 3.14;
Operators Perform operations +, -, &&, ==
Control Statements Decision making & loops if, switch, for, while
Methods & Parameters Reusable blocks with inputs static int Add(int a, int b)
Arrays & Collections Store multiple items Arrays, List, Dictionary
Exception Handling Catch runtime errors try-catch-finally

Top comments (0)