Added
and Improvements New Features in C# 7.0 with Visual Studio 2017 -
1. Added
Binary Literal
2. Added
Digit Separators
3. Added
Pattern Matching
4. Added
Ref returns and ref Locals
5. Added
some Tuples Enhancement
6. Local
Function
7. Throw
Expressions
8. Added
some expression bodied members like constructor, destructor, getters and
setters in C# 7
9. Added
some enhancement for out variables
10. Deconstruction
Binary
Literals -Improvements
int[]
numbers = { 1, 2, 4, 6, 12, 40 };
int[]
numbers = { 0b1, 0b10, 0b100, 0b1000, 0b10000, 40 };
Digit
Separators - Digit separators inside the numbers
Literal Digit Allows underscore (_) inside
numbers
var
x = 1234_5435;
var
y = 0xABCD_EFG_IJ
int[]
numbers = { 0b1, 0b10, 0b100, 0b1000, 0b1_0000, 4_0 };
Tuples
-
If you want write a common method that returns
more than one value. It is add tuple types and tuple literals.
1. Anonymous
types return
2. Dynamic
return type
3. Custom-built
transport type
Example
1 -
int[]
numbers = { 0b1, 0b10, 0b100, 0b1000, 0b1_0000, 4_0 };
var
tn = TallyNumber(numbers);
WriteLine($"Sum:
{tn.Item1}, count: {tn.Item2}");
(int,
int) TallyNumber(int[] values)
{
var
rest = (0, 0);
return
rest;
}
Example
2 -
int[]
numbers = { 0b1, 0b10, 0b100, 0b1000, 0b1_0000, 4_0 };
var
tn = TallyNumber(numbers);
WriteLine($"Sum:
{tn.sum}, count: {tn.count}");
(int
sum, int count) TallyNumber(int[]
values)
{
var
rest = (s:0, c: 0);
return
rest;
}
Example
3 -
int[]
numbers = { 0b1, 0b10, 0b100, 0b1000, 0b1_0000, 4_0 };
var(sum, count) =
TallyNumber(numbers);
WriteLine($"Sum:
{sum}, count: {count}");
(int
sum, int count) TallyNumber(int[]
values)
{
var
rest = (s:0, c: 0);
foreach
(var val in values)
{
rest = (rest.s + val, rest.c + 1);
}
return
rest;
}
Example
4 -
int[]
numbers = { 0b1, 0b10, 0b100, 0b1000, 0b1_0000, 4_0 };
var(sum,
count) = TallyNumber(numbers);
WriteLine($"Sum:
{sum}, count: {count}");
(int
sum, int count) TallyNumber(int[]
values)
{
var
rest = (s:0, c: 0);
foreach
(var val in values)
{
Add(val, 1);
}
return
rest;
void
Add(int s, int c) { rest.s += s; rest.c += c; }
}
Local
Functions –
Functions inside other function bodies that are
called local function.
Example
-
int[]
numbers = { 0b1, 0b10, 0b100, 0b1000, 0b1_0000, 4_0 };
var(sum,
count) = TallyNumber(numbers);
WriteLine($"Sum:
{sum}, count: {count}");
(int
sum, int count) TallyNumber(int[]
values)
{
var
rest = (s:0, c: 0);
foreach
(var val in values)
{
Add(val, 1);
}
return
rest;
void
Add(int s, int c) { rest.s += s; rest.c += c; }
}
Pattern
Matching -
1. Enhancing
two existing patterns-
2. Is-expressions
with patterns
3. Switch
case clauses with patterns
Example
1 -
public void
PrintDollers(object obj)
{
if
(obj is null) return; //
This is the constant pattern "null"!
if
(!(obj is int k)) return; // This is the type pattern "int k";
WriteLine(new string('$',
k));
}
Example
2 -
// Switch on
anything lie premitive, string etc.
switch
(shape)
{
case
Rectangle sh when(sh.Length == sh.Height): WriteLine($"{sh.Length}
x {sh.Height} square");
break;
default:
WriteLine("<unknown
shape found!>");
break;
case null:
throw new
ArgumentNullException(nameof(shape));
}
Deconstruction
-
Example
for deconstructing declaration -
(string
firstName, string middleName, string lastName) =
SearchName(id1); //deconstructing declaration
WriteLine($"found {firstName} {lastName}.");
Example
for var inside -
(var firstName, var middleName, var lastName) = SearchName(id1);
Example
for var outside -
var(firstName,
middleName, lastName) = SearchName(id1);
Example
for deconstructing assignment -
(firstName, middleName, lastName) =
SearchName(id2);
Ref
Returns and Locals –
Returning Values by Reference and It is a Kind of
Pointers!
public class User
{
public int
ID { get; set; }
public int
Age { get; set; }
public string
Name { get; set; }
public string
Adress { get; set; }
public override string
ToString() { return $"{ID},{Age},{Name},{Adress}"; }
}
public static ref User
FindUser(User U, User[] UList)
{
for
(int j = 0; j < UList.Length; j++)
if
(UList[j].ID == U.ID)
return ref
UList[j];
throw new IndexOutOfRangeException($"{nameof(U)}
not found");
}
References
-
https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/