Visual Studioâ 15â Preview 4ã®ãªãªãŒã¹ã«ãã
ãå€ãã®æ°ããCïŒ7æ©èœã詊ãããšãã§ããŸãã CïŒ7ã®äž»ãªé©æ°ã¯ãããŒã¿ã®æäœã容æã«ããã³ãŒããç°¡çŽ åããããã©ãŒãã³ã¹ãåäžãããããã«èšèšãããŠããŸãã ç§èªèº«ã¯ãCïŒã¯é¢æ°åèšèªã«ç§»è¡ããŠãããã¿ãã«ããã¿ãŒã³ãããã³ã°ãªã©ã远å ããŠãããšèšããŸãã ãã¹ãŠã®æ°æ©èœããã¬ãã¥ãŒ4ã§æå³ãããšããã«æ©èœããããã§ã¯ãããŸããããããã®å ŽåãçŸåšäœã䜿çšã§ããããããã³ä»åŸã©ã®ããã«æ©èœãããã瀺ãããŸãã ãããå§ããŸãããã
ã¢ãŠã倿°
out倿°ã®äœ¿çšã¯ãçŸåšã®ããã«ç°¡åã§ã¯ãããŸããã outåŒæ°ã䜿çšããŠã¡ãœãããåŒã³åºãåã«ããã®ã¡ãœããã«æž¡ããã倿°ã宣èšããå¿
èŠããããŸãã éåžžããããã®å€ã¯å®£èšäžã«ãããã®å€æ°ã«å²ãåœãŠãããªãããïŒè«ççã§ã-ã¡ãœããã«ãã£ãŠåŒãç¶ãäžæžããããŸãïŒã
varããŒã¯ãŒãã¯äœ¿çšã§ããŸããã ã¿ã€ãã瀺ã倿°ã宣èšããå¿
èŠããããŸãã
public void PrintCoordinates(Point p) { int x, y;
CïŒ7ã§ã¯ãã¡ãœããåŒã³åºãã§å€æ°ãããã«å®£èšã§ãã
out倿°ã远å ãããŠããŸãã
public void PrintCoordinates(Point p) { p.GetCoordinates(out int x, out int y); WriteLine($"({x}, {y})"); }
ãã®ãããªå€æ°ã®ã¹ã³ãŒãã¯å€éšãããã¯ã§ãããã®ãããã¡ãœããåŒã³åºãã«ç¶ãåŒã§å€æ°ã䜿çšã§ããŸãã
泚ïŒãã¬ãã¥ãŒ4ã§ã¯ãã¹ã³ãŒãã«å¯ŸããŠããå³ããå¶éããããŸããout倿°ã¯ãå®çŸ©ãããåŒå
ã§ã®ã¿äœ¿çšã§ããŸãã ãããã£ãŠãäžèšã®äŸãæ©èœããããã«ã¯ã次ã®ãªãªãŒã¹ãåŸ
ã€å¿
èŠããããŸãã
out倿°ã¯ã¡ãœããåŒæ°ãšããŠã®è»¢éãšåãåŒã§å®£èšãããŠãããããã³ã³ãã€ã©ã¯ãã®åãæšæž¬ã§ããŸãïŒãã®ã¡ãœããã«ç«¶åãããªãŒããŒããŒãããªãå ŽåïŒããããã£ãŠãåã®ä»£ããã«
varããŒã¯ãŒãã䜿çšã§ããŸãã
p.GetCoordinates(out var x, out var y);
åºååŒæ°ã¯ã
Try ...ã¡ãœãããã¡ããªã§åºã䜿çšãã
ãŠããŸããæ»ãå€ã®ããŒã«å€ã¯æäœã®æåã瀺ããåºååŒæ°ã«ã¯çµæã®å€ãå«ãŸããŸãã
public void PrintStars(string s) { if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); } else { WriteLine(" - !"); } }
泚ïŒãã®äŸã§
㯠ã
iã¯å®çŸ©ãããŠããifãããã¯å
ã§ã®ã¿äœ¿çšãããããããã¬ãã¥ãŒ4ã§ã¯ãã®äŸãæ©èœããŸãã
å¯èœãªæ¹åã®1ã€ïŒå¿
ãããCïŒ7ã«è©²åœããããã§ã¯ãããŸããïŒã¯ãåŸã§äœ¿çšãããªãoutãã©ã¡ãŒã¿ãŒã®ä»£ããã«ã¯ã€ã«ãã«ãŒãïŒ*ïŒã䜿çšããããšã§ãã äŸïŒ
p.GetCoordinates(out int x, out *);
ãã¿ãŒã³ãããã³ã°
CïŒã®7çªç®ã®ããŒãžã§ã³ã§ã¯ã
ãã¿ãŒã³ã®æŠå¿µã衚瀺ãããŸããããã¯ãäžè¬çãªå Žåã倿°ãç¹å®ã®ãã¿ãŒã³ã«äžèŽãããã©ããã確èªããäžèŽããå Žåã¯ããããæ
å ±ãæœåºã§ããæ§ææ§é ã§ãã
CïŒ7ã«ã¯æ¬¡ã®ãã³ãã¬ãŒãããããŸãã
- 宿°ãã¿ãŒã³ ïŒ c ïŒcã¯CïŒã®å®æ°åŒïŒ; 倿°ããã®å®æ°ãšçãããã©ããã確èªããŠãã ããã
- åãã³ãã¬ãŒã ïŒ T x ïŒTã¯åãxã¯å¯å€ïŒ; 倿°ã®åãTã§ãããã©ããããã§ãã¯ããããå Žåã¯ããã®å€ãTåã®æ°ãã倿°xã«æœåºããŸãã
- varãã¿ãŒã³ ïŒ var x ïŒxã¯å€æ°ïŒ; ãã®ãã³ãã¬ãŒãã¯åžžã«trueãšè©äŸ¡ãããåãåã§åãå€ãæã€æ°ãã倿°ãäœæããããã«äœ¿çšãããŸãã
ããã¯ã»ãã®å§ãŸãã«éãããå°æ¥çã«ã¯CïŒã§æ°ãããã³ãã¬ãŒãã確å®ã«è¿œå ããäºå®ã§ãã ãã³ãã¬ãŒãããµããŒãããããã«ã2ã€ã®æ¢åã®èšèªæ§æã倿ŽãããŸããã
- is㯠ãã¿ã€ãã ãã§ãªãããã³ãã¬ãŒãã§ãïŒæ£ããåŒæ°ãšããŠïŒäœ¿çšã§ããããã«ãªããŸããã
- switchã¹ããŒãã¡ã³ãã® caseã¯ã宿°ã ãã§ãªããã¿ãŒã³ã䜿çšã§ããããã«ãªããŸããã
å°æ¥çã«ã¯ããã³ãã¬ãŒãã䜿çšããããã®ãªãã·ã§ã³ãããã«è¿œå ããäºå®ã§ãã
ãããã³ãã¬ãŒã
宿°ãã¿ãŒã³ãšåãã¿ãŒã³ã®äž¡æ¹ã䜿çšããç°¡åãªäŸãèããŠã¿ãŸãããã
public void PrintStars(object o) { if (o is null) return;
äŸãããããããã«ããã³ãã¬ãŒã倿°ïŒãã³ãã¬ãŒãã§å®£èšãããïŒã¯out倿°ãšåãã¹ã³ãŒããæã£ãŠãããããå€éšã®å¯èŠæ§ãããã¯å
ã§äœ¿çšã§ããŸãã
泚ïŒãã¬ãã¥ãŒ4ã§ã¯ããã³ãã¬ãŒã倿°ããã³åºå倿°ã«ãããå³å¯ãªå¯èŠæ§ã«ãŒã«ãé©çšãããããããã®äŸã¯æ¬¡ã®ãªãªãŒã¹ã§ã®ã¿æ©èœããŸãã
ãã³ãã¬ãŒããšTryã¡ãœããã¯äžç·ã«äœ¿çšã§ããŸãã
if (o is int i || (o is string s && int.TryParse(s, out i)) { }
ãã¿ãŒã³ãšè¡šçŸãåãæ¿ãã
ã¹ã€ããã®äœ¿çš
äŸãæ¡åŒµãããæ¬¡ã®ããšãã§ããããã«ãªããŸããã
- ïŒããªããã£ãã ãã§ãªãïŒä»»æã®ã¿ã€ãã䜿çšããŸãã
- ã±ãŒã¹åŒã§ãã¿ãŒã³ã䜿çšããŸãã
- ã±ãŒã¹åŒã«æ¡ä»¶ã远å ããŸãïŒ whenããŒã¯ãŒãã䜿çšïŒã
次ã«äŸãèããŠã¿ãŸãããã
switch(shape) { case Circle c: WriteLine($" {c.Radius}"); break; case Rectangle s when (s.Length == s.Height): WriteLine($"{s.Length} x {s.Height} "); break; case Rectangle r: WriteLine($"{r.Length} x {r.Height} "); break; default: WriteLine("< >"); break; case null: throw new ArgumentNullException(nameof(shape)); }
æ°ããé«åºŠãª
ã¹ã€ããã®æ¬¡ã®æ©èœã«æ³šæããŠãã ããã
- ã±ãŒã¹åŒã®é åºãéèŠã«ãªããŸããã ããã§ãäžèŽããžãã¯ã¯catchåŒã®å Žåãšåãã«ãªããŸããæ¡ä»¶ãæºãããŠããæåã®é åºåŒãéžæãããŸãã ãããã£ãŠããã®äŸã§ã¯ãåè§åœ¢ã®ããå
·äœçãªæ¡ä»¶ãåè§åœ¢ã®ããäžè¬çãªæ¡ä»¶ã®åã«æ¥ãããšãéèŠã§ãããããã亀æãããšãåè§åœ¢ã®æ¡ä»¶ã¯æ©èœããªããªããŸãã ãã®ãããªå Žåãã³ã³ãã€ã©ãŒãå©ãã«ãªããæç€ºçãªå°éäžèœæ¡ä»¶ã«ãã©ã°ãç«ãŠãŸãïŒ catchã®å ŽåãšåãïŒã ãã®å€æŽã¯ãæ¢åã®åäœã®å€æŽã§ã¯ãããŸãããCïŒ7ããåã§ã¯ã caseåŒã®å®è¡é åºã¯å®çŸ©ãããŠããŸããã§ããã
- ããã©ã«ãã®æ¡ä»¶ã¯åžžã«æåŸã«è©äŸ¡ãããŸãã ãã«æ¡ä»¶ã¯ãã®åŸã«æ¥ãŸãããããã©ã«ãæ¡ä»¶ã¯ãã®åŸã«ãã§ãã¯ãããŸãã ããã¯æ¢åã®ããžãã¯ããµããŒãããããã«è¡ãããŸããããããã©ã«ãã®æ¡ä»¶ãæåŸã«ããæ¹ãããã§ãããã
- æåŸã®ãã«æ¡ä»¶ã«å°éã§ããŸãã ããã¯ãåãã¿ãŒã³ãisæŒç®åã®çŸåšã®ããžãã¯ã«åŸãã nullã«å¯ŸããŠæ©èœããªãããã§ãã ãã®åäœã«ããã nullã¯æåã®ã¿ã€ãã®ãã³ãã¬ãŒããšäžèŽããŸããã ãã³ãã¬ãŒããæç€ºçã«æå®ããããç¡é³ç¶æ
ã®ããžãã¯ãæ®ãå¿
èŠããããŸãã
caseã§å®£èšããããã³ãã¬ãŒã倿°ã®ã¹ã³ãŒãã¯
switchã¹ããŒãã¡ã³ãã§ãã
ã¿ãã«
ã¡ãœããããè€æ°ã®å€ãè¿ãããå ŽåããããŸãã çŸåšå©çšå¯èœãªæ¹æ³ã¯ã©ããæé©ã«èŠããŸããïŒ
- åºåãã©ã¡ãŒã¿ïŒæ§æã¯ãªãŒããŒããŒããããŠããããã«èŠããŸãïŒäžèšã®ã€ãããŒã·ã§ã³ã䜿çšããŠãïŒãéåæã¡ãœããã«ã¯é©çšãããŸããã
- System.Tuple <...>ïŒç¹°ãè¿ããŸãããåé·ã«èŠãã远å ã®ãªããžã§ã¯ãã®äœæãå¿
èŠã§ãã
- ãã®ãããªå Žåããšã«åå¥ã®ã¯ã©ã¹ïŒäžæçã«è€æ°ã®å€ãã°ã«ãŒãåããããšãå¯äžã®ç®çã§ããåã«ã¯ãã³ãŒããå€ãããŸãã
- åçãªããžã§ã¯ãïŒããã©ãŒãã³ã¹ã®äœäžãšã³ã³ãã€ã«æã®åãã§ãã¯ã®æ¬ åŠã
ãã®ã¿ã¹ã¯ãç°¡çŽ åããããã«ãã¿ãã«ãšã¿ãã«ãªãã©ã«ãCïŒ7ã«è¿œå ãããŸããã
(string, string, string) LookupName(long id)
çŸåšããã®ã¡ãœããã¯ã¿ãã«ã«çµåããã3ã€ã®è¡ãè¿ããŸãã åŒã³åºãã³ãŒãã¯æ¬¡ã®ããã«ãããã䜿çšã§ããŸãã
var names = LookupName(id); WriteLine($" {names.Item1} {names.Item3}.");
ãã£ãŒã«ãå
Item1ãItem2ã...ã¯åã¿ãã«ã®ããã©ã«ãå
ã§ãããã¿ãã«ã«ããŒãžãããããŒã¿ãããé©åãªååã«ããããšãã§ããŸãã
(string first, string middle, string last) LookupName(long id)
ããã§ãã¿ãã«èŠçŽ ã«æ¬¡ã®ããã«ã¢ã¯ã»ã¹ã§ããŸãã
var names = LookupName(id); WriteLine($" {names.first} {names.last}.");
ãŸããèŠçŽ åã¯ã¿ãã«ãªãã©ã«ã§ããã«æå®ã§ããŸãã
return (first: first, middle: middle, last: last);
èŠçŽ ã®ååãäžèŽããªãå Žåãã¿ãã«ãäºãã«å²ãåœãŠãããšãã§ããŸããäž»ãªããšã¯ãèŠçŽ èªäœãäºãã«å²ãåœãŠãããšãã§ãããšããããšã§ãã å°æ¥çã«ã¯ãäž»ã«ã¿ãã«ãªãã©ã«ã«å¯ŸããŠå¶éã远å ãããèŠçŽ åã誀ã£ãŠã¹ã¯ããããããªã©ã®ãšã©ãŒãéç¥ããŸãã Preview 4ã«ã¯ãŸã ãã®ãããªå¶éã¯ãããŸããã
ã¿ãã«ã¯æå³ã®ããã¿ã€ãã§ããããã®èŠçŽ ã¯å¯å€ã®ãªãŒãã³ãã£ãŒã«ãã§ãã ã¿ãã«ã¯çãããã©ãããæ¯èŒã§ããŸãããã¹ãŠã®æ§æèŠçŽ ããã¢ã§äºãã«çããïŒããã³åãããã·ã¥ã³ãŒããæã€ïŒå Žåã2ã€ã®ã¿ãã«ã¯çããïŒããã³åãããã·ã¥ã³ãŒããæã€ïŒã ãã®åäœã«ãããã¡ãœããããè€æ°ã®å€ãè¿ãã ãã§ãªããã¿ãã«ã䟿å©ã«ãªããŸãã ããšãã°ãè€åããŒãæã€èŸæžãå¿
èŠãªå Žåã¯ãã¿ãã«ãããŒãšããŠäœ¿çšããŸãã åäœçœ®ã«è€æ°ã®å€ãããã¯ãã®ãªã¹ããå¿
èŠãªå Žåãã¿ãã«ã®ãªã¹ãã䜿çšããŸãã ïŒç¿»èš³è
ããïŒ100ïŒ
ã®ç¶æ³ã§ã¿ãã«ã䜿çšããããã®ã¬ã€ããšããŠãããåãåããªãã§ãã ãããæã«ã¯ãããã€ãã®ããããã£ãæã€åçŽãªã¯ã©ã¹ãæå³ããããã衚çŸããå°æ¥ç¶æãããããªããŸãïŒã
泚ïŒäœæ¥äžã®ã¿ãã«ã¯ããŸã ãã¬ãã¥ãŒ4ã«ãªãã¿ã€ãã«äŸåããŠããŸãããNuGetã䜿çšããŠãããžã§ã¯ãã«è¿œå ã§ããŸãïŒããã¬ãªãªãŒã¹ãå«ããããéžæãããããã±ãŒãžãœãŒã¹ããšããŠãnuget.orgããæå®ããããšãå¿ããªãã§ãã ããïŒãããã±ãŒãž
System.ValueTupleãšåŒã°ã
ãŸã ã
ã¿ãã«ã®å±é
ã¿ãã«ã䜿çšããå¥ã®æ¹æ³ã¯ãã¿ãã«ãã¢ã³ããã¯ããããšã§ããããã¯ãèŠçŽ ãæ°ãã倿°ã«å²ãåœãŠãããšã§æ§æãããŸãã
(string first, string middle, string last) = LookupName(id1);
å倿°ã®ã¿ã€ãã®ä»£ããã«
varããŒã¯ãŒãã䜿çšããããšãã§ããŸãã
(var first, var middle, var last) = LookupName(id1);
ãŸãã¯ãæ¬åŒ§ã®åã«
varãå
¥ããŸãïŒ
var (first, middle, last) = LookupName(id1);
ã¿ãã«ãæ¢ã«å®£èšãããŠãã倿°ã«ã¢ã³ããã¯ããããšãã§ããŸãã
(first, middle, last) = LookupName(id2);
ã¿ãã«ã ãã§ãªããã©ã®ã¿ã€ãã§ãã¢ã³ããã¯ã§ããŸãã ãããè¡ãã«ã¯ã次ã®åœ¢åŒã®ã¡ãœãããå¿
èŠã§ãã
public void Deconstruct(out T1 x1, ..., out Tn xn) { ... }
åºåãã©ã¡ãŒã¿ãŒã¯ãã¢ã³ããã¯ã®çµæãšããŠå²ãåœãŠãããå€ã«å¯Ÿå¿ããŸãã ã¿ãã«ã®ä»£ããã«åºåãã©ã¡ãŒã¿ãŒã䜿çšãããã®ã¯ãªãã§ããïŒ ãã®ããããã©ã¡ãŒã¿ãŒã®æ°ãç°ãªãè€æ°ã®ã¡ãœãããªãŒããŒããŒãã䜿çšã§ããŸãã
class Point { public int X { get; } public int Y { get; } public Point(int x, int y) { X = x; Y = y; } public void Deconstruct(out int x, out int y) { x = X; y = Y; } } (var myX, var myY) = GetPoint();
ãã®ã¢ãããŒãã«ãããã察称ãã³ã³ã¹ãã©ã¯ã¿ãŒãšå±éã¡ãœãããäœæã§ããŸãã
out倿°ãšåæ§ã«ãè¿ããããã©ã¡ãŒã¿ãŒã®äžéšãç¡èŠããã¯ã€ã«ãã«ãŒãã远å ããäºå®ã§ãã
(var myX, *) = GetPoint();
æ³šïŒ CïŒ7ã§ã¯ã€ã«ãã«ãŒãã远å ããããã©ããã¯ãŸã äžæã§ãã
ããŒã«ã«æ©èœ
è£å©é¢æ°ã¯ãåŒã³åºããã1ã€ã®ã¡ãœããå
ã§ã®ã¿æå³ããªãå ŽåããããŸãã ããã§ããã®ãããªé¢æ°ãã¡ãœããå
ã§å®£èšã§ããŸãã
public int Fibonacci(int x) { if (x < 0) throw new ArgumentException(" !", nameof(x)); return Fib(x).current; (int current, int previous) Fib(int i) { if (i == 0) return (1, 0); var (p, pp) = Fib(i - 1); return (p + pp, p); } }
å€éšã¡ãœããã®åŒæ°ãšãã®ããŒã«ã«å€æ°ã¯ãã©ã ãåŒã ãã§ãªãããŒã«ã«é¢æ°ã§ã䜿çšã§ããŸãã
å¥ã®äŸãšããŠãå埩åãšããŠå®è£
ãããã¡ãœãããèããŸãã ãã®å Žåããã®ãããªã¡ãœããã¯éåžžãåŒæ°ããã§ãã¯ããããã«éå埩ã©ãããŒã¡ãœãããå¿
èŠãšããŸãïŒMoveNextã¡ãœãããåŒã³åºããããŸã§ã€ãã¬ãŒã¿èªäœã¯åŒã³åºãããªãããïŒã
ããŒã«ã«é¢æ°ã䜿çšãããšããã®åé¡ã¯éåžžããããšã¬ã¬ã³ãã«è§£æ±ºãããŸãã
public IEnumerable<T> Filter<T>(IEnumerable<T> source, Func<T, bool> filter) { if (source == null) throw new ArgumentNullException(nameof(source)); if (filter == null) throw new ArgumentNullException(nameof(filter)); return Iterator(); IEnumerable<T> Iterator() { foreach (var element in source) { if (filter(element)) { yield return element; } } } }
Iteratorã¡ãœãããéåžžã®ãã©ã€ããŒãã¡ãœããã§ããå ŽåãåŒæ°ããã§ãã¯ããã«å¶ç¶ã«åŒã³åºãããå¯èœæ§ããããŸãã ããã«ã圌ã¯Filterã¡ãœãããšåãåŒæ°ãæž¡ãå¿
èŠããããŸãã
泚ïŒãã¬ãã¥ãŒ4ã§ã¯ãåŒã³åºãåã«ããŒã«ã«é¢æ°ã宣èšããå¿
èŠããããŸãã å°æ¥ããã®å¶éã¯ç·©åãããŸããããŒã«ã«é¢æ°ã¯ã䜿çšããããã¹ãŠã®ããŒã«ã«å€æ°ã«å€ãå²ãåœãŠãããåŸã«åŒã³åºãããšãã§ããŸãã
ãªãã©ã«ã®æ©èœåŒ·å
CïŒ7ã§ã¯ãæ°å€ãªãã©ã«ã®åºåãæåãšããŠ
_ã远å ããæ©èœã远å ãããŸããã
var d = 123_456; var x = 0xAB_CD_EF;
åºåãèšå·ã¯æ°å€éã®ä»»æã®å Žæã«è¿œå ã§ããŸãããå€ã«ã¯åœ±é¿ããŸããã
ãã€ããªãªãã©ã«ãCïŒ7ã«ç»å ŽããŸããã
var b = 0b1010_1011_1100_1101_1110_1111;
åç
§ã«ããããŒã«ã«å€æ°ãšæ»ãå€
åç
§ã«ãã£ãŠã¡ãœããã«ãã©ã¡ãŒã¿ãŒãæž¡ãïŒ
refããŒã¯ãŒãã䜿çšïŒã ãã§ãªããåç
§ã«ãã£ãŠã¡ãœããããããŒã¿ãè¿ãããšãã§ããããŒã«ã«å€æ°ãžã®ãªã³ã¯ãä¿åããããšãã§ããŸãã
public ref int Find(int number, int[] numbers) { for (int i = 0; i < numbers.Length; i++) { if (numbers[i] == number) { return ref numbers[i];
ããã§ã倧ããªããŒã¿æ§é ã®ç¹å®ã®å Žæã«ãªã³ã¯ã転éããã®ã䟿å©ã«ãªããŸãã ããšãã°ãã²ãŒã ã§ã¯ãæ
å ±ã¯æ§é ã®äºåã«å²ãåœãŠããã倧ããªé
åã«å«ãŸããŠããŸãïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®äžæåæ¢ãé¿ããããïŒã ããã§ãã¡ãœããã¯ãããã®æ§é ã®1ã€ãžã®ãªã³ã¯ãè¿ãããšãã§ãããã®å©ããåããŠãåŒã³åºãå
ã®ã³ãŒãã¯ãã®æ§é ãèªã¿åãã倿Žã§ããŸãã
ãªã³ã¯ãå®å
šã«åŠçããããã«ã次ã®å¶éãå°å
¥ãããŠããŸãã
- å®å
šã«è¿ããããªã³ã¯ã®ã¿ãè¿ãããŸããã¡ãœããã«æž¡ããããªããžã§ã¯ããžã®ãªã³ã¯ãšãªããžã§ã¯ãã®ãã£ãŒã«ããžã®ãªã³ã¯ã§ãã
- 倿°ã¯ç¹å®ã®åç
§ã§åæåãããå°æ¥å€æŽãããŸããã
éåæã¡ãœããã«ãã£ãŠè¿ãããåã®ãªã¹ãã®æ¡åŒµ
仿¥ãŸã§ã
éåæã¡ãœããã¯
void ã
TaskãŸãã¯
Task <T>ã®ã¿ãè¿ãããšãã§ããŸããã CïŒ7ã§ã¯ãéåæã§è¿ãããšãã§ããåãäœæããæ©èœãå°å
¥ãããŸããã ããšãã°ã
ValueTask <T>æ§é ãäœæããŠãéåææäœã®çµæãæ¢ã«å©çšå¯èœãªå Žåã«
Task <T>ãªããžã§ã¯ããäœæããªãããã«ããããšãã§ããŸãã ããšãã°ããããã¡ãªã³ã°ã䜿çšãããå€ãã®éåæã·ããªãªã§ã¯ããã®ã¢ãããŒãã«ããã¡ã¢ãªå²ãåœãŠã®æ°ã倧å¹
ã«åæžãããããã©ãŒãã³ã¹ãåäžããŸãã
ãã¡ãããã¿ã¹ã¯ã®ãããªãªããžã§ã¯ãã圹ç«ã€ä»ã®ç¶æ³ãæãã€ãããšãã§ããŸãã ãããã®åãæ£ããäœæããã®ã¯ç°¡åãªäœæ¥ã§ã¯ãªãããã倿°ã®éçºè
ãããããäœæããããšã¯æåŸ
ããŠããŸããããããŸããŸãªãã¬ãŒã ã¯ãŒã¯ã§æçšã§ãããåŒã³åºãã³ãŒãã¯Taskã®ããã«
awaitãåçŽã«äœ¿çšã§ãããšèããŠããŸãã
泚ïŒãã¬ãã¥ãŒ4ã§ã¯ããããã®ã¿ã€ãã¯ãŸã 䜿çšã§ããŸããã
åŒãšããŠã®ããå€ãã®ã¯ã©ã¹ã¡ã³ããŒ
CïŒ6ã«ç»å ŽããåŒïŒåŒã®ããã£ã¡ã³ãïŒã®åœ¢åŒã®ã¡ãœãããšããããã£ããã䜿çšãããŸãããããã¹ãŠã®ã¿ã€ãã®ã¯ã©ã¹ã¡ã³ãããã®ããã«å®£èšã§ããããã§ã¯ãããŸããã CïŒ7ã§ã¯ãã»ãã¿ãŒãã²ãã¿ãŒãã³ã³ã¹ãã©ã¯ã¿ãŒãããã³ãã¹ãã©ã¯ã¿ãŒã®ãµããŒãã远å ãããŸããã
class Person { private static ConcurrentDictionary<int, string> names = new ConcurrentDictionary<int, string>(); private int id = GetId(); public Person(string name) => names.TryAdd(id, name);
ããã¯ãã³ã³ãã€ã©éçºããŒã ã§ã¯ãªããã³ãã¥ããã£ã«ãã£ãŠè¿œå ãããæ°ããæ©èœã®äŸã§ãïŒ ãã£ããŒ
泚ïŒãã¬ãã¥ãŒ4ã§ã¯ããããã®ã¯ã©ã¹ã¡ã³ããŒã®ãµããŒãã¯å©çšã§ããŸããã
åŒãæãã
åŒã®éäžã§äŸå€ãã¹ããŒããããšã¯ããã»ã©é£ãããããŸããããããè¡ãã¡ãœãããåŒã³åºãã ãã§ãã ãã ããCïŒ7ã§ã¯ãåŒã®äžéšãšããŠ
throwã䜿çšã§ããããã«ãªããŸããã
class Person { public string Name { get; } public Person(string name) => Name = name ?? throw new ArgumentNullException(name); public string GetFirstName() { var parts = Name.Split(" "); return (parts.Length > 0) ? parts[0] : throw new InvalidOperationException("No name!"); } public string GetLastName() => throw new NotImplementedException(); }
泚ïŒãã¬ãã¥ãŒ4ã§ã¯ããã®ãããªåŒã¯ãŸã 䜿çšã§ããŸããã
ãããã«
CïŒ7ã®ãªãªãŒã¹ã¯ãŸã ãŸã å
ã§ãããä»ã§ã¯ã»ãšãã©ã®æ°æ©èœã詊ããŠãCïŒãš.Netãäžè¬çã«ã©ãã«ç§»åããŠããããçè§£ã§ããŸãïŒç§ã«ãšã£ãŠã¯ãCïŒã¯é¢æ°åèšèªãããããã®äžéšãååŸããããã«ããã³ãŒããèªã¿ããããªãããããããã¡ãããæž¬å®å€ãç¥ãå¿
èŠããããã¹ãŠã®å Žæã§ïŒã