C # 8.0 рдореЗрдВ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдирд┐рдпреЛрдЬрд┐рдд


рдкреВрд░реНрд╡ рдореЗрдВ C # рдХреЗ рд▓рдШреБ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рд╕рднреА рдЙрдкрдХрд░рдг рднрд╛рд╖рд╛ рдХреЛ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╡реЗ рд╕реА # 7.0 рдХреА рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдиреНрд╣рд╛рдВрд╕рдореЗрдВрдЯ рдФрд░ рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрдзрди рдХреА рддрд░рд╣ рд╣реИрдВред


рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдорд╛рдиреНрдп рд╣реИред


рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рднреА рдЪрд░рдгреЛрдВ (рдбрд┐рдЬрд╛рдЗрди, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдкрд░реАрдХреНрд╖рдг) рдореЗрдВ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗрд╡рд▓ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐ C # 7 рдХрд╛ рдЕрдВрддрд┐рдо рд▓рдШреБ рд╕рдВрд╕реНрдХрд░рдг рдЕрднреА рддрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЯреАрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдХреЗ рдЕрдЧрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ: # # 8.0ред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдпреЛрдЬрд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЪрдпрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЕрдВрддрд┐рдо рд░рд┐рд▓реАрдЬ рдореЗрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рд╡реЗ рд╕рднреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ рд╣реИрдВ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЕрдзреАрди рд╣реИрдВред


рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░


рдпрд╣ рдЙрдкрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА C # 7.0 рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рддрдХ рджреЗрд░реА рд╣реЛ рд░рд╣реА рдереАред рдЗрд╕рдХрд╛ рд▓рдХреНрд╖реНрдп рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрд╢рдХреНрдд NullReferenceException рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рд╣реИред


рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред


IWeapon? canBeNull;
IWeapon cantBeNull;

null , null -null , ( , , ):


canBeNull = null;       //  
cantBeNull = null;      // 
cantBeNull = canBeNull; // 

, nullable- null:


canBeNull.Repair();       // 
cantBeNull.Repair();      //  
if (canBeNull != null) {
    cantBeNull.Repair();  //  
}

, тАУ , - ?


, : , null. , null- .


nullability , . , .


Visual Studio 2017 15.6 update.


Records


, - C# , -.


:


public class Sword(int Damage, int Durability);

:


public class Sword : IEquatable<Sword>
{
    public int Damage { get; }
    public int Durability { get; }

    public Sword(int Damage, int Durability)
    {
        this.Damage = Damage;
        this.Durability = Durability;
    }

    public bool Equals(Sword other)
    {
        return Equals(Damage, other.Damage) 
            && Equals(Durability, other.Durability);
    }

    public override bool Equals(object other)
    {
        return (other as Sword)?.Equals(this) == true;
    }

    public override int GetHashCode()
    {
        return (Damage.GetHashCode() * 17 + Durability.GetHashCode());
    }

    public void Deconstruct(out int Damage, out int Durability)
    {
        Damage = this.Damage;
        Durability = this.Durability;
    }

    public Sword With(int Damage = this.Damage, int Durability 
        = this.Durability) => new Sword(Damage, Durability);
}

, , . GetHashCode - Dictionary Hashtable. Deconstruct :


var (damage, durability) = sword;

, , , . , , . , , With, :


var strongerSword = sword.With(Damage: 8);

, :


var strongerSword = sword with { Damage = 8 };

Recursive Patterns


C# 7.0. 8.0 :


. Deconstruct():


if (sword is Sword(10, var durability)) {
    //  ,  Damage = 10
    // durability   sword.Durability
}

(tuple) :


switch (state, transition)
{
    case (State.Running, Transition.Suspend):
        state = State.Suspended;
        break;
}

switch , . , :


state = (state, transition) switch {
    (State.Running, Transition.Suspend) => State.Suspended,
    (State.Suspended, Transition.Resume) => State.Running,
    (State.Suspended, Transition.Terminate) => State.NotRunning,
    (State.NotRunning, Transition.Activate) => State.Running,
    _ => throw new InvalidOperationException()
};

Default Interface Methods


, C# , :


interface ISample
{
    void M1();                                    // 
    void M2() => Console.WriteLine("ISample.M2"); // 
}

, :


abstract class SampleBase
{
    public abstract void M1();
    public void M2() => Console.WriteLine("SampleBase.M2");
}

, C# 8 , . , .


. , . , . , . , .


C#, .


, . , тАУ trait .


, , . C# 8.0 , :


  • , , , .
  • , , . , .

Asynchronous Streams


C# . C# 8.0, . IEnumerable IEnumerator:


public interface IAsyncEnumerable<out T>
{
    IAsyncEnumerator<T> GetAsyncEnumerator();
}

public interface IAsyncEnumerator<out T> : IAsyncDisposable
{
    Task<bool> MoveNextAsync();
    T Current { get; }
}

, IDisposable:


public interface IAsyncDisposable
{
    Task DisposeAsync();
}

:


var enumerator = enumerable.GetAsyncEnumerator();
try
{
    while (await enumerator.WaitForNextAsync())
    {
        while (true)
        {
            Use(enumerator.Current);
        }
    }
}
finally
{
    await enumerator.DisposeAsync();
}

тАУ , while(true). - , . , , . , , .


, . , foreach. :


foreach await (var item in enumerable)
{
    Use(item);
}

, foreach , .


, yield. , :


async IAsyncEnumerable<int> AsyncIterator()
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            yield await GetValueAsync(i);
        }
    }
    finally
    {
        await HandleErrorAsync();
    }
}

LINQ.


Ranges


:


var range = 1..5;

, :


struct Range : IEnumerable<int>
{
    public Range(int start, int end);
    public int Start { get; }
    public int End { get; }
    public StructRangeEnumerator GetEnumerator();
    // overloads for Equals, GetHashCode...
}

:


  • , :

Span<T> this[Range range]
{
    get
    {
        return ((Span<T>)this).Slice(start: range.Start, 
            length: range.End - range.Start);
    }
}

  • IEnumerable, :

foreach (var index in min..max)
{
    //  
}

  • , :

switch (value)
{
    case 1..5:
        //   
        break;
}

step тАУ , . тАУ ( ). Python, .


, , .., . , .


, , , ..:


a[start:end] #   start  end-1
a[:end]      # items    end-1

, .


Generic Attributes


. , , :


public class TypedAttribute : Attribute
{
    public TypedAttribute(Type type)
    {
        // ...
    }
}

, :


public class TypedAttribute<T> : Attribute
{
    public TypedAttribute()
    {
        // ...
    }
}

, , :


public TypedAttribute(T value)
{
    // ...
}

Default Literal in Deconstruction


C# 7, :


(int x, int y) = (default, default);

default, :


(int x, int y) = default;

Caller Argument Expression


C# 5, CallerMemberName, CallerFilePath CallerLineNumber) .


CallerMemberName INotifyPropertyChanged:



class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private int property;

    public int Property
    {
        get { return property; }
        set
        {
            if (value != property)
            {
                property = value;
                OnPropertyChanged();
            }
        }
    }
}

C# 8 CallerArgumentExpression, , :


public Validate(int[] array, [CallerArgumentExpression("array")] string arrayExpression = null)
{
    if (array == null)
    {
        throw new ArgumentNullException(nameof(array), $"{arrayExpression} was null.");
    }
    if (array.Length == 0)
    {
        throw new ArgumentException($"{arrayExpression} was empty.", nameof(array));
    }
}

, , .


Target-typed new Expression


, var ( ) :


Dictionary<string, string> dictionary = new Dictionary<string, string>(); //  var
var dictionary = new Dictionary<string, string>(); //  var

(), , :


class DictionaryWrapper
{
    private Dictionary<string, string> dictionary = new Dictionary<string, string>();
    // ...
}

C# 8, new, :


class DictionaryWrapper
{
    private Dictionary<string, string> dictionary = new();
    // ...
}

, , . , .


Type/typedef, , ! , / .


Ordering of ref and partial Modifiers on Type Declarations


C# , partial struct class.


ref C# 7.2, partial , , ref struct, partial partial, .


, :


public ref struct NonPartialStruct { }
public ref partial struct PartialStruct { }

C# 8, , :


public partial ref struct PartialStruct { }


C# 8 . .
, C# 8.0, . , , . , , .


, , . .


C# 7.1, 7.2 and 7.3 тАФ New Features (Updated).


, C#. C# тАФ - ? , :


  1. var . . . , .
  2. Go . . -. , , ( ) .
  3. C# . ( .Net Framework 1.1), ( ┬л┬╗ LINQ тАУ , SQL, ). , .
  4. - typedef, , , (var ). new(), ( ).

, , . GO C# . , . C# , тАУ .


? . . C# тАУ Common Language Infrastructure (CLI). CLI , , . Java/Kotlin. , ?


( Nullable Reference Types). , .

Source: https://habr.com/ru/post/hi413065/


All Articles