C# Version History

Version .NET Framework Visual Studio Important Features
C# 1.0 .NET Framework 1.0/1.1 Visual Studio .NET 2002 Basic features
C# 2.0 .NET Framework 2.0 Visual Studio 2005 Generics
Partial types
Anonymous   methods
Iterators
Nullable   types
Private   setters (properties)
Method   group conversions (delegates)
Covariance   and Contra-variance
Static   classes
C# 3.0 .NET Framework 3.0\3.5 Visual Studio 2008 Implicitly typed local variables
Object   and collection initializers
Auto-Implemented   properties
Anonymous   types
Extension   methods
Query   expressions
Lambda   expressions
Expression   trees
Partial Methods
C# 4.0 .NET Framework 4.0 Visual Studio 2010 Dynamic binding (late binding)
Named   and optional arguments
Generic   co- and contravariance
Embedded   interop types
C#   5.0 .NET   Framework 4.5 Visual   Studio 2012/2013 Async   features
Caller   information
C#   6.0 .NET   Framework 4.6 Visual   Studio 2013/2015 Expression   Bodied Methods
Auto-property   initializer
nameof   Expression
Primary   constructor
Await   in catch block
Exception   Filter
String   Interpolation
C# 7.0 .NET Core 2.0 Visual Studio 2017 out variables
Tuples
Discards
Pattern   Matching
Local   functions
Generalized   async return types
Expanded expression body members
C#   8.0 .NET   Core 3.0 Visual   Studio 2019 Readonly   members
Default   interface methods
Using   declarations
Static   local functions
Disposable   ref structs
Nullable   reference types
Exception   Filter
String   Interpolation
C# 9.0 .NET 5.0 Visual Studio 2019 Records
Init-only   properties
Top-level   statements
Init   accessors and readonly fields
With-expressions
Value-based   equality
Inheritance changes
C#   10.0 .NET   6.0 Visual   Studio 2022 Record   structs
Global   using directives
File-scoped   namespace declaration
Extended   Proptery Patterns
Null   Parameter Checking
Constant   interpolated strings

C# Access Modifiers

Access Modifiers are keywords that define the accessibility of a member, class or datatype in a program. These are mainly used to restrict unwanted data manipulation by external programs or classes. There are 4 access modifiers (public, protected, internal, private) which defines the 6 accessibility levels as follows:



  • public
  • protected
  • internal
  • protected internal
  • private
  • private protected



The Accessibility table of these modifiers is given below:

public 
protected 
internal 
protected internal 
private 
private protected 
Entire program 
Yes 
No 
No 
No 
No 
No 
Containing class 
Yes 
Yes 
Yes 
Yes 
Yes 
Yes 
Current assembly 
Yes 
No 
Yes 
Yes 
No 
No 
Derived types 
Yes 
Yes 
No 
Yes 
No 
No 
Derived types within current assembly 
Yes 
Yes 
No 
Yes 
No 
Yes