рдкреИрдЯрд░реНрди рд╕реА # 7 рдореЗрдВ рдорд┐рд▓рд╛рди

C # 7 рдореЗрдВ рдЖрдЦрд┐рд░рдХрд╛рд░ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк F # рдЬреИрд╕реА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрд╕ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рдирд┐рд░рд╛рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдЬ рднреА, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА!



рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рдлреАрдЪрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЦрддрд░рдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдирдП рд╕реНрддрд░ рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрд▓реЗрдЦ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред

C # рдореЗрдВ рдПрдХ рдирдореВрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдХреЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рднреАред
рдирдореВрдиреЗ рдХреЗ рддреАрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

  • рдирдореВрдирд╛ рд╕реНрдерд┐рд░;
  • рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирдореВрдирд╛;
  • рдирдореВрдирд╛ рдЪрд░ред

рдкреИрдЯрд░реНрди рдХрд╛ рдорд┐рд▓рд╛рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ


public void IsExpressions(object o) { // Alternative way checking for null if (o is null) Console.WriteLine("o is null"); // Const pattern can refer to a constant value const double value = double.NaN; if (o is value) Console.WriteLine("o is value"); // Const pattern can use a string literal if (o is "o") Console.WriteLine("o is \"o\""); // Type pattern if (o is int n) Console.WriteLine(n); // Type pattern and compound expressions if (o is string s && s.Trim() != string.Empty) Console.WriteLine("o is not blank"); } 

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╕реНрдерд┐рд░ рд╣реИ, рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдирдореВрдирд╛ рдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдм рдкреНрд░рддрд┐рдорд╛рди рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП:

  • If рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рдмрд╛рд╣рд░реА рджрд╛рдпрд░реЗ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЗрдл рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рддрднреА рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреИрдЯрд░реНрди рдореИрдЪ рдХрд░рддрд╛ рд╣реИред
  • рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИред

рдкрд╣рд▓реЗ, рдкрд╣рд▓реЗ рджреЛ рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 public void ScopeAndDefiniteAssigning(object o) { if (o is string s && s.Length != 0) { Console.WriteLine("o is not empty string"); } // Can't use 's' any more. 's' is already declared in the current scope. if (o is int n || (o is string s2 && int.TryParse(s2, out n))) { Console.WriteLine(n); } } 

рдкрд╣рд▓рд╛ рдпрджрд┐ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╡реЗрд░рд┐рдПрдмрд▓ рдПрд╕ рдХреЛ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкреВрд░реА рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рдЬрд┐рдм рд╣реИ, рд▓реЗрдХрд┐рди рддрд░реНрдХ рдХреЛ рдЙрд▓рдЭрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЕрдиреНрдп рдпрджрд┐ рдЙрд╕реА рдмреНрд▓реЙрдХ рдореЗрдВ рдмрдпрд╛рди рдЙрд╕реА рдирд╛рдо рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдШрд░реНрд╖реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдЗрд╕рдореЗрдВ рджрд░реНрдЬ рдЪрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд┐рдзреЗрдп рд╕рддреНрдп рд╣реЛред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рдХрдерди n рдХреЛ рд╕рд╣реА рдСрдкрд░реЗрдВрдб рдореЗрдВ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдШреЛрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ int.TryParse рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрдЙрдЯ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рддреАрд╕рд░рд╛ рдмрд┐рдВрджреБ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 public void BoxTwice(int n) { if (n is 42) Console.WriteLine("n is 42"); } 

рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХреНрд╡реИрд▓реНрд╕ (рд╕реНрдерд┐рд░, рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓) [рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдСрдкрд░реЗрдЯрд░ == рдХреЛ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП]:

 public void BoxTwice(int n) { if (object.Equals(42, n)) { Console.WriteLine("n is 42"); } } 

рдпрд╣ рдХреЛрдб рджреЛ рдкреИрдХреЗрдЬрд┐рдВрдЧ-рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрде рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдУ рд╢реВрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдУ рдЪрд░ рдПрдХ рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдерд╛ (рджреЗрдЦреЗрдВ рдИ рдХреЗ рд▓рд┐рдП рдЙрдкреЙрдкреНрдЯрд┐рдорд▓ рдХреЛрдб рд╢реВрдиреНрдп рд╣реИ ), рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рддрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдпрд╣рд╛рдВ рд╕рдВрдЧрдд рдЕрдиреБрд░реЛрдз рд╣реИ) рдЧреАрдереВрдм рдкрд░ )ред

рдпрджрд┐ рд╡реИрд░рд┐рдПрдмрд▓ рдПрди рдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╣реИ, рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдУ 42 рд╣реИ рдПрдХ "рдкреИрдХрд┐рдВрдЧ-рд░реВрдкрд╛рдВрддрд░рдг" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ (рд╢рд╛рдмреНрджрд┐рдХ 42 рдХреЗ рд▓рд┐рдП), рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рдорд╛рди рдХреЛрдб рдЗрд╕рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдирдореВрдирд╛ рдЪрд░ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ


рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдкреИрдЯрд░реНрди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИ: рдкреИрдЯрд░реНрди рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрд╢рдХреНрдд рднреАред

 public void IsVar(object o) { if (o is var x) Console.WriteLine($"x: {x}"); } 

рдпрджрд┐ рдУ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдУ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рддреНрдп рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХреНрд╕ рдПрдХреНрд╕ рдПрдХреНрд╕ рдПрдХреНрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд░рд┐рд▓реАрдЬ рдореЛрдб рдореЗрдВ рд╕рдВрдХрд▓рдХ * рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдЕрдЧрд░ рдмрдпрд╛рди рдФрд░ рдмрд╕ рдХрдВрд╕реЛрд▓ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб рдХреА рдЕрдиреБрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ: рдЕрдЧрд░ (! (O var x)) Console.WriteLine ("рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ")ред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рднреА рддрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

* рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗрд╡рд▓ рд░рд┐рд▓реАрдЬрд╝ рдореЛрдб рдореЗрдВ рднрд┐рдиреНрди рдХреНрдпреЛрдВ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЬрдбрд╝ рд╕рдорд╛рди рд╣реИ: рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдиреАрд▓ рдЧреИрдЯрд░ рдХреА рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬрд▓реНрдж рд╣реА рд╕рдм рдХреБрдЫ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛: "рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдкреБрди: рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ (рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирдореВрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рди рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдирдП рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдореБрдлреНрдд рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред тАЭ

рдПрдХ рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЦрддрд░рдирд╛рдХ рдмрдирд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдирдореВрдирд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 public void VarPattern(IEnumerable<string> s) { if (s.FirstOrDefault(o => o != null) is var v && int.TryParse(v, out var n)) { Console.WriteLine(n); } } 

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рдПрд▓реНрд╡рд┐рд╕ рдХрдерди рд╣реИ


рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдирдореВрдирд╛ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред рд╣рдо рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╢рдХреНрдд рд╡рд┐рддрд░рд┐рдд рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрд╕ "рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ" рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 public void WithNullPropagation(IEnumerable<string> s) { if (s?.FirstOrDefault(str => str.Length > 10)?.Length is int length) { Console.WriteLine(length); } // Similar to if (s?.FirstOrDefault(str => str.Length > 10)?.Length is var length2 && length2 != null) { Console.WriteLine(length2); } // And similar to var length3 = s?.FirstOrDefault(str => str.Length > 10)?.Length; if (length3 != null) { Console.WriteLine(length3); } } 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рд╣реА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдорд╛рдорд▓реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди


рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ C # 7 рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреА рдЧрдИ рд╣реИ рддрд╛рдХрд┐ рдкреИрдЯрд░реНрди рдЕрдм рдХреЗрд╕ рдХреНрд▓реЙрдЬ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:

 public static int Count<T>(this IEnumerable<T> e) { switch (e) { case ICollection<T> c: return c.Count; case IReadOnlyCollection<T> c: return c.Count; // Matches concurrent collections case IProducerConsumerCollection<T> pc: return pc.Count; // Matches if e is not null case IEnumerable<T> _: return e.Count(); // Default case is handled when e is null default: return 0; } } 

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрд╣рд▓рд╛ рд╕реЗрдЯ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

  1. рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  2. рдХреЗрд╕ рдХреНрд▓реЙрдЬ рдЖрдкрдХреЛ рдПрдХ рдкреИрдЯрд░реНрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  3. рдХреЗрд╕ рдХреНрд▓реЙрдЬ рдХрд╛ рдЖрджреЗрд╢ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛ рдпрджрд┐ рдкрд┐рдЫрд▓рд╛ рд╡рд╛рдХреНрдп рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рдПрдХ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╣реИред
  4. рдХрд╕реНрдЯрдо рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╢рдХреНрдд ** рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдВрддрд┐рдо рдХреЗрд╕ рдХреНрд▓реЙрдЬ рдорд╛рдиреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдореИрдЪ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрд░реНрдХ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

** рдорд╛рдорд▓реЗ рдХрд╛ рдЕрдВрддрд┐рдо рд╡рд╛рдХреНрдп C # 7 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рджрд┐рдЦрд╛рддрд╛ рд╣реИ - рдПрдХ рдЦрд╛рд▓реА рдЪрд░ рдХреЗ рдирдореВрдиреЗред рд╡рд┐рд╢реЗрд╖ рдирд╛рдо _ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЪрд░ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдХреЗрд╕ рдХреНрд▓реЙрдЬ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк _ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреА рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ - рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛:

 public static void FizzBuzz(object o) { switch (o) { case string s when s.Contains("Fizz") || s.Contains("Buzz"): Console.WriteLine(s); break; case int n when n % 5 == 0 && n % 3 == 0: Console.WriteLine("FizzBuzz"); break; case int n when n % 5 == 0: Console.WriteLine("Fizz"); break; case int n when n % 3 == 0: Console.WriteLine("Buzz"); break; case int n: Console.WriteLine(n); break; } } 

рдпрд╣ FizzBuzz рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рдЕрдЬреАрдм рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдЦреНрдпрд╛ред

рдПрдХ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдХреЗрд╕ рдХреНрд▓реЙрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрдгрдирд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

 public static void FizzBuzz(object o) { // All cases can match only if the value is not null if (o != null) { if (o is string s && (s.Contains("Fizz") || s.Contains("Buzz"))) { Console.WriteLine(s); return; } bool isInt = o is int; int num = isInt ? ((int)o) : 0; if (isInt) { // The type check and unboxing happens only once per group if (num % 5 == 0 && num % 3 == 0) { Console.WriteLine("FizzBuzz"); return; } if (num % 5 == 0) { Console.WriteLine("Fizz"); return; } if (num % 3 == 0) { Console.WriteLine("Buzz"); return; } Console.WriteLine(num); } } } 

рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рджреЛ рдмрд╛рддреЗрдВ рд╣реИрдВ:

1. рд╕рдВрдХрд▓рдХ рдХреЗрд╡рд▓ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЗрд╕ рдХреНрд▓реЙрдЬ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдирд┐рдореНрди-рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛:

 switch (o) { // The generated code is less optimal: // If o is int, then more than one type check and unboxing operation // may happen. case int n when n == 1: return 1; case string s when s == "": return 2; case int n when n == 2: return 3; default: return -1; } 

рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛:

рдЕрдЧрд░ (o int n && n == 1) рд░рд┐рдЯрд░реНрди 1;
 if (o is string s && s == "") return 2; if (o is int n2 && n2 == 2) return 3; return -1; 

2. рд╕рдВрдХрд▓рдХ рдареЗрда рдЕрдиреБрдХреНрд░рдордг рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рд╕рдВрднрд╡ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

 switch (o) { case int n: return 1; // Error: The switch case has already been handled by a previous case. case int n when n == 1: return 2; } 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдзреЗрдп рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рд╣реИ, рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗрд╕ рдХреНрд▓реЙрдЬрд╝ рдХреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ:

 switch (o) { case int n when n > 0: return 1; // Will never match, but the compiler won't warn you about it case int n when n > 1: return 2; } 

рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рд╕рдВрдХреНрд╖рд┐рдкреНрдд


  • рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдЯрд░реНрди C # 7 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП: рдПрдХ рд╕реНрдерд┐рд░ рдкреИрдЯрд░реНрди, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрдЯрд░реНрди, рдПрдХ рдЪрд░ рдкреИрдЯрд░реНрди, рдФрд░ рдПрдХ рдЦрд╛рд▓реА рдЪрд░ рдкреИрдЯрд░реНрдиред
  • рдирдореВрдиреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдФрд░ рдорд╛рдорд▓реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдирд┐рд░рдВрддрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред
  • рдПрдХ рдЪрд░ рдХреЗ рдирдореВрдиреЗ рд╣рдореЗрд╢рд╛ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рдПрдХ рдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓реЙрд╕ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзреЗрдп рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдЪреЗрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдорд╛рд╕реНрдХреЛ рдореЗрдВ рдПрдХрддрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо - рдПрдХрддрд╛ рдорд╛рд╕реНрдХреЛ рдореАрдЯрдЕрдк 2018.1


11 рдЕрдХреНрдЯреВрдмрд░ рдЧреБрд░реБрд╡рд╛рд░ рдХреЛ, рдПрдХрддрд╛ рдорд╛рд╕реНрдХреЛ рдореАрдЯрдЕрдк 2018.1 рдЙрдЪреНрдЪрддрд░ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЗ рд╕реНрдХреВрд▓ рдореЗрдВ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕реАрдЬрд╝рди рдореЗрдВ рдореЙрд╕реНрдХреЛ рдореЗрдВ рдпреВрдирд┐рдЯреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдпрд╣ рдкрд╣рд▓реА рдмреИрдардХ рд╣реИред рдкрд╣рд▓реЗ mitap рдХреА рдереАрдо AR / VR рд╣реЛрдЧреАред рдЖрдкрдХреЛ рджрд┐рд▓рдЪрд╕реНрдк рд░рд┐рдкреЛрд░реНрдЯ, рдЙрджреНрдпреЛрдЧ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░, рд╕рд╛рде рд╣реА рдПрдордПрд╕рдЖрдИ рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбреЗрдореЛ рдЬрд╝реЛрди рдорд┐рд▓реЗрдЧрд╛ред

рд╡рд┐рд╡рд░рдг

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


All Articles