ä¸ã®ä¸ã«ã¯å¤ãã® C# ã«é¢ãã誤解ãèå»¶ã£ã¦ãã¾ãã åè¦ã«ãæºã¡ã¦ãã¾ãã ããã¦æè¡çã«æ£ããæ¹å¤ã§ã¯ãªããæ ¹æ¬çã«æè¡çã«èª¤ã£ãæ¹å¤ã°ããã§æ£ç´æ²ããã æè¡çã«æ£ããå½¢ã®æ¹å¤ãªããããããã ãªãããã¦ããã®è§£æ±ºçã¯ã§ããã...(ï¾ï¾ï¾ï¾)ãã¨ãªãã®ã§ãã...ã ãã㦠C# çéãã䏿©åºãã¨ããããC# ã§ä½ã£ã¦ãã®ï¼ï¼ãªãã§ï¼ï¼ãã¨ãè¨ãããäºãé常ã«å¤ãå§æ«ã
C# 大好ããã³ã¨ãã¦ã¯é常ã«åããããã åããããéããªã®ã§ãããã§ãªã C# ãç§ã好ãããããã¦ä½æ ã½ããã¦ã§ã¢ã®éçºã«åãã¦ããããèªãããã¨æãã¾ããããã¦èª¤è§£ãè§£ãããå¬ãããã¤ãã§ã« C# ãæ¸ãããã¨æã£ã¦ããããå¬ããã
- æ³å®èªè
- 忏ãã¨ããåã®äºé²ç·
- äºåç¥è: C# 㨠.NET
- C# ã¯ããã©ã¼ãã³ã¹ã®é«ãè¨èª
- C# ã¯ãªã¼ãã³ã½ã¼ã¹ãã¤ã¯ãã¹ãã©ãããã©ã¼ã
- è¨èªçå©ç¹
- æ¨æºã©ã¤ãã©ãª
- OSS çã®ã©ã¤ãã©ãªäºæ
- ããã¸ã§ã¯ãã¨ããåä½
- 徿¹äºæ
- éçºä½é¨
- C# ã¯ä¸ççã«äººæ°
- ä»è¨èªã¨æ¯è¼ãã¦
- 使 C# ã好ãã®ã
æ³å®èªè
- C# ã§ã½ããã¦ã§ã¢ãéçºãã¦ããã¨èããæã«ããªãã§ C#ï¼ãã¨æãæ¹
- ã©ã®è¨èªã§ã½ããã¦ã§ã¢ãéçºãããããæ©ãã§ããæ¹
- C# ã«ã¤ãã¦ç¥ãããæ¹
- ããã°ã©ãã³ã°è¨èªã®ãªã¿ã¯
- 徿¹è çµããããããã C#er
忏ãã¨ããåã®äºé²ç·
ã¾ã大åæã¨ãã¦ãããã°ã©ãã³ã°è¨èªã¯å®æã§ã¯ããã¾ããã ããã¾ã§ã½ããã¦ã§ã¢ãéçºããããã®éå ·ã§ãã ãªã®ã§ããä¸ã®ä¸ã®ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¨ããçãç©ã¯ãèªåã使ã£ã¦ããããã°ã©ãã³ã°è¨èªãæ¹å¤ããããããã¨ã¾ãã§èªåãå¦å®ããããã®ããã«æãåºã人ããã¾ãã 宿ãããªããã ãã...ã
ã弿³çãé¸ã°ãããªãã¦è¨èãããã¾ãããä¸ã®ä¸ã® 99.99% ã®ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¯å¼æ³ã§ã¯ããã¾ããã弿³ã§ãªããªããéå ·ã«ã¯ãã ããã¹ãã§ãã ãªã®ã§ãã¯ã¤ã«ã¯ãããããªãããï¼ã ãããããä¸çªããããï¼ãçã¹ã¿ã³ã¹ã¯æ¨ã¦ãã¹ãã§ãããã èªå㯠C# ã大好ãã§ããã大好ããªã®ã¯ C# ãç¾æç¹ã«ããã¦ä»ã®è¨èªã«æ¯ã¹ã¦åªãã¦ããã¨èãã¦ãããããã¨ããã ãã§ãã
ãªã®ã§èªè ã使ã£ã¦ãããã®ã«å¯¾ãã¦ç§ãæ¹å¤ããã¨ãã¦ããããã¾ã§éå ·ã«ã¤ãã¦æãã¨ãããè¿°ã¹ã¦ããã ãã§ãããå¥ã«èªè ãå¦å®ãã¦ãããããããã§ã¯ãªãäºã¯ãã®å ´ã§æç¢ºã«ãã¦ããããã¨æãã¾ãã
äºåç¥è: C# 㨠.NET
C# ã®è¨äºãèªãã«ããã£ã¦ã¯ã.NET ã¨ããè¨èãæ¬æ¥çã«ã¯çè§£ãã¦ããå¿ è¦ãããã¾ãã
C# ã¯è¨ãããããªã§ããããããã°ã©ãã³ã°è¨èªã§ããã§ã¯ .NET ã¯ä½ãã¨ããã¨ãå ¬å¼ã§ã¯application platformãdeveloper platformã¨èª¬æããã¦ãã¾ããã¾ãã端çã«ãããªãã° C# (ã F#, VB.NET) ã§è¨è¿°ãããããã°ã©ã ãé§åãããããã®è«¸ã ã§ããã¤ã¾ã runtime ãæ¨æºã©ã¤ãã©ãªçã ã®ãã¨ãã¾ã¨ã㦠.NET ã¨å¼ç§°ãã¦ãã¾ãã
ããããã®è¨äºã§ã¯æ£ç¢ºã«ã¯ .NET å´ã®è©±ã ããªãã¨ããã¨ããã«é¢ãã¦ã C# ã¨å¼ç§°ãã¦ããããã¾ãããã㯠C# ã .NET ã«æ £ãã¦ããªãæ¹ãèªãã æãããããçè§£ã妨ãããã¤ãºã«ãªãããã§ãããã¨ãã° ãC# ã¯é«éãªè¨èªãã¨ãã£ãæãããã°ã©ãã³ã°è¨èªã§ãã C# ãã®ãã®ãéãã®ã§ãªããæ£ç¢ºã«ã¯ C# ã§æ¸ãããããã°ã©ã ãé§åãããã.NET runtime ãé«éãã¨ãã話ã§ããä»è¨èªã§ä¾ããã¨ããJavaScript ã¯é«éãªè¨èª (ä¾ãã°ã§ãã!)ãã¨è¨ã£ãæãããæ£ç¢ºã«ã¯ãNode.js ãéãããããã¯ãDeno ãéããã®ã§ãã£ã¦ãJavaScript è¨èªãã®ãã®ãé«éãªããã§ã¯ãªãããã§ãã è¨èªã«å¯¾ãã¦1ã¤ã® runtime ã®å®è£ ããåå¨ããªãã¨ãã®ãããã®æèãå¸èã«ãªãã¨ããã§ã¯ããã¾ãããè¨èªä»æ§ã大äºã§ãããè¨èªä»æ§ãã©ãã ãåªãã¦ãã¦ã runtime ã®å®è£ ãããã¼ãã¨é ããªãã¾ãããéã«è¨èªä»æ§ãããã¼ãã¦ã runtime ã (è«å¤§ãªè³æ¬ãä¼´ã£ã¦) çã£ãããã«æé©åãããã¨ã§é«éã«ããªãã¾ãããããªãããªã®ã§æ£ç¢ºã«ã¯åºå¥ããã¹ããªã®ã§ãããæ £ããªã人ã«ã¨ã£ã¦ã¯ãã¤ãºã«ãªãã¨æãããã®ã§ããã®ãããã®è¨èã®ä½¿ãåãã¯ãããµãã«è¡ãããã¨æãã¾ãã
ãã㨠C#er 㯠C# 㨠.NET å´ãæç¢ºã«åé¢ãã¦çè§£ãã¦ããéæè¨èã使ãåããã¦ããã¨æãã¾ãã ãã®ãããªæ¹ã ã«ã¨ã£ã¦ã¯éåæãæã¤è¡¨è¨ãããããã§ããããã®ãããã¯ããããæå³ã§æ¸ããã¦ããã®ã ã¨çè§£ãã¦ãã ãã (ããã³ã¾ãªãã§ã)ã
C# ã¯ããã©ã¼ãã³ã¹ã®é«ãè¨èª
ããã©ã¼ãã³ã¹ã¯æ£ç¾©ã§ãã大æ£ç¾©ã ããã°ã©ãã³ã°è¨èªã®ããã©ã¼ãã³ã¹ã¯ä¸»ã«3ã¤ã«è¦ç´ ãããªãã¾ãã
- è¨ç®å¦çã®éã
- éåæ IO æ§è½
- ãã«ãã³ã¢ã»ãã«ãã¹ã¬ããæ§è½
ããã©ã¼ãã³ã¹ãè¯ãäºã¯ããããé¢ã§å¬ããã§ãã Web ãµã¼ãã¹ã«ããã¦ã¯ãã¦ã¼ã¶ã«å¯¾ããã¬ã¹ãã³ã¹ãæ©ãäºã¯ãã¦ã¼ã¶ä½é¨ãè¯ãã ãã§ãªãã売ãä¸ãçã«ç´çµããã¨ããäºå®ã¯è¿å¹´ã§ã¯ããã¨åºãç¥ãããã話ãã¨æãã¾ãã ããã¦ããã©ã¼ãã³ã¹ãè¯ãã¨ããäºã¯å½ç¶åéã®ãªã¯ã¨ã¹ããå°ãªããµã¼ãã®å°æ°ã§æããããã®ã§ãã¯ã©ã¦ãã使ã£ã¦ããå ´åã¯ã¯ã©ã¦ãè²»ç¨ãæãããã¾ããããªã³ãã¬ã§ããã°å¿ è¦ãªãµã¼ãã®å°æ°ãé»åãæãããã¾ãã ã¦ã¼ã¶ã«ã¨ã£ã¦ãããµã¼ãã¹æä¾è å´ã«ã¨ã£ã¦ãå¬ãããããã©ã¼ãã³ã¹ãé«ãã¦å«ãªäººã¯ãªãã§ãããã
ãã㦠C# ã¯é常ã«ä¸è¨3ã¤ã®ã©ã®å´é¢ãã¨ã£ã¦ãåªãããããã©ã¼ãã³ã¹ã®è¯ãè¨èªã§ãã å ·ä½çã«ã©ããããããã©ã¼ãã³ã¹ãåªãã¦ããããããã¤ãã®ãã³ããã¼ã¯ãã¿ã¦è¡ãã¾ãããã
ã¾ãã¯åç´ãªè¨ç®å¦çã®ãã³ããã¼ã¯ã§ãã Benchmarks Game ã®ãã³ããã¼ã¯çµæãããã覧ã®éããC# (å·¦ãã4çªç®) 㯠C, C++, Rust ã®æ¬¡ã«é«éãªè¨èªã§ããã¨ãããã³ããã¼ã¯çµæã«ãªã£ã¦ãã¾ãã

ããã¦æ¬¡ã« TechEmpower ãå ¬éãã¦ãã Web Framework Benchmarks ã®ãã³ããã¼ã¯ããã Web Framework ã®ãã³ããã¼ã¯ã¯åãªãè¨ç®å¦çã ãã§ãªããéåæ IO æ§è½ããã«ãã³ã¢ã»ãã«ãã¹ã¬ããæ§è½ãéè¦ã«ãªã£ã¦ãã¾ãã

asp.net core ã¨æ¸ããã¦ããã®ã C# ã® Web Framework ã§ãããComposite Framework Scores (ãªããè¨äºå ¬éæç¹ã§ã¯è¦ããªããªã£ã¦ãã¾ã£ã¦ãã¾ããããã®ãã¡å¾©æ´»ããã§ããã)ã§ã¯ 18 ä½ã«ä½ç½®ãã¦ãã¾ããé ä½ã§ããã¨ã¶ã£ã¡åãã§é«ã...ã¨ãããµãã«ã¯è¦ããªãããããã¾ããããä¸ä½ã«ä½ç½®ã¥ãã¦ãã Web Framework ã®ããããæ°ããã³ããã¼ã¯ç¹åã§ããããã¯ã·ã§ã³ã§ã¯ä½¿ããã¦ããªããã®ã ã£ãããã¾ãããªã®ã§ãããã¯ã·ã§ã³ã§åºã使ããã¦ãã Web Framework ã®ä¸ã§ã¯ asp.net core ã¯ãã¡ããã¡ãæ©ãæ¹ã§ããããasp.net core ããä¸ä½ã§èåãªãã¤ãntex (Rust), libh2o (C), axum (Rust), quarkus(Java), drogon (C++) ã¨ãã§ããããã
ã¡ãªã¿ã«èåã©ãããã¤ãããã¯ã·ã§ã³ã§ã使ããã¦ããããªä»ã®ãã¬ã¼ã ã¯ã¼ã¯ã ã¨ä»¥ä¸ã®éãã§ããç¹ã« Ruby on Rails ã Laravel çã¯æåéãæ¡éãã«é ãã§ãã
- hono (JavaScript): 51 ä½
- goframe (GO): 54 ä½
- express (JavaScript): 62 ä½
- ralis (ruby): 125 ä½
- laravel (PHP) : 152 ä½
- django (Python): 159 ä½

ã¾ã gRPC ã®ãã³ããã¼ã¯ ã§ã¯ C# ã Rust ã®å®è£ ãä¸åã1ä½ã«è¼ãã¦ããããã¾ãã

ãRust ã¯æ©ããã¨ããå å ¥è¦³ã¯å¤ãã®çããæã£ã¦ããã¨æãã¾ãã (å®éã®ã¨ãã Rust ãã©ãå®è£ ãããã§ç¸å½å¤ãããã§ããã©ãï¼)ãC# ã Rust ã«è² ããªããããæ©ãã£ãããã¾ãã ããã¦ãªã«ããå¤ãã®äººã«ã¨ã£ã¦ C# 㯠Rust ããå§åçã«æ¸ããããã§ãããã
ããå°ãããã¨ãããããé ãè¨èªããã¬ã¼ã ã¯ã¼ã¯ãç¨ãã¦ããã©ã¼ãã³ã¹ã«åé¡ãæãã¦æé©åããããã並åå°æ°ãå¢ããã¦ã¯ã©ã¦ãè²»ç¨ã溶ãããããæåããé«éãªè¨èªã¨é«éãªãã¬ã¼ã ã¯ã¼ã¯ã鏿ãã¦å®è£ ãããã¨ã¯æãã¾ãããï¼ ã¨ããäºã§ããã¯ãçãã C# ãæ¸ãã¾ãããï¼
C# ã¯ãã«ããé«é
ã¡ãªã¿ã« C# ã¯ãã«ããé常ã«é«éã§ãããã ãã«ããé«éã§ããäºã示ããã³ããã¼ã¯ã¨ããã¾ããªãã®ã§ãç§ã®æå ã§èåã©ããã® OSS ããã«ããã¦è¨æ¸¬ãã¦ãã¾ãããè¨æ¸¬ã®ã¬ã®ã¥ã¬ã¼ã·ã§ã³ã¯ä»¥ä¸ã®éãã
- GitHub ãã clone ããã¬ãã¸ããªå
ã®æ¢å®ã§æå¹ã«ãªã£ã¦ããã³ã¼ãå
¨ã¦ããã«ã
- ã³ãã³ãçã«ã¯
$ dotnet build Xxx.sln - å¾ã«ãªãã·ã§ã³ã¨ãã¤ããªã
- å½ç¶è¤æ°ã® .NET ãã¼ã¸ã§ã³ (TFM) ã«å¯¾ãããã«ããèµ°ã
- .NET 8 ç¨ / .NET 9 ç¨ã§ãããããã«ããèµ°ããã¨ãã£ãå ·å
- å½ç¶è¤æ°ã® .NET ãã¼ã¸ã§ã³ (TFM) ã«å¯¾ãããã«ããèµ°ã
- ãã ãäºåã«ããã±ã¼ã¸ã®å¾©å
(
$ dotnet restore) ã¯å®æ½ãã¦ãã
- ã³ãã³ãçã«ã¯
- ãã«ã㯠Debug build
- C# ã«ã¯ Debug build 㨠Release build ã®2種é¡ãåå¨ãã¾ã
- ãã®åã®éãéçºæç¨ã¨ãããã¯ã·ã§ã³ã¨ãã¦ãªãªã¼ã¹ããç¨ã§ã
- Release build ã¯éçºæç¨ãã«ãããæé©åããããããå°ã
æéãããã
- ã¨ã¯ããæ©ãã§ããC++ ã¿ãããªã¨ã°ããã«ãæéã«ã¯ãªãã¾ãã
- ä»åã¯ãã¼ã«ã«ã§ã®éçºä½é¨çãªã¨ããã«ç¦ç¹ãå½ã¦ã¦ãããããDebug build ã§è¨æ¸¬
- C# ã«ã¯ Debug build 㨠Release build ã®2種é¡ãåå¨ãã¾ã
- è¨ç®æ©ç°å¢
- CPU: Ryzen 9 7950X3D
- ã¡ã¢ãª: 128GB
ããã¦ãã«ãçµæã以ä¸ã®éãã
- grpc/grpc-dotnet
- C# ã® gRPC ã® server/client å®è£
- ãã«ãæé: 13 ç§
- open-telemetry/opentelemetry-dotnet
- C# ã® OpenTelemetry ã®ã³ã¢é¨åã®å®è£
- ãã«ãæé: 17 ç§
- Cysharp/R3
- C# ã® Reactive Extensions ã®ç¾ä»£çå®è£ ç
- ãã«ãæé: 6 ç§
- dotnet/yarp
- envoy ããé«é㪠C# 製㮠HTTP ãªãã¼ã¹ãããã·
- ãã«ãæé: 8 ç§
- microsoft/garnet
- Redis ãã2æ¡éã (!!) C# 製㮠RESP 対å¿ã®ã¤ã³ã¡ã¢ãªãã£ãã·ã¥
- ãã«ãæé: 8 ç§
å¾åã¨ãçµæ§ééç´ã ã¨æãã¾ããããã«ãã«ãããã¦ãããªããã§ããããã C# ã®ãã«ãã¯é常ã«é«éã§ãããã¨ãåããã§ãããã
ããã«ãèªåãã¡ã®ã¢ããªã±ã¼ã·ã§ã³ãéçºãã¦ããéã«ã¯ä»¥ä¸ã®ãããªæ¡ä»¶ã«ãªãã®ã§ãããçãæéã§ãã«ããçµãããã¨ã§ãããã
- ãã«ããå¿
è¦ãªããã¸ã§ã¯ã (å¾è¿°) ã®ã¿ãã«ããèµ°ã
- ãã£ãã·ã¥ãå¹ã
- ã³ã¼ãã夿´ãã¦ããªãããã¸ã§ã¯ãã¯ãã«ããçºçããªã
- ã©ã¤ãã©ãªã®å ´åè¤æ°ã® TFM (Target Framework Moniker, è¦ã¯ .NET ã®ãã¼ã¸ã§ã³) ãåºæ¬ã§ãããã¢ããªã±ã¼ã·ã§ã³ã¯ã©ã¤ãã©ãªã»ã©è¤æ°ã® TFM ã«å¯¾ãã¦ãã«ãããªã (ã¢ããªã±ã¼ã·ã§ã³ã¯æ®ã©ã®å ´ååä¸ TFM ãªããããªãããª)
- ããããã« Node.js 18 åããNode.js 20 åãã§ãã«ã...ã¿ãããªãã¨ã¯ããªããã¨ãããããªã¤ã¡ã¼ã¸ã
- ãªã®ã§å®åã§ã®ã¢ããªã±ã¼ã·ã§ã³éçºã¯åéã®ã³ã¼ãéã§ããã°ã©ã¤ãã©ãªããé«éã«ãã«ããããã¯ãã
ããã¦ä½ãã C# ã¯ãã«ãã§å°ãäºãæ®ã©ããã¾ããã C++ ã Python ãªã©ã® GitHub ã«è»¢ãã£ã¦ãã OSS 㯠git clone ãã¦ããä¸çºã§ãã«ããéã£ããã¨ã©ã¼ãªãå®è¡ããããªãã¦äºã¶ã£ã¡ããã»ã¼ã»ã¼ç¡ãã®ã§ãã (ä¸çºã§åãããæåã¢ã)ãC# ã¯ãã®ãããªäºã§ãã©ã¹ãã¬ã¼ã·ã§ã³ãæ±ãããã¨ãæ®ã©ããã¾ããã
C# ã¯ãªã¼ãã³ã½ã¼ã¹ãã¤ã¯ãã¹ãã©ãããã©ã¼ã
ããã¯ä¸ç誤解ãè§£ããªãã®ã§è¨ãç¶ããªããã°ãªããªãã®ã§ãããC# ã¯ãªã¼ãã³ã½ã¼ã¹ã§ããããã¦ã¯ãã¹ãã©ãããã©ã¼ã ã§ãããªã®ã§å½ç¶ãWindows ã ãã§ãªã Linux ã Mac OS ã§ãåä½ãã¾ãã
æ¬å½ã«ã³ã£ããããããã誤解ãè§£ããªããã¨ãããããã¾ã ã«ãC# 㯠Windows ç¨ã®è¨èªã§ããï¼ãã¨ããå°è±¡ãä»ãè²æ¿ãæ®ã£ã¦ãã¾ã£ã¦ãã¾ã£ã¦ãã¾ã (ã¨ãã«2000年代ã®ç¥èã®ã¾ã¾ã¢ãããã¼ãããäºãå¿ãã¦ãã¾ã£ã ãããã æ¥çæ´ã®é·ãæ¹ã«)ããããã .NET Framework 㯠windows å°ç¨ãã¤ãªã¼ãã³ã§ã¯ç¡ãã£ãããã§ãããruntime ã¨ãã¦ã¯ã¯ãã¹ãã©ãããã©ã¼ã ãã¤ãªã¼ãã³ãª Mono ããã£ããããã®ã§ããã©ã...?
ã¾ããWEB ã¢ããªã±ã¼ã·ã§ã³ãã¬ã¼ã ã¯ã¼ã¯ã§ãã ASP.NET Core ã Windows ã® GUI ãçµãããã®ãã¬ã¼ã ã¯ã¼ã¯ã§ãã WPF ã WinUI ãªã©ã OSS ã¨ãªã£ã¦ãã¾ãã
è¨èªçå©ç¹
éçåä»ã
C# ã¯éçåä»ãè¨èªã§ããéçåä»ãè¨èªã¯ãã¾ãã¾ãªé¢ã§åçåä»ãè¨èªã«æ¯ã¹ã¦ã¡ãªãããããã¾ãã
ããè¨ãããéçåä»ãã®ã¡ãªããã¯ä»¥ä¸ã®ãããªã¨ããã§ããããåçåä»ãã¨æ¯ã¹ãªããã¿ã¦ããã¾ãããã
- ã³ã³ãã¤ã«æåãã§ãã¯
- å®è¡ããåã«åã®ä¸æ´åããã£ãå ´åã«ã³ã³ãã¤ã©ãæã£ã¦ããã
- 100%ä¿¡é ¼ã§ãã
- åçåä»ãã§ãåã¢ããã¼ã·ã§ã³ãã§ãã¾ãããæè©®ã¢ããã¼ã·ã§ã³ã100%ã§ã¯ããã¾ãããã¢ããã¼ã·ã§ã³ãã¹ã§å®è¡æã®åã¨ã¢ããã¼ã·ã§ã³ããã¦ããåãå°å³ã«ç°ãªãã¨ããããã話ã§ããã¢ããã¼ã·ã§ã³ãä¿¡é ¼ããè£åããã磨èããäºã®ãªãã¨å¤ãäºã...ã
- åçåä»ãç¨ã®éçè§£æãã¼ã«çãå°å ¥ãã¦ã 100% ã®è§£æã¯ä¸å¯è½ã§ãããæ£ç´æ¼ããå¤ãã
- åçåä»ãã§ãåã¢ããã¼ã·ã§ã³ãã§ãã¾ãããæè©®ã¢ããã¼ã·ã§ã³ã100%ã§ã¯ããã¾ãããã¢ããã¼ã·ã§ã³ãã¹ã§å®è¡æã®åã¨ã¢ããã¼ã·ã§ã³ããã¦ããåãå°å³ã«ç°ãªãã¨ããããã話ã§ããã¢ããã¼ã·ã§ã³ãä¿¡é ¼ããè£åããã磨èããäºã®ãªãã¨å¤ãäºã...ã
- ã³ã³ãã¤ã«ææé©å
- ããã©ã¼ãã³ã¹ã¯æ£ç¾©
- ããã¥ã¡ã³ãã¨ãã¦ã®å
- 弿°ã«ããè¿ãå¤ã«ãã䏿夿°ã«ãããã³ã¼ãä¸ã«ç¾ãããããããªãã¸ã§ã¯ãã®åãå¸¸ã«æç¢ºã§ãããçµæçã«ãã®ãªãã¸ã§ã¯ãã«ã¯ã©ã®ãããªããããã£ãã¡ã½ãããå®ç¾©ããã¦ããããå³åº§ã«çè§£ãå¯è½ã§ããããã¦ãã㯠100% ä¿¡é ¼ã§ãã¾ãã
- åçåä»ãã®å ´åã¯å®è¡ãã¦ã¿ãããããã¥ã¡ã³ããèªã¿è¾¼ãã§ã¿ãããã¯ãã¾ããã¹ããè¦ã«è¡ããªããã°å®éã«æ¸¡ãããå¤ãã©ã®ãããªåãæå¾ ãã¦ãããå ¨ãåããã¾ããã
- ããã¦ããã¥ã¡ã³ãããã¹ãã ãã§ã¯ååã§ã¯ããã¾ããããªããªãåçåä»ãã«ããã¦ã¯ãè¨èªã¬ãã«ã§ã¯ã¡ã½ããã®å¼æ°ããè¿ãå¤ãªã©ããããããªãã¸ã§ã¯ãã®åã®å¯è½æ§ãç¡éã«åå¨ãããããã
anyãvoid*ã§å ¨é¨ããã¨ãããã¦ãããããªãã®ã§ããææããããã¾ããã - åã¢ããã¼ã·ã§ã³ã 100% ä¿¡é ¼ããäºã¯åºæ¥ã¾ããããJavaScript ã® JSDoc ã Python ã® docstring ãªã©ãå½ç¶ 100% ã®ä¿¡é ¼ããããã¨ã¯ã§ãã¾ããã
- 弿°ã«ããè¿ãå¤ã«ãã䏿夿°ã«ãããã³ã¼ãä¸ã«ç¾ãããããããªãã¸ã§ã¯ãã®åãå¸¸ã«æç¢ºã§ãããçµæçã«ãã®ãªãã¸ã§ã¯ãã«ã¯ã©ã®ãããªããããã£ãã¡ã½ãããå®ç¾©ããã¦ããããå³åº§ã«çè§£ãå¯è½ã§ããããã¦ãã㯠100% ä¿¡é ¼ã§ãã¾ãã
- è£å®ããªãã£
- ã¨ãã£ã¿ã IDE ã¯ããã®ãªãã¸ã§ã¯ãã¯ãã®ã¡ã½ãããããããã£ãæã£ã¦ããããã¨ããã®ãã
.(ããã)ããæ¼ãã¨åè£ãããããåºãã¦ããã¾ãããããã¯ãã®ãªãã¸ã§ã¯ãã®åããªã«ãã³ã¼ãã£ã³ã°ãã¦ããæä¸ã«è§£æå¯è½ã ããå®ç¾ã§ãããã¨ã§ããåçåä»ãè¨èªã§ãå¤å°ã®è£å®ã¯ãã¦ããã¾ãããåºæ¬çã«ã¯å®è¡æã«ãã®ãªãã¸ã§ã¯ããã©ã®ãããªåã«ãªãããã¨ã¹ãã¼ãããã®ã¨ã¹ãã¼ãå®äºãããã¡ã½ããåãªã©ã®ã¿ã¤ãã³ã°ãé å¼µãå¿ è¦ãããã¾ããéçåä»ããªãã¨ã¹ãã¼ã¯ä¸è¦ã§ãããè£å®åè£ãã鏿ããã°ããã ããªã®ã§ã¿ã¤ãã³ã°ãä¸è¦ã§ãã
- ã¨ãã£ã¿ã IDE ã¯ããã®ãªãã¸ã§ã¯ãã¯ãã®ã¡ã½ãããããããã£ãæã£ã¦ããããã¨ããã®ãã
éçåä»ãè¨èªã¯ 100% ã®ç²¾åº¦ã§å¤ãã®äºãä¿è¨¼ãã¦ããã¾ãããã® 100% ã¨ããã®ãã¨ã¦ããããããã³ã³ãã¤ã«æåãã§ãã¯ã¯ãã¡ãããåãããã¥ã¡ã³ãã¨ãã¦ãã¿ã¦ããã¯ã 100% æ£ããã ã½ããã¦ã§ã¢éçºã§ã¯ãåºæ¬çã«ã³ã¼ãã¯æ¸ãããèªãäºã®æ¹ã«ãã£ã½ã©æéã使ãããã§ããããã® 100% ã¨ããåæããªãã¨ãã¾ãã¾ãªå¯è½æ§ã常ã«èæ ®ããªããèªãã§ããå¿ è¦ãããã¾ããããèªè§£ã®ãã¼ãã«ãè·³ãä¸ããã¾ããããã«æ¯ã¹ã¦åãæç¢ºã«è¨è¿°ãããã³ã¼ãã¯å§åçã«çè§£ããããããã¾ãã¾ãªæ¡ä»¶ãåã«æ¼ãä»ããããã®ã§ãè³ã«åã¾ãããã価å¤ãããã¾ãã
ãããããå¤ãã®äºã人åã§ã¯ãªãä»çµã¿ã«ãã¦ãã¾ãããã¨ããã®ãã³ã¼ãã£ã³ã°ããã人éã«ã¨ã£ã¦ã¯å½ããåãªäºã§ããç¾å¾³ãªããã§ããããªãåãæ¸ãã®ãããã©ãããããã¨ãã£ã¦ããããäºã人åã§ä¿è¨¼ããªããã°ãªããªãåçåä»ãè¨èªã好ãã®ã§ããããï¼åçåä»ãã鏿ããç¬éã«ä»çµã¿ã§ä¿è¨¼ã§ãããã¾ãã¾ãªäºæãä½1ã¤ããªããªãã®ã«ãé¢ããããã§ãã
ãã¹ãé¢
ç¾ä»£ã®ã½ããã¦ã§ã¢éçºã«ããã¦ãã¹ãã¯å¿ é ã§ãããããªãå¿ é ãï¼ããã¯ééããªããã³ã¼ãã®æ¯ãèããä¿è¨¼ãç¶ããããããã§ãããããªã®ã§ãã¹ããéè¦ã ã¨èããäºã¯ããã³ã¼ãã®æ¯ãèããä¿è¨¼ãç¶ããäºããéè¦ã ã¨èããäºã§ããããã§å¤§äºãªã®ã¯ä¿è¨¼ããã¨ããäºã§ãã
ãããåçåä»ãè¨èªã®å ´åã©ãã§ããããï¼ã³ã¼ãä¸ã«ç¾ãããã®ã¤ã³ã¹ã¿ã³ã¹ã®åã¯ï¼ãã©ã¡ã¼ã¿ã®åã¯ï¼è¿ãå¤ã®åã¯ï¼ãããä½ãä¿è¨¼ããªãã®ã§ãããã³ã¼ãã®æ¯ãèããä¿è¨¼ãç¶ããäºãã大äºã ã¨èãã¦ããã®ã«ã100% ã®ç²¾åº¦ã§ä¿è¨¼ãã¦ãããåãç¡è¦ããäºã«ãããèªãè¦ããéã«çªå ¥ãã¦ããã¨ãã£ã¦ããã§ãããã
å人çãªä½æããããã¨ãåçåä»ãè¨èªã§ã³ã¼ãã£ã³ã°ããã¦ããéã«èµ·ããåé¡ãã¨ãã«ã¼ãããå ¨ã¦èªåèªèº«ã§è¨è¿°ãã¦ããã§ã¯ãªããä»äººãæ¸ããæ¢åã®ã³ã¼ãã«å¤æ´ãå ãã¦èµ·ããåé¡ã®ãã®ã»ã¨ãã©ã¯ãã¸ãã¯ã®ãã¹ãããå ã«å絡ã¿ã§ããéçºä¸ã«æ°ã¥ããé¡ãªãã¾ã ãã·ãªã»ãã§ãæ¬çªç°å¢ã«ããã¦ä½ãäºæ ãèµ·ããéããå¤é¨ã®ã©ã¤ãã©ãªãç¹å®ã®æ¡ä»¶ä¸ã«ããã¦äºæãã¦ããåã¨ç°ãªãåã®è¿ãå¤ãè¿ããããã«ãé害ãçºçãããªãã¦äºãããã¾ã (ãããªäºããããï¼ã¨æãããããã¾ããã Python ã®å ´ååºã使ããã¦ããã©ã¤ãã©ãªã§ããã®ãããªæ¯ãèãããããã®ã¯å½ããåã®ããã«åå¨ãã¾ã)ããããã¯éçåä»ãè¨èªã§ããã°å®è¡ããããåã®æ®µéã§ç¶²ç¾ çã«ã³ã³ãã©ããã§ãã¯ãã¦ãããäºã«å¯¾ãã¦ããããããã¹ãã§èªåèªèº«ã§ãã¹ããæ¸ãã¦å®è¡æã«æ°ã¥ããªãã¨ããã¾ãããã¾ãã¦ãæ¬çªç°å¢ã§åã¾ããã§åé¡ãèµ·ãããªãã¦äºã¯éçåä»ãè¨èªã§ããã°çµ¶å¯¾ã«ãããã¾ããã
ã§ã¯ãããã®åé¡ããã¹ãã§é²ããï¼ã¨ãªãããããã¾ãããããããªããåçåä»ãè¨èªã«ããããã¹ãã¨ããã®ã¯ãã©ãã ããã¹ãã±ã¼ã¹ãå¢ããã«ãã¬ãã¸ãä¸ããã¨ããã§ãæ¬è³ªçã«ã¯å
¨ãç¶²ç¾
çã§ã¯ãªããæ¬å½ã«ããããä¸é¨ã®äºããä¿è¨¼ãã¦ããã¾ãããããã¯ä½æ
ã§ããããï¼åçåä»ãã«ããããã¹ããä¾ãã°é¢æ°ã®ãã¹ãã®å ´åãæ¸¡ããã弿°ã®åã®å¯è½æ§ãç¡éã«åå¨ããããã¦ãã®ããä¸é¨ã®ã±ã¼ã¹ãæ£ããåä½ããäºããä¿è¨¼ãã¦ããã«éããªãããã§ãããã¹ãã¯æ£å¸¸ç³»ã«ããç°å¸¸ç³»ã«ãããæ³å®ãã¦ããç¶æ³ã§ãæ³å®ããå
¥åãä¸ããæã«ãæå¾
ããçããè¿ã£ã¦ãããäºãä¿è¨¼ãããã®ã§ãããåçåä»ãè¨èªã¯ãæ³å®ãã¦ããªãç¶æ³ããããã¯æ³å®ãã¦ããªãå
¥åããä¸ããããå¯è½æ§ãä½1ã¤æé¤ã§ãã¾ãããä½ãä¿è¨¼ããªãããã§ããå
ã»ã©ãè¿°ã¹ãéããå®è³ªå
¨ã¦ã any ã void* ã«ç¸å½ãã¾ããããããªã®ã§ã©ãã ãé å¼µã£ã¦ãã¹ããæ¸ããã¨ããã§ãããã¯ä½ãä¿è¨¼ããªãä¸ã§ãããä¸é¨ã®æ³å®ãããããã¿ã¼ã³ãåé¡ãªããã確èªãã¦ããã«éããªãã®ã§ããé常ã«è¦ããã
ãã¡ãã弿°ã§åãåã£ãå¤ããªãã¸ã§ã¯ããªã©ã®åãå³å¯ã«ãã§ãã¯ããã°ã§ããªãããªãã§ãã (ããããã·ã§ããã¬ã³ãã¼ã·ã³ã°ã¨å¼ã°ããã¢ã³ããã¿ã¼ã³)ããããªäºãããªãæåããéçåä»ãã使ã£ã¦ã³ã³ãã¤ã©ã«é ¼ã£ãã»ããå®å ¨ã§ç¶²ç¾ çã§ããã¤å®ä¸ããã§ãããã¾ããéçåä»ãè¨èªã¯å¤ãã®äºæãã³ã³ãã¤ã«æã«ä¿è¨¼ãã¦ããã¾ãã
æè¿ã 㨠AI ã«ã³ã¼ãæ¸ããããã¨ãæµè¡ã£ã¦ãã¾ããããããã AI ã«æ¸ãããã³ã¼ããã©ã®ããã«ä¿¡é ¼ããã®ã§ããããï¼ããã¯ãåãã¨ããã¹ããã§ããããã¹ããã®ã¿ã§ã¯çæè½ã¡ãè¯ãã¨ããã§ããåè¿°ã®éããåçåä»ãè¨èªã«ããããã¹ãã§ã¯ãä½ãä¿è¨¼ã§ããªãä¸ã§ãæ¬å½ã«ããä¸é¨ã®äºãä¿è¨¼ããä»çµã¿ãã«éããªãã®ã§ãããã
GUI ã®ãã¹ãã¯ã¾ãäºæ ãå¥ã§ããã©ãï¼
ã·ãªã¢ã©ã¤ãºé¢
ã·ãªã¢ã©ã¤ãº/ãã·ãªã¢ã©ã¤ãºã¯ãµã¼ãã¹ãæ§ç¯ããä¸ã§é¿ãã¦ã¯éãã¾ããã ã·ãªã¢ã©ã¤ãº/ãã·ãªã¢ã©ã¤ãºé¢ã§ãéçåä»ãè¨èªã§ããäºã¯å¤ãã®ã¡ãªãããåå¨ãã¾ãã
ãã¨ãã°ä»¥ä¸ã®ãã㪠JSON ããã£ãã¨ãã¾ãããã
{ "id": "ae5ca30d-8f05-480b-97d2-9cae8ed455aa", "blogUri": "https://blog.neno.dev", "dateTime": "2025-02-08T10:15:45.2658564Z", "intValue": 99 }
JSON ã® primitive type 㯠string, number, boolean, null ãããªãã®ã§ãå½ç¶ãªããä¸è¨ã® JSON ã® id, blogUrl, dateTime ã®ã¡ã³ãã®å¤ã®å㯠string ã§ããã§ããå®éã®ã¨ãããstring ã®å¤ã¯ä¸è¨ã®ããã« UUID, URI, DateTime ãªã©ã®å¤ãæå¾ ãããäºãé常ã«å¤ãã§ããããããã·ãªã¢ã©ã¤ãºãããæ®µéã§åãªã string ã ã¨é常ã«ä¸ä¾¿ã§ããã¾ã intValue 㯠int ã§ããäºãæå¾ ããã¾ãããJSON ã® primitive åã«ã¯ number åããåå¨ããªãããããã·ãªã¢ã©ã¤ãºãããã¿ã¤ãã³ã°ã§ number ã ã¨ä¸ä¾¿ã§ããint ãªãã ã float ãªãã ãããããªãã¦ãããã¨ããã
ãã¦ãC# ã§ã¯ã©ã®ããã«ãã·ãªã¢ã©ã¤ãºããã§ããããï¼ ã¾ã C# ã®åã¯ä»¥ä¸ã®ããã«å®ç¾©ãã¾ãã ããã§ string åã®ããããã£ã¯åå¨ãããGuid, Uri, DateTimeOffsetãªã©ã®ä½ã表ç¾ãã¦ãããä¸ç®çç¶ãªåã®ã¿ã使ããã¦ããäºã«æ³¨ç®ãã¦ãã ããã
class C { // Guid 㯠UUID ç¸å½ã®å public required Guid Id { get; init; } [JsonPropertyName("blogUri")] public required Uri Uri { get; init; } public required DateTimeOffset DateTime { get; init; } public required int IntValue { get; init; } }
ããã¦ãã®åã使ããå ã»ã©ã® JSON ãæ¬¡ã®ããã«ãã·ãªã¢ã©ã¤ãºã§ãã¾ãã
var json = """ { "id": "ae5ca30d-8f05-480b-97d2-9cae8ed455aa", "blogUri": "https://blog.neno.dev", "dateTime": "2025-02-08T10:15:45.2658564Z", "intValue": 99 } """; // C# ã®æ¨æºã©ã¤ãã©ãªã«ã¯ JsonSerializer ãåå¨ãã var c = JsonSerializer.Deserialize<C>(json, JsonSerializerOptions.Web);
åçåä»ãã ã¨ãã·ãªã¢ã©ã¤ãºããã ãã§ã¯ JSON ã® primitive type ã§ãã string, number, boolean, null ã®ããããã«ãããã³ã°ãããã ãã§ãããC# ã§ã¯ãã·ãªã¢ã©ã¤ãºããã¿ã¤ãã³ã°ã§å®ç¾©ããåã«å¾ããstring 以å¤ã®é©åãªå (Guid, Uri, DateTimeOffset çã
) ã«ãããã³ã°ããã¾ããå¬ããã
éã« JSON ãæå¾ ããå½¢å¼ã§ã¯ãªãå ´åã¯ããã·ãªã¢ã©ã¤ãºã«å¤±æãã¾ãããã®ããããã·ãªã¢ã©ã¤ãºãæåããæç¹ã§ãã·ãªã¢ã©ã¤ãºããããªãã¸ã§ã¯ãã¯æå¾ ãããã©ã¼ãããã§ããäºãä¿è¨¼ããã¾ããå¬ããã
var json = """ { "id": "hoge", "blogUri": "huga", "dateTime": "piyo", "intValue": 3.14 } """; // class C ã¨åãåããªãã®ã§ãã·ãªã¢ã©ã¤ãºã«å¤±æããã // ä»åã®ä¾ã¯å ¨ã¦ã® JSON ã®ã¡ã³ã㨠C# ã®åãä¸è´ããªããã // JSON ã®ã¡ã³ãã®ãã¡ã®ä¸ã¤ã®ã¡ã³ãã§ã C# ã®åã¨ä¸è´ããªãã£ãã失æããã var c = JsonSerializer.Deserialize<C>(json, JsonSerializerOptions.Web);
ã¾ããJSON ãã·ãªã¢ã©ã¤ãº/ãã·ãªã¢ã©ã¤ãºããéãJSON ã®ã¡ã³ãå㨠C# ã®ããããã£åãä¸è´ãããããªãæãã¼ã¡ã¼ã¡ããã¾ãããã®ãããªå ´å㯠[JsonPropertyName("blogUri")] ã®ãããªå½¢ã§ attribute ãããããã£ã«ã¢ããã¼ã·ã§ã³ãã¦ãããã°ã·ãªã¢ã©ã¤ãº/ãã·ãªã¢ã©ã¤ãºããéã«ã¯å¥ã®ååãä¸ããäºãã§ãã¾ãã
ã¾ã C# ã®ãªãã¸ã§ã¯ãã«ããéããã®ããããã£ã¯å¿
é ã ãã¨ãããã®ãåå¨ããã§ãããããã®ãããªå ´å㯠required ãã¼ã¯ã¼ããç¨ãã¾ããä¾ãã°ä»¥ä¸ã®ããã« class C ã®ãªãã¸ã§ã¯ãã new ã§ããã®ã§ãããããã«ãã required ãã¼ã¯ã¼ããä»ããããããã£ããªãã¸ã§ã¯ãã«åæåæã«ãã®ããããã£ãåæåããäºã義åä»ãããã¾ãã
var c = new C { // required keyword ãå®ç¾©ã«å«ã¾ãã¦ããã®ã§ã // ã©ããä¸ã¤ã§ã new ããéã«ä¸è¶³ãã¦ããã¨ã³ã³ãã¤ã«ã¨ã©ã¼ Id = Guid.NewGuid(), Uri = new Uri("https://blog.neno.dev"), DateTime = DateTimeOffset.UtcNow, IntValue = 99 };
ãã® required keyword ã¯ãã·ãªã¢ã©ã¤ãºé¢ã§ãå¬ããäºãããã¾ããããã¯ãrequired keyword ãä»ãã¦ããããããã£ã JSON ã«åå¨ããäºãä¿è¨¼ãã¦ããã¾ãããã¨ãã°ã以ä¸ã®ããã« required keyword ãä»ãã¦ã C# ã®ããããã£ã«å¯¾å¿ãã JSON ã®ã¡ã³ããåå¨ããªãå ´åããã·ãªã¢ã©ã¤ãºã«å¤±æãã¾ãã
var json = """ { "id": "ae5ca30d-8f05-480b-97d2-9cae8ed455aa" } """; // required keyword ãå®ç¾©ã«å«ã¾ãã¦ããããããã£ã JSON ã®ã¡ã³ãã«åå¨ããªãã®ã§ã // ãã·ãªã¢ã©ã¤ãºã«å¤±æããã // required keyword ãåå¨ããªããã°ããã·ãªã¢ã©ã¤ãºã¯æåããã var c2 = JsonSerializer.Deserialize<C>(json, JsonSerializerOptions.Web);
ãã®ããã«ãã·ãªã¢ã©ã¤ãº/ãã·ãªã¢ã©ã¤ãºé¢ã§ C# ãéçåä»ãã§ããäºã«ã¯ã¡ãªãããçãã¾ãã
ä»åã®ä¾ã§ã¯ãGuid, Uri, DateTimeOffset, int ãªã©ã¯æ¨æºã©ã¤ãã©ãªã«å«ã¾ããåã primitive åã§ãããå¿è«ã¦ã¼ã¶å®ç¾©åã§ãåæ§ã«ãã·ãªã¢ã©ã¤ãºæã«é©åã§ãªããã°å¼¾ãããã«åºæ¥ããããã¾ãããã¨ãã° PostCode ã®ãããªéµä¾¿çªå·ã表ç¾ããåãå®ç¾©ããJSON ã®ã¡ã³ãã®åã string ã§éµä¾¿çªå·ã®ãã©ã¼ãããã«å¾ã£ã string ã§ã¯ãªãå ´åã¯ãã·ãªã¢ã©ã¤ãºã§å¤±æããããã«ãããçã§ãã
ããã³ãã¨ã³ãçéã ã¨æè¿ Zod çã®ã©ã¤ãã©ãªãæµè¡ã£ã¦ããããã®ãããªã©ã¤ãã©ãªã ã¨èªãã¹ãã¼ãå®ç¾©ã®ãªãã¸ã§ã¯ãã使ããã·ãªã¢ã©ã¤ãºå¾ã®ãªãã¸ã§ã¯ãããã¼ã¹ãã...ãªã©ãè¡ãå¿ è¦ãããã¾ãããC# ã§ããã°åãå®ç¾©ããç´ æ´ã«ãã·ãªã¢ã©ã¤ãºããäºã§åãä¿è¨¼ã§ãã¾ãã ãªã Zod ãå¦å®ãã¦ããããã§ã¯ããã¾ããããããããã³ãã¨ã³ãã«ãã㦠Zod + Form ç³»ã©ã¤ãã©ãªã®ã¤ã³ãã°ã¬ã¼ã·ã§ã³ã¯ããªã便å©ã ã¨æãã¦ãã¾ãããã ããã¯ã¨ã³ãã§ãããã Zod çã使ããªãæåããéçåä»ãè¨èªã§æ¸ãããã®ã¡ãªããã享åããæ¹ãããã®ã§ã¯ãªãã§ãããããåã¯å¥ã«ã·ãªã¢ã©ã¤ãº/ãã·ãªã¢ã©ã¤ãºé¢ã ãã§ãªããä»ã®ãã¾ãã¾ãªé¢ã§å½¹ç«ã¡ã¾ãããã
ã¡ãªã¿ã«ãè¨è¿°éãå¤ããï¼ã¨æã£ãããã®ããªãã
å¾è¿°ã® record ã使ãã°è¨è¿°éãæ¸ãããããç°¡åã«æ¸ããã¨ãåºæ¥ã¾ãã
var json = """ { "id": "ae5ca30d-8f05-480b-97d2-9cae8ed455aa", "blogUri": "https://blog.neno.dev", "dateTime": "2025-02-08T10:15:45.2658564Z", "intValue": 99 } """; _ = JsonSerializer.Deserialize<C>(json, JsonSerializerOptions.Web); var c = new C( Guid.NewGuid(), new Uri("https://blog.neno.dev"), DateTimeOffset.UtcNow, 99 ); _ = JsonSerializer.Serialize(c, JsonSerializerOptions.Web); // class ã§ã¯ãªã record ã¨ãããã¼ã¯ã¼ãã使ããã¦ããäºã«æ³¨ç® // record ã«ã¤ãã¦ã¯å¾è¿° record C( Guid Id, [property:JsonPropertyName("blogUri")] Uri Uri, DateTimeOffset DateTime, int IntValue );
å¤å (struct) ã¨åç §å (class)
C# ã¯å¤å (struct) ã¨åç
§å (class) ãæç¢ºã«åºå¥ãã¾ããC++er ãªããã¯ä¸çªæ°ã«ãªããã¤ã³ãã ã£ããããããããã¾ãããC# ã§ã¯ã¦ã¼ã¶å®ç¾©åãå¤åã¨ãã¦å®ç¾©å¯è½ã§ããããã¯ããã©ã¼ãã³ã¹ãåºãä¸ã§æ¥µãã¦éè¦ã§ããåç
§åã¯å¿
ããã¼ãã«ãªãã¸ã§ã¯ãã使ãããããGC ã§ååãããã´ããçºçãã¦ãã¾ãããã§ãããç¾ä»£ã® C# ã® GC ã¯æ¥µãã¦é«éã§ãããGC ã«ä½è¨ãªä»äºãããªãæ¹ãæ©ãã®ã¯æãããå¿è«ãå¤åã¯å¥ã®å¤æ°ã«ä»£å
¥ãããã¨ã³ãã¼ãçºçããã®ã§ã巨大ãªå¤åãæ¥µåå®ç¾©ããªãã¨ãã巨大ãªå¤åããã©ã¡ã¼ã¿ã¨ãã¦æ¸¡ãã¨ãã«ã³ãã¼ãçºçããªãããã« ref keyword ãç¨ãã¦åç
§ã渡ãããã«ããããboxing ãèµ·ãããªãããã«ãããªã©ãå®è£
䏿°ãä»ããå¿
è¦ã¯ããããããã¾ãããããã®ãããã¯ããã©ã¼ãã³ã¹ãåºãããã«å¿
è¦ãªäºã§ããåçç¡ç¨ã§å
¨ã¦ã®ãªãã¸ã§ã¯ãããã¼ãã«ç¢ºä¿ãããç¡é§ã« GC ã«ååãããã´ããçºçãã¦ãã¾ãäºã®æ¹ãè¾ããè¾ãã®ã§ãã
C# 以å¤ã®è¨èªãä¾ãã° C# ã¨ä¼¼ãè¨èªã¨ãã¦ããæãããã Java ã§ã¯ (æ¸ãå³ãããã¦å ¨ç¶éããã§ããã©ã...!)ãprimitive type ããå¤åã§ã¯ããã¾ããã ã¦ã¼ã¶å®ç¾©ã®å¤åãå®ç¾©ããäºã¯ã§ãã¾ãããè¾ããå ã㦠Java ã® generics 㯠object (åç §å) ã¨ãã¦ããæ±ããªããã (type erasure ã«ãã£ã¦å®è¡æåæ å ±ãåããªãï¼)ãprimitive type ã ããã¨ä½ã ããã¨åçç¡ç¨ã§å¿ ã boxing ãçºçãã¦ãã¾ãã¾ãããã®è¾ºã㯠JVM ã® JIT ææé©åã§ããã©ã¼ãã³ã¹å£åããªãããã«é å¼µã£ã¦ããæ¨¡æ§ã§ãããè¾ããã®ã¯è¾ãã
åçåä»ãè¨èªã¯è¨ãã¾ã§ããªããã¦ã¼ã¶å®ç¾©åã¯å ¨ã¦åç §åã¨ãã¦æ±ããããããä¸è¦ãªã´ãããããªãã«çºçã GC ã«è² æ ããããäºã«ãªã£ã¦ãã¾ããããã©ã¼ãã³ã¹ã«æªå½±é¿ãåã¼ãã¾ããè¾ããã¾ããã
ref struct
ããã«ç¾ä»£ã® C# ã§ã¯ãref struct ã¨ããã絶対ã«ã¹ã¿ãã¯ã«ã®ã¿åå¨ããäºããã§ããªã (=ã©ããªå½¢ã§ãããã¨çµ¶å¯¾ã«ãã¼ãã«æã¡åºããªã) åãåå¨ãã¾ãã ã¹ã¿ãã¯ã«ã®ã¿åå¨ããäºã許ããããã¼ãã«åå¨ããäºã許ãããªãã¨ããäºã¯ãGC ã§ååãããã´ãã«ãªããªãã¨ããäºã§ããããããé§ä½¿ããäºã§ãããã©ã¼ãã³ã¹ãåä¸ãããäºãã§ãã¾ããç¾ä»£ã® C# ã®ããã©ã¼ãã³ã¹ãåªãã¦ããã®ã¯ runtime, web ãã¬ã¼ã ã¯ã¼ã¯ã¨ãã« ref struct ãé§ä½¿ããã¦ããäºã1ã¤ã®è¦å ã ã£ãããã¾ããããã«ãã³ã¬ã¯ã·ã§ã³ãè¦ç´ æ°ãå°ãããã°ãã¼ãã§ã¯ãªãã¹ã¿ãã¯ã«ç¢ºä¿å¯è½ãªã®ã§ã´ããåºã¾ããã
record class/struct
2000年代ã¯ãªãã¸ã§ã¯ãæåå ¨çã§ããããããä»ç¾å¨ã¯ã©ãã§ããããï¼ç¹ã«ããã¯ã¨ã³ãã
äºåã«äºé²ç·è²¼ã£ã¦ããã¨ããªãã¸ã§ã¯ãæåã¯å ¨ãæªããã®ã§ã¯ããã¾ããããã¬ã¼ã ã¯ã¼ã¯ãã©ã¤ãã©ãªãªããã®å®è£ ã«ã¯ä»ããªãå¤ãããå¼·åãªèãæ¹ã§ãããªãã¸ã§ã¯ãæåã«ã¯å¹¾ã¤ãã®å´é¢ãããã¾ãããæãéè¦ãªã®ã¯ãå é¨ã®ç¶æ ãé è½ãã¦æ¯ãèããå ¬éããããã¨ã«ããã§ããã (ãããã«ãã»ã«åã¨ããããã§ããæ¬¡ç¹ã§å¤§äºãªã®ã¯å¤æ æ§ã¨å¼ã°ãããã®ã§ããã)ãããããªããç¾ä»£ã®ã¢ããªã±ã¼ã·ã§ã³ãç¹ã«ããã¯ã¨ã³ãã«ããã¦ã¯ãJSON ãªã©ã®ãã¼ã¿ãã©ããããåãåãããããããããå¦çãã¦ã DB ã«æ¸ãè¾¼ãã ããä»ã®ãµã¼ãã¹ã«ã·ãªã¢ã©ã¤ãºãã¦æãããããã¦ä¸é£ã®ãã©ã³ã¶ã¯ã·ã§ã³ãå®çµãããããã§ãããªã®ã§ãå é¨ã®ç¶æ ãé è½ãã¦æ¯ãèããå ¬éãããã¨ããèãæ¹ãããããããããã¼ã¿ (ã¡ãã»ã¼ã¸) ã¨ãã¸ã㯠(ãµã¼ãã¹) ã§ããããã³ã¼ããåé¢ãããã¼ã¿ã¯é è½ããã«ç´ æ´ã«è¡¨ç¾ãããæ¹ãä½ãã¨çè§£ããããã®ã§ããã¨ã¾ããããç¾å¨æµè¡ãã®ãã¼ã¿æåããã°ã©ãã³ã°ã¨å¼ã°ãããã®ã®æ£ä½ãªããã§ãã
C# ããã®ãã¼ã¿æåããã°ã©ãã³ã°ã®æµãã«ã®ã£ã¦ãã¾ããã¨ããããã§ C# ã«ã¯ãã¼ã¿åã表ç¾ããããã« record ã¨ããè¨èªæ©è½ãåå¨ãã¾ããä½¿ãæ¹ã¯ä»¥ä¸ã®éãã
// class keyword ã§ã¯ãªã record keyword ãç¨ããã // MyData1 ã¯åç §åã // 以ä¸ã®ãããªè¨æ³ã primary constructor ã¨å¼ã³ã // MyData1 㯠Value ã¨ããããããã£ãæã¤ã record MyData1(int Value); // primary constructor ã使ãã以ä¸ã®ããã« // ç´æ¥ããããã£ãå®ç¾©ãã¦ã OKã // MyData1 ã¨ã¯ãªãã¸ã§ã¯ãã®åæåã®æ¸ãã£ã·ããç°ãªãã // ãã以å¤ã®æåã¯ã»ã¼åãã record MyData2 { public required int Value { get; init; } } // class ãä»ããäºãå¯è½ã // åã« record ã¨æ¸ãã®ã¨æå³ã¯åãã record class MyData3(int Value); // åç §åã§ã¯ãªãå¤åããããã° record struct ã¨æ¸ãã record struct MyData4(int Value); // struct ã®å ´å㯠readonly 修飾ãå¯è½ã // struct ã®å ´åãåºæ¬çã«ã¯ readonly 修飾ã¯ã¤ãã¦ããäºãæ¨å¥¨ã readonly record struct MyData5(int Value);
record ãå¬ããã®ã¯ãã®ã¤ã³ã¹ã¿ã³ã¹ããã¼ã¿ã¨ãã¦æ±ãããããã«ãªãäºã§ãã
ããã¯ã©ãããäºãã¨ããã¨ãæ®éã® class ã§æ¯è¼ãããå ´åãç¹ã«ä½ãããªããã° (ä¾ãã°== æ¼ç®åã®ãªã¼ãã¼ãã¼ããããªã©ããªããã°) åç
§æ¯è¼ã«ãªã䏿¹ã§ãrecord ã®å ´åã¯ãã¼ã¿ã¨ãã¦çããããã¤ã¾ãå
é¨ã«æ±ãã¦ãããã¼ã¿ãå
¨ã¦ä¸è´ãã¦ããããã¨ããå½¢ã§æ¯è¼ãããããã«ãªãã¾ãã
var c1 = new C(99); var c2 = new C(99); // åç §æ¯è¼ Console.WriteLine(c1 == c2); // false var r1 = new R(99); var r2 = new R(99); // å é¨ã®ãã¼ã¿ Console.WriteLine(r1 == r2); // true class C { public int Value { get; } = value; public C(int value) { Value = value; } } record R(int Value);
å¿è«ãrecord ã使ããã¨ã record ã¨åæ§ã®æåãé常㮠class ã§å®ç¾ããäºã¯å½ç¶ã§ããã®ã§ãã (å®é record ãç»å ´ãã C# 8.0 以åã¯ãã®ããã®å®è£ ãããããææ¸ããã¦ãã¾ãã)ãçµæ§æéããããã¾ããrecord ã使ãäºã§ãã®ãããã®æéããè§£æ¾ãããããã§ããããã¦ãrecord ã使ãäºã§å®è£ çã«ããã¼ã¿ã¨ãã¦æ±ããã ãã§ãªããrecord 㨠class ã使ãåããäºã§ãæå³çã«ããã¼ã¿ã¨ãã¸ãã¯ã®åãåé¢ãã¦è¡¨ç¾ããäºãã§ããããã«ãªãã¾ãããç¾ä»£ã®ãã¼ã¿æåããã°ã©ãã³ã°ãæé©ãªããã¯ã¨ã³ãã®ãã¸ãã¹ãã¸ãã¯ã®å®è£ çã«ã¯é常ã«ããããããã§ããã¾ããrecord ã使ãäºã§è¾æ¸ã®ãã¼ãªããã容æã«ä½æã§ããã®ã§ç´ æ´ãªå®è£ é¢ã«ããã¦ãé常ã«å¿«é©ã§ãã
åéããã¦æ¬²ãããªãã®ã§ããä¸åº¦ããã¾ãããå¥ã«ãªãã¸ã§ã¯ãæåã¯å ¨ãæªããã®ã§ã¯ããã¾ãããããã¡ãã£ã¨ããã¨ããã¼ã¿æåããã°ã©ãã³ã°ã¯ãªãã¸ã§ã¯ãæåããã°ã©ãã³ã°ã«å®å ¨ã«ç½®ãæãããããªãã®ã§ã¯ããã¾ãããããããè¯ãæªãèãã¦ä½¿ãåããã¨è¯ãã§ããããçµå±èªåã®é ã§èãã¦ãç¶æ³ã«å¿ã㦠not for me ã¨èãããçªã£ã±ããã°ããããçªã£ã±ããä»ãªãã®ã§ãããªãã¸ã§ã¯ãæåãæç§æ¸çã«æ£ãããã©ããã¿ãããªäºã°ããèããæç§æ¸çã«æ£ãããããã¨é å¼µã£ã¦å®è£ ãããã¨ãã¦ãã人ãè¦ããã§ããå°è±¡ãããã¾ããèªåã®é ã§ããããèãã¾ããã (AI ã«ãã®ãããä»»ãã¦ãè¯ãäºãªãã¨æãã¾ã)ã
Null å®å ¨
C# 㯠(ã»ã¼) null å®å ¨ãªè¨èªã§ãã
ãããããªã®ï¼ã¨æãæ¹ãããããããã¾ãããå®é C# ã¯ãã¨ã㨠null å®å ¨ãªè¨èªã§ã¯ãªãã£ãã®ã§ãããC# 8.0 ã®æç¹ã§ nullable reference type ã¨ããæ©è½ãå°å ¥ãããnull å®å ¨ãªè¨èªã«ãªãã¾ãããã¡ãªã¿ã«è¨äºå ¬éæç¹ (2025-04) ã®ææ°ã¯ C# 13 ã§ãããããã null å®å ¨ã«ãªã£ã¦ãã 6 年以ä¸çµã£ã¦ãã¾ãã
ç°¡åã«ã¯ã以ä¸ã®ãããªå½¢ã§ã?ã ãä»ããªã㨠null ãä»£å ¥ããäºã¯è¨±å®¹ããã¾ããã
// ã³ã³ãã¤ã©ã«æãããªã (? ãã¤ãã¦ãããã) string? hoge = null; // ã³ã³ãã¤ã©ã«æããã (? ãã¤ãã¦ããªããã) string piyo = null;
ãªã C# ã® null å®å ¨ã¯ããã¼è§£æãã¼ã¹ã®ãã®ã«ãªã£ã¦ãã¾ãããã®è¾ºãã¯åã Microsoft ãéçºãã¦ãã TypeScript ãããã¼è§£æã«ãã£ã¦ãã¾ãã¾ãªè¨èªæ©è½ãå®ç¾ãã¦ãããnull å®å ¨ãããã¼è§£æã«ãã£ã¦æ ä¿ãã¦ãã¾ããC# ã«ã¯ãã®ãããã® TypeScript å´ã®æè¡ãè¼¸å ¥ãããå½¢ã§ããã
ãã¦ã(ã»ã¼) null å®å ¨ã¨æ¸ããã®ã¯ããã¼è§£æãã¼ã¹ã ããã§ãããTypeScript ãåæ§ã§ãããããã¼è§£æã¯ãããããªå½¢ã§æ¡ãã¤ã¶ãããã³ã³ãã¤ã©ãã¡ããã¾ããäºã¯ã§ããã®ã§ãå³å¯ã« null å®å ¨ã¨ãã£ã¦ããã®ãï¼ã¨ããã¨ã©ããªããããããã¨ããæããªã®ã§ä¸å¿ ã(ã»ã¼)ã ã¨ãã修飾 (?) ãä»ãã¦ãã¾ããããã¯çµé¨ãã¼ã¹ã«ãªã£ã¦ãã¾ãã¾ãããnullable reference type ãå°å ¥ããã¦ä»¥éã¬ãã½ã¯è¦ã¦ããªãã®ã§ãnull å®å ¨ã¨è¨ãåã£ã¦ãå·®ãæ¯ããªãæ°ããã¾ãã
éåæ
並å並è¡åãããéåæã¨ã®éãã¯å ¨ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ãç´é¢ããåé¡ã§ãããã㦠C# ã¯æããéåæã¨ã®éãã¨çå£ã«åãåã£ã¦ããè¨èªã§ãããå®ã¯éå»ãæ¯ãè¿ã£ã¦ã¿ãã¨å¸¸ã«ããããè¨èªã®ä¸ã§å 端ãèµ°ã£ã¦ããè¨èªã ã£ãããã¾ãã
ã²ã¨æåä¸ä¸ã風é¡ããããããè¨èªã«æ³¢åãã Reactive Extensions (Rx) ã®å ç¥ã¯ C# ã ã£ãããã¾ããããã¦ç¾ä»£ã§ã¯å½ããåã¨ãªããã¾ãã¾ãªè¨èªã«å®è£ ããã¦ãã async/await ããã¯ãå ç¥ã¯ C# ã ã£ãããã¾ããC# ã« async/await ãå ¥ã£ãã®ã¯ C# 5ãææçã«ã¯ 2012 å¹´ã¨ä»ã¨ãªã£ã¦ã¯çµæ§æã®è©±ãªã®ã§ãããã ããã¨è¨ã£ã¦å¤ã³ã¦ããããã§ã¯ãªããç¾ä»£ã§ã async/await ã«é¢ããæ¹åã¯ç±å¿ã«è¡ããã¦ãããæ¹åããç¶ãããã©ã¼ãã³ã¹ã¯åä¸ã®ä¸éããã©ã£ã¦ãã¾ããéå»ãããã£ãã ãã§ãªããç¾å¨ããããã§ãããç¾å¨é²è¡å½¢ã§ãã¾ãã¾ãªå½¢ã§æ¹åãè¡ããã¦ãã¾ãã
ãã¡ããåã«æ¸ãå¿å°ãããã ãã§ãªãã使ãåæãè¯ãã§ããç¾ä»£ã®ãã·ã³ã¯åºæ¬çã«ãã«ãã³ã¢ã»ãã«ãã¹ã¬ããã§åä½ãã¾ãããã並åã§å®è¡ã㦠CPU ãé
·ä½¿ããããªãã¾ãããããªæã¯ Task.Run() ãç¨ã㦠ThreadPool ã« job ããã£ã¹ãããããäºãã§ãã¾ãããã£ãããã ãã§ CPU ãé
·ä½¿ã§ãã¾ãããã㦠CPU ãé
·ä½¿ãã¦å¾ãããè¨ç®çµæãªã©ãããã£ã¨ await ã§å¾
æ©ãããããã®è¨ç®çµæãåå¾ã§ãã¾ãã便å©ã
var cts = new CancellationTokenSource(); // å®éã«ã¯è¨ç®ãéããå¦çã Task.Run ã«æãã var t1 = Task.Run(() => 1 + 2, cts.Token); var t2 = Task.Run(() => 3 + 4, cts.Token); // å¥ã® thread ã«æãã job ãå®äºããã®ãç°¡åã«å¾ æ©å¯è½ var results = await Task.WhenAll(t1, t2);
éåæ IO ã«ã¤ãã¦ãå¹ççã§ããC# ã§ã¯éåæ IO ãè¡ã£ãéãéåæ IO ãçããã¹ã¬ããã¯å³åº§ã«éæ¾ããããã®ã¹ã¬ããã¯ä»ã®ã¹ã±ã¸ã¥ã¼ãªã³ã°ããã¦ããè¨ç®å¦çãèµ°ãã¾ãããã®ããã¹ã¬ãããç¡é§ã«ãªãäºã¯ããã¾ãããããã¦éåæ IO ãå®äºããå ´åãç¶ç¶ã®å¦ç (await 以éã®å¦ç) ãã¹ã±ã¸ã¥ã¼ãªã³ã°ãããã©ããã®ã¹ã¬ããã§å®è¡ãããäºã«ãªãã¾ããC# ã®éåæ IO ã«ã¤ãã¦è©³ããç¥ãããæ¹ã¯ãã¡ãã®è¨äºãåç §ãã¦ãã ããã
ã¾ãéåæãè¡ãä¸ã§ããã£ã³ã»ã«ã®ä»çµã¿ã¯å¿
è¦ä¸å¯æ¬ ã§ããC# ã§ã¯éåæå¦çãè¡ã API ã«ã¯çµ±ä¸çã«ãã£ã³ã»ã«ããä»çµã¿ã¨ã㦠CancellationToken ã¨ããåãåå¨ãã¾ããéåæå¦çãè¡ã API ã«ã¯ãã¹ã¦ CancellationToken ã¨ãããã£ã³ã»ã«ããããã®ãã¼ã¯ã³ãæããããããã«ãªã£ã¦ãã¾ããä¸è¨ã®ä¾ã§ç»å ´ãã¦ããCancellationTokenSource 㯠CancellationToken ãä½ãããã®ä»£ç©ã§ãcts.Token ã®åã CancellationToken ã¨ãªã£ã¦ãã¾ãããªã C# ã® web framework ã§ããã¨ããã® ASP.NET Core ã§ã¯ TCP ã®ã³ãã¯ã·ã§ã³ãåããããHTTP/2 ã®ãªã¯ã¨ã¹ãã§ããã° RST_FRAME ãã¬ã¼ã ãé£ãã§æ¥ãããã£ã³ã»ã«ãçºç«ãã CancellationToken ããã¬ã¼ã ã¯ã¼ã¯å´ãæä¾ãã¦ããã¾ããã¾ã HttpClient ãµã¤ãã§ããã°ãCancellationToken ãçºç«ããã RST_FRAME ãã¬ã¼ã ããµã¼ãã«é£ãã§ããã¾ãããã®ãããªå½¢ã§ CancellationToken ã使ã£ããã£ã³ã»ã«ã®ä»çµã¿ãæ´ã£ã¦ãã¾ãã
CancellationTokenãæ¸¡ãã使³ã¯ C# ã®æ¨æºã©ã¤ãã©ãªã«éããããã¹ã¦ã® API ãå¾ãã使³ã¨ãªã£ã¦ãããå¸ä¸ã«åºåã£ã¦ãã OSS çã®ã©ã¤ãã©ãªã§ãéåæ API ã§ããã°å¿
ã CancellationToken ãæ¸¡ããããã«ãªã£ã¦ãã¾ããã¨ã³ã·ã¹ãã å
¨ä½ã§çµ±ä¸ããã¦ããããã£ã³ã»ã«ã®ä»çµã¿ããã ãã èããå¿
è¦ãããã¾ãããéå¸¸ã«æå¿«ã§è¯ããã¨ã§ãããããå¸ä¸ã«åºåã£ã¦ããã©ã¤ãã©ãªã®éåæã® API ã CancellationToken ãæ¸¡ããªãå ´åãæ®ã©ã®å ´åå®è£
è
ã®è
ãè¶³ãã¦ããªãã¨ããäºãªã®ã§æ¡ç¨ãè¦éã£ã¦ OK ã§ã (ããã¾ãã« CancellationToken ãæ¸¡ããªãäºãæè¡çã«æ£å½æ§ãèªãããããã®ãåå¨ãã¾ããããããã£ãã©ã¤ãã©ãªã¯å°æ°æ´¾ã§ã)ã
JavaScript ãªã©ã§ã¯è¿å¹´ãããã AbortController ãªã©ã® API ãç»å ´ãã¾ããããC# ã§ã¯ã¯ããæãããã£ã³ã»ã«ã®çµ±ä¸ãããä»çµã¿ãåå¨ãã¦ããããã§ãã (ã¡ãªã¿ã«AbortController 㯠C# ã® CancellationToken ãããªãåèã«ãã¦ããæ¨¡æ§)ã
ã¾ã C# ã® runtime ãæ¨æºã§åãã ThreadPool åã³éåæã©ã³ã¿ã¤ã ã¯éå¸¸ã«æ´ç·´ããã¦ããã使ãããããå¹ççã§ããRust ãªããã¯éåæã©ã³ã¿ã¤ã ãæ¨æºã§ç¨æããã¦ããããå ¬å¼ã§ã¯ãªã OSS ãå©ç¨ããå¿ è¦ããã£ãããã¾ã (Rust ãçµã¿è¾¼ã¿ãªã©ã§ä½¿ãããäºãæ³å®ãã¦ããäºãèããã¨ããã®ãããªä»çµã¿ã«ãªã£ã¦ããæå³ã¯çè§£ã§ãã¾ãã...)ãæ¨æºã§åªãããã®ãéåæã©ã³ã¿ã¤ã ãå å ããã¦ããã®ã¯å¬ããããã¡ãã C# ã§ãã«ã¹ã¿ã ã®éåæã©ã³ã¿ã¤ã ãå°å ¥ããäºã¯å¯è½ã§ãããã¾ãæ®ã©ã®å ´åä¸è¦ã§ãããã
ã¾ã C# ã§ async/await ã使ãäºã¯å®å
¨ã§ããéã« Python ãªã©ã§ã async/await ã使ãäºã¯å¯è½ã§ãããå²ã¨å±éºã ã£ãããã¾ããå
·ä½çã«ã¯ async/await ã§çµ±ä¸ããªãã¨ãããªãã¨ãããåæ API ã使ã£ã¦ãã¾ãã¨ãããè«çå¶å¾¡ããã¼ã§ç¨ãããã¦ããã¤ã³ã¹ã¿ã³ã¹ãä»ã®è«çå¶å¾¡ããã¼ã§åç
§ãããå¶å¾¡ãçã£ã¦ãã¾ãäºãããã¾ã (以åèåãªã©ã¤ãã©ãªã使ã£ã¦ããéãéçºæã«è»½ãè² è·ããããããã®äºä¾ãè¸ãã§ä¸æãç«ã¦ã¦ãã¾ãããã©ã¤ãã©ãªå
é¨ã§ ContextVar 使ã£ã¦ããã°ãããªäºã«ãªããªãæ°ãããã®ã§ãã...)ãC# ã®å ´åããåæ API ãç¨ããããã¨ãã¦ã CPU å¹çãæªããªãã ãã§ãä»ã®è«çå¶å¾¡ããã¼ã§å®è¡ãã¦ãããã®ãæ¼ãåºãäºã¯ããã¾ãã (C# ã§ã ThreadLocal ã使ãäºã§ãã®ãããªåé¡ãçºçãããäºãã§ãã¾ãããç¾ä»£ã«ãã㦠ThreadLocal ã使ãäºã¯ãã£ã¼ã©ã®äºã§ããªãã¨ãªããæ®ã©ã®è«çå¶å¾¡ããã¼ä¸ããæ¼ããªã AsyncLocal ãç¨ããã®ã§çºçããªãã¨è¨ã£ã¦è¯ãã§ããã)ã
C# ã® async/await ããã«ãã¹ã¬ãããéåæ IO ã«ã¤ãã¦ã¯æè¡çã«è©³ç´°ã㤠deep ã«è§£èª¬ããã¦ããè¨äºãå¥éæ¸ãã¦ããã®ã§ãèå³ãããæ¹ã¯ãã²è¦ãã¦ã¿ã¦ãã ããã
blog.neno.dev blog.neno.dev blog.neno.dev
æ¡å¼µã¡ã½ãã
C# ã«ã¯æ¡å¼µã¡ã½ããã¨ããææ³ãåå¨ãã¾ããC#er ã¯ç大好ããªææ³ã§ããããã¯ã©ã®ãããªææ³ãã¨ããã¨ãä»»æã®åã«ä»»æã®ã¡ã½ãããçãããã¨ãã§ããææ³ã§ãã
ä¾ãã°ã以ä¸ã®ãããªã³ã¼ããæ¸ããã¨ã§ãæ¬æ¥ int ã«ã¯åå¨ããªãã¡ã½ãããå©ãããã«ããäºãã§ãã¾ãã
var value = 99; // IntExtensions.AddSeven(value) ã¨ç価 var value2 = value.AddSeven(); Console.WriteLine(value2); // 106 // æ¡å¼µã¡ã½ãããå®ç¾©ãã class 㯠static class ã§ããå¿ è¦ãããã // class åã¯ãªãã§ãããããXxxExtensions ã¨ã¤ããã®ãæ £ä¾ã internal static class IntExtensions { // static method ã§ããå¿ è¦ããã // 弿°ã®å é ã« this ãã¤ããã¨æ¡å¼µã¡ã½ããã«ãªã public static int AddSeven(this int value) { return value + 7; } }
æ¡å¼µã¡ã½ããã«ãã£ã¦ãf(obj) ã§ã¯ãªã obj.f() ã¨æ¸ããããã«ãªãããã§ããããã¯æ¸ãã£ã·ãçã«å¬ããã ãã§ã¯ããã¾ããã.(ããã) ãæã¤ãã¨ã§ IDE ã editor ãè£å®åè£ãåºãã¦ãããããã§ããã¡ãªã¿ã«ç¾ä»£ã® C# ã¯æ¡å¼µã¡ã½ããããã¡ããã¡ã夿§ããã¦ãã¾ãã
ãã®æ¡å¼µã¡ã½ããã¯ãã¾ãã¾ãªç¹ã§ã¡ãªããã大ããã§ãã
å ã»ã©ãè¦ãããéãããã¼ã¿åã«ã¯ record ã使ã£ã¦åãå®ç¾©ããããã§ããããã¾ããã¼ã¿åã«å¯¾ãã¦ããããã¡ã½ããã追å ãããããã¾ãããããããå ´åã¯æ¡å¼µã¡ã½ããã®åºçªã§ãã
var character = new Character { Name = "Miorine Rembran", StudentNumber = "LS001", }; var marriedCharacter = character.GetMarried(); // record ã使ã£ã¦ããã¨ãªãã¸ã§ã¯ããæååå (.ToString()) ããæã«ããæãã«ãªã Console.WriteLine(character); // Character { Name = Miorine Rembran, StudentNumber = LS001 } Console.WriteLine(marriedCharacter); // Character { Name = Miorine Mercury, StudentNumber = LS001 } // Character ã¯ã¤ãã¥ã¼ã¿ãã« public record Character { public required string Name { get; init; } public required string StudentNumber { get; init; } } public static class CharacterExtensions { public static Character GetMarried(this Character source) { // with ã使ããã¨ã§ããããã£ã®ä¸é¨ãæ¸ãæãããã¤ã³ã¹ã¿ã³ã¹ãä½ããã return source with { Name = $"{source.Name.Split(' ')[0]} Mercury" }; // ä¸è¨ã® with ã使ã£ãã³ã¼ãã¯ä»¥ä¸ã®ã³ã¼ãã¨ç価 // with ã使ãã¨æ°ããã¤ã³ã¹ã¿ã³ã¹ãä½ããã // return new Character // { // Name = $"{source.Name.Split(' ')[0]} Hosimi", // StudentNumber = source.StudentNumber // }; } }
æ¸ãå¿å°çãªè¦³ç¹ã§ããåºæ¬çã« f(obj) ã§ã¯ãªã obj.f() ã¨æ¸ãããããã§ããããããªããã責åçã« record ãã®ãã®ã«å¯¾ãã¦ã¡ã½ããã追å ããã®ã¯å¥½ã¾ãããªããã¨ãããããªäºã¯é常ã«å¤ãããã§ãããã®ãããªå ´åã«æ¡å¼µã¡ã½ããã¯æ¥µãã¦æå¹ãªææ®µã¨ãªãã¾ãã
ãã®æ¡å¼µã¡ã½ãããå®ã¯ãã¼ã éçºã«ããã¦ãããªãå¬ãããã®ã«ãªã£ã¦ãã¾ããéçºããã¦ããã¨ãã¾ãã¾ãªã¡ã½ãããå®ç¾©ããããã§ããããã¼ã ã§éçºãã¦ããã¨ä¼¼ããããªãã®ãå¥ã®å ´æã«å®è£
ããã¦ãã¾ã£ã¦ããããªãã¦äºã¯ããããäºãªã®ã§ã¯ãªãã§ããããï¼ãã¼ã éçºãã¦ããéã«ã¯èªåãã¡ã®ã³ã¼ããã¼ã¹ãå
¨ã¦ææ¡ããäºã¯ç¾å®çã§ã¯ããã¾ããããè¨è¨ã¨ãã¡ããã¨ãã¦ãã¦ãçãã¦ãã¾ããã®ã¯çãã¦ãã¾ããã®ã§ãããããæ¡å¼µã¡ã½ããã§ã¡ã½ãããå®ç¾©ãã¦ããã°ãobj ã®ãã¨ã« .(ããã) ãæ¼ãã°ä½¿ããã¡ã½ããã®ä¸è¦§ã IDE ä¸ã«è¡¨ç¤ºããã¾ããããä½ã使ããããªï¼ã¨ããã£ã¨çºãã¦æ¢åã®å®è£
ã§ä¼¼ããããªãã®ããªããã確èªããå®è£
ã«å
¥ãäºãã§ãã¾ãããã種ããã¥ã¡ã³ãã®ãããªå½¹å²ãæã£ã¦ããã¨ãã£ã¦ãè¯ãã§ããããã¾ã .(ããã) ãæ¼ããã¨ã«ãã£ã¦è£å®ãã°ã£ã¡ãå¹ãã¾ããããã¿ã¤ãã³ã°ããå¿
è¦ãããã¾ããï¼ãã£ããã
ã¡ãªã¿ã«ãã®æ¡å¼µã¡ã½ãããå¾è¿°ãã C#er ã¯ã¿ããªå¤§å¥½ã㪠LINQ ã¨ããæ©è½ã§ãã¡ããã¡ãå¤ç¨ããã¦ãã¾ããæ¡å¼µã¡ã½ãããå¶ãããã®ã C# ãå¶ããã¨ãã£ã¦ãããã§ãããã
Source Generator
C# ã«ã¯ã³ã³ãã¤ã«æã«ã¦ã¼ã¶ãè¨è¿°ããã³ã¼ããæ§æè§£æã»æå³è§£æããããããã¨ã«ã©ã¤ãã©ãªçãã³ã¼ããçæããæ©è½ãåå¨ãã¾ããããã Source Generator ã§ããç°¡åã«ã¯ä»¥ä¸ã®å³ãããããããã§ãããã

Source Generator ã¯ã³ã³ãã¤ã«æã«ã¦ã¼ã¶ãè¨è¿°ããã³ã¼ãã®ç¹å®ã®é¨åãè¦ã¤ãã¦ãã¦ãããããå¿ è¦ãªã³ã¼ããçæã§ãã¾ããç¹å®ã®é¨åã¨ããã®ã¯ãattribute ã追å ããã¦ãã class ã method ã§ãã£ãããç¹å®ã® method ãå¼ã³åºããã¦ããç®æã ã£ãããã¾ããæ§æè§£æãæå³è§£æããçµæããä»»æã®ç®æãè¦ã¤ãã¦ããäºãã§ããã®ã§ãã ãã¶ããããæ¾é¡ã§ãã¾ããç¾å®çã«ã¯ã大åã® Source Generator ã¯ç¹å®ã® attribute ãä»ä¸ããã¦ããã³ã¼ããæ¢ãã¦ããããèµ·ç¹ã«ä½ãããã®ã³ã¼ããçæãã¾ãã
以ä¸ã®ä¾ã¯ç¾å®çã«ã¯ã¾ãã§æå³ããªãã³ã¼ãã§ããããããªã³ã¼ããæ¸ãã¾ãã
public partial class Hoge { // ã¡ã½ãããå®ç¾©ããattribute ([Hoge]) ãä»ä¸ããã // 人éã¯ã¡ã½ããã®å®ç¾©ã®ã¿è¡ããå®è£ ã¯è¡ããªãã // å®è£ 㯠Source Generator ããã£ã¦ããã [Hoge("ãªããé©å½ãªã¡ãã»ã¼ã¸")] public partial void M(int value); } // C# ã® Attribute ã¯åãªãã¡ã¿ãã¼ã¿ãä»ä¸ãããã®ã // ã¤ã¾ã TypeScript ã Python ã®ãã³ã¬ã¼ã¿ã¨ã¯å ¨ãã®å¥ãã®ã // Attribute èªä½ã¯ãªã«ãããªãåãªãã¡ã¿ãã¼ã¿ãªã®ã§ã // æ¦ãå®è¡æã«ãªãã¬ã¯ã·ã§ã³ã§åå¾ããã¦æåã«å½±é¿ãä¸ããã // (ä¾ãã°ã·ãªã¢ã©ã¤ãºã®é ã§å©ç¨ãã [JsonPropertyName] ã®ããã«)ã // ã³ã³ãã¤ã«æã« Analyzer (linter) ã Source Generator ãè¦ã¤ã㦠// è¦ååºããããã³ã¼ãçæãããããã®ã主ãªå©ç¨ã®ããæ¹ã // ã¾ã [AttributeUsage] ã§ã©ãã«ãã® attribute ãä»ä¸ã§ãããæå®ã§ããã [AttributeUsage(AttributeTargets.Method)] public class HogeAttribute : Attribute { public string Message { get; } public HogeAttribute(string message) { this.Message = message; } }
ä¾ãã°ä¸è¨ã®ãããªæ¸ãã¨ãSource Generator ãã³ã³ãã¤ã«æã« attributeãä»ä¸ããã¦ããã³ã¼ã (ä¸ã®ä¾ã§ãã㨠[Hoge("ãªããé©å½ãªã¡ãã»ã¼ã¸")]ãä»ä¸ããã¦ããã¡ã½ãã) ãæ¢ãã¦ãã¦ä»¥ä¸ã®ãããªã³ã¼ããåãåºããã¾ã (åãåºãããã¨ãã£ã¦ãããã«ãæã«å
é¨ã§ãããåºæ¥äºã§ãããgit 管çããããããªé åã«åãåºãããããã§ã¯ããã¾ãããåãåºãããã«ãããªãã·ã§ã³ã¯åå¨ãã¾ãã)ãã¾ã Source Generator 㯠Source Generator ã§ã©ã¤ãã©ãªãæä¾ãã¦ãããã®ã§ãªããã°ãèªåã§å®è£
ããå¿
è¦ãããã¾ãã
public partial class Hoge { // Source Generator ãã³ã³ãã¤ã«æã« Attribute ([Hoge]) ãä»ä¸ããã¦ããã³ã¼ããæ¢ãã¦ã㦠// Source Generator ãã³ã³ãã¤ã«æã«ä»¥ä¸ã®ããã«ã¡ã½ãããå®è£ ãããã public partial void M(int value) { Console.WriteLine($"ãªããé©å½ãªã¡ãã»ã¼ã¸ {value}"); } }
ä¸è¨ã®ä¾ãå®ç¨ã¬ãã«ã«ãªãã¨ãã³ã³ãã¤ã«æãã°ã³ã¼ãçæãªã©ã®ãã¯ããã¯ãåå¨ãã¾ããããã«ãã£ã¦ã³ã³ãã¤ã«æã«ãã®ã¡ãã»ã¼ã¸ãåºåããããã®å°ç¨ã®å®è£ ãåºåããå¹ççãªãã°åºåãå¯è½ã«ãªã£ã¦ãã¾ãã
public static partial class HogeLogger { // [LoggerMessage] 㯠logging ããã±ã¼ã¸ãæä¾ãã¦ããã¦ãã attributeã // attribute ã«æ¸¡ãæååã®ãã¬ã¼ã¹ãã«ãå ã®æåå ({PiyoId}) ã¨ å¼æ°å (piyoId)ãä¸è´ãããäºã§ã // æ§é åãã°ãããæãã«ãã£ã¦ãããã // å¹ççã« logging ããããã®ã³ã¼ãã Source Generator ã // 以ä¸ã® LogFuga ã¨ããã¡ã½ãããå®è£ ããå½¢ã§çæãã¦ãããã [LoggerMessage(1, LogLevel.Information, "LogMessage {PoyoId} {PiyoValue}")] public static partial void LogFuga(ILogger logger, Guid piyoId, int piyoValue); }
Logger ã®ä¾ã¯æ¬å½ã«ä¸é¨ã§ããSource Generator ã¯ã¦ã¼ã¶ãè¨è¿°ããã³ã¼ããæååã«åããã¦ä½ããã³ã¼ããçæãããå ´åã«å¨åãçºæ®ãã¾ããããããã«åçã³ã¼ãçæããããªããããªé¨åã§ãã[LoggerMessage] 㯠attribute ã«æ¸¡ããã弿°ã¨ããã«å«ã¾ããã¦ã¼ã¶ãè¨è¿°ããæååã«åããã¦æé©ãªã³ã¼ããåºåãã¦ããããã§ãã
ãããããå®ä¾ãè¦ã¦ã¿ã¾ãããããã¨ãã°ç§ãå ¬éãã¦ãã OSS ã§ãã TypedSignalR.Client ã®ä¾ã§è¦ã¦ããã¾ããããä¸ã®ä¸ã«ã¯ SignalR ã¨ãããªã¢ã«ã¿ã¤ã éä¿¡ç¨ã®ã©ã¤ãã©ãªãåå¨ããã®ã§ãããç´ ã® SignalR ã® client ãå¼·ãåä»ãããã¦ãã¾ãããã¤ãããããã§ TypedSignalR.Client 㯠SignalR ã®ã¯ã©ã¤ã¢ã³ããã¦ã¼ã¶ãå®ç¾©ãã interface ã«å¾ã£ã¦å¼·ãåä»ãããæ©è½ãæä¾ãã¾ããåã¯æ£ç¾©ã
ãã¨ãã°ã¦ã¼ã¶ã以ä¸ã®ãã㪠interface ãå®ç¾©ããã¨ãã¾ãã
public interface IMyHub { Task Add(int x, int y); }
ã©ã¤ãã©ãªã¦ã¼ã¶ã¯ä»¥ä¸ã®ããã« CreateHubProxy<>() ãå©ãäºã«ãããå¼·ãåä»ãããã SignalR ã® client ãåå¾ããå©ç¨ããäºãã§ãã¾ãã
// HubConnection 㯠SignalR ã®ã³ãã¯ã·ã§ã³ã表ç¾ããå HubConnection hubConnection = ...; CancellationToken cancellationToken = ...; var hubProxy = hubConnection.CreateHubProxy<IMyHub>(cancellationToken); var result2 = await hubProxy.Add(1, 2);
ã¡ãªã¿ã« CreateHubProxy<>() ãæ¡å¼µã¡ã½ããã§ã...! ãªã®ã§CreateHubProxy<IMyHub>(hubConnection, cancellationToken) ã§ã¯ãªãhubConnection.CreateHubProxy<IMyHub>(cancellationToken) ã¨æ¸ããããã§ããã
ã§ããã®å ´å Source Generator ã¯ä½ããããã¨ããã¨ãCreateHubProxy<>() ãç¨ãããã¦ããã¨ãããã³ã³ãã¤ã«æã«æ¢ãåºããå弿°ã«æ¸¡ããã¦ããå (ä»åã®å ´å㯠IMyHub) ãè§£æãã以ä¸ã®ãããªã³ã¼ããçæãã¾ããããã«ãã£ã¦ãã¦ã¼ã¶ã¯å¿«é©ãªæ¸ãå¿å°ãå¾ããã¾ãã
// å®éã® TypedSignalR.Client ã¯ãã£ã¨è²ã ãªäºãèæ ®ããã³ã¼ããåãåºããã¾ãã // ç°¡ç¥åããã¨ãããªæãã internal sealed class GenereatedMyHubProxy : IMyHub { private readonly HubConnection _connection; private readonly CancellationToken _cancellationToken; public GenereatedHogeHub(HubConnection connection, CancellationToken cancellationToken) { _connection = connection; _cancellationToken = cancellationToken; } public Task<int> Add(int x, int y) { return _connection.InvokeCoreAsync<int>(nameof(Add), [x, y], _cancellationToken); } }
ãã®ããã« Source Generator ã¯ã¦ã¼ã¶ã³ã¼ãã«åããã¦é©åãªã³ã¼ããåãåºãããå ´åã«éå¸¸ã«æå¹ã§ããæ¨æºã©ã¤ãã©ãªã®ä¸ã ã¨ãã¨ãã«ã·ãªã¢ã©ã¤ã¶ãæ£è¦è¡¨ç¾ãªã©ã§æ´»ç¨ããã¦ãã¾ããå®è¡æã«ã¦ã¼ã¶ãå®ç¾©ããåã®æ å ±ãã¿ã¦åçã³ã¼ãçæããããå®è¡æã«ã¦ã¼ã¶ãè¨è¿°ããæ£è¦è¡¨ç¾ãè§£æãã¦ããã«ãã£ãã³ã¼ããåçã«ã³ã¼ãçæãããããã³ã³ãã¤ã«æã«è«¸ã çæãã¦ãã¾ã£ãæ¹ãå®è¡æã«é«éã§ããããªã«ããå®è¡æã«è«¸ã è§£æãã¦åçã³ã¼ãçæãããããå§åçã«ãããã°ããããã§ãã åºåããã C# ã³ã¼ããèªãã°ããã ãã§ããããã
æ¨æºã©ã¤ãã©ãª
C# ã¯æ¨æºã©ã¤ãã©ãªãååãè¨èªã§ãã
æ¨æºã©ã¤ãã©ãªãååãäºã¯ãã¡ããã¡ãªãã¡ããã¾ããããã¯è¨èªã®ä¸»ãªç¨éã«ããªãããã¾ãã æ¨æºã©ã¤ãã©ãªãååãäºã«ã¯ãã¾ãã¾ãªã¡ãªãããããã¾ãã
- ä¸è¦ãªå¤é¨ã©ã¤ãã©ãªãå©ç¨ããå¿ è¦ããªã (ä¾åããå¿ è¦ããªã)
- ä¸åº¦å¦ç¿ãã¦ãã¾ãã°å¤ãã®ç®æã§ç¥èã使ãã¾ããã
- ä¸æã®æµè¡ã®ã©ã¤ãã©ãªã®ä½¿ãæ¹ãææ¡ããããããé¥ãã«ä¾¡å¤ãããã¾ã...!
- èªåãã¡ã®ã³ã¼ãã OSS çãèªãéã«ãæ¨æºã©ã¤ãã©ãªãå¤ç¨ãããã®ã§ãä¸è²«æ§ãããå§åçã«çè§£ãããã
ãã¡ãªããã¨ãã¦ã¯ runtime ã大ãããªããã¨ã§ãããããã¨ã¯ããã.NET ã® runtime 㯠30 MB ç¨åº¦ãªã®ã§ãçµã¿è¾¼ã¿ã¨ãã§ãç¡ããã°ç¹ã«åé¡ã«ãªããããªãµã¤ãºã§ã¯ç¡ãã§ãããã 䏿¹ã§ Rust ã®ãããªçµã¿è¾¼ã¿çã§ä½¿ãäºãå¼·ãæ³å®ããã¦ãããããªè¨èªã ã¨ãæ¨æºã©ã¤ãã©ãªãååãã£ããããã¯ããã§ãã¼ãµã³ãã¥ã¼ã¨ããæãã§ãããã
C# ã®æ¨æºã©ã¤ãã©ãªã«ã¯ãã¾ãã¾ãªãã®ãåå¨ãã¾ãã
ä¾ãã°ããã°ã©ã ãçµãããã§æ¬ ãããªãã³ã¬ã¯ã·ã§ã³ãé常ã«å¤ãç¨æããã¦ãã¾ããåºæ¬çãªã³ã¬ã¯ã·ã§ã³ã§ãã List<T>, Dictionary<TKey, TValue>, HashSet<T>, Stack<T> , Queue<T>, PriorityQueue<TElement,TPriority>ããã¤ãã¥ã¼ã¿ãã«ãªã³ã¬ã¯ã·ã§ã³ã§ãã ImmutableArray<T>, ImmutableDictionary<TKey,TValue>, FrozenDictionary<TKey,TValue>, ãã«ãã¹ã¬ããããã°ã©ãã³ã°ããéã«å¿
é ã¯ã¹ã¬ããã»ã¼ã㪠ConcurrentDictionary<TKey,TValue>, ConcurrentQueue<T>,ConcurrentStack<T> ãªã©ãåå¨ãã¾ããç¨éã«å¿ãã¦é©åãªã³ã¬ã¯ã·ã§ã³ã鏿ããäºã§ãå¹çã®ããããã°ã©ã ãçµããã¨ãã§ãã¾ããããã¦å½ç¶ãªããæ¨æºã©ã¤ãã©ãªã«å«ã¾ãã¦ããã¨ãããã¨ã¯ããã®ãããªã³ã¬ã¯ã·ã§ã³ãé½åº¦èªåã§å®è£
ããããå¤é¨ã®ã©ã¤ãã©ãªãé¸å®ãã¦å©ç¨ããå¿
è¦ãããã¾ãããæ¨æºã©ã¤ãã©ãªã«ããã©ã¤ãã©ãªãç©è¶³ããªãå ´åãè¦ããã«ã¦ã¼ã¹ã±ã¼ã¹ç¹åã®æéã®ã³ã¬ã¯ã·ã§ã³ã欲ãããªã£ããããããããã¾ããããããã¯ããããç¨ãªã話ã§ãããæ®ã©æ¨æºã©ã¤ãã©ãªã®ã³ã¬ã¯ã·ã§ã³ã使ã£ã¦ããã°äºè¶³ããã§ãããã
ã¾ãããã°ã©ãã³ã°ãçµãä¸ã§ã»ã¼å¿
é ã§ããéè¦ãªåã¨ã㦠Guid (UUID ã表ç¾ããå), DateTime, DateTimeOffset, TimeSpan, Uri ãªã©ãåå¨ãã¾ãããã®ãããªåãæ¨æºã©ã¤ãã©ãªã«åå¨ãããã UUID ã DateTime ã URI ãåãªãæååã§ããã¨ããããããã¨ãã£ããã³ã»ã³ã¹ãªè¡çºã¯çºçãã¾ãã (ã§ãä¸ã®ä¸ãã£ã±ãããï¼)ãå¤é¨ã®ã©ã¤ãã©ãªã«ä¾åããå¿
è¦ããªããããã¨ã³ã·ã¹ãã å
¨ä½ã§çµ±ä¸ãããå½¢ã§å¼·ãåä»ãããã¦ãã¾ããé常ã«å¬ããã
ã¾ãä½å¦ãã¨éä¿¡ãããã¨æã£ããã»ã¼ã»ã¼å¿
é 㪠HttpClient ã JsonSerializer ãæ¨æºã©ã¤ãã©ãªã«åå¨ãã¾ãã
ããã¦éåæããã°ã©ãã³ã°ãããä¸ã§éè¦ãª Task/Task<T> (Promise ç¸å½), ããããè£ã§æ¯ãã ThreadPool ã, ã¹ã¬ããéã§å®å
¨ãã¤å¹ççã«æ
å ±ã®ããåãããããã® Channel ãªã©ãæ¨æºã©ã¤ãã©ãªã«åå¨ãã¾ãã
ã¾ãæ¬å½ã«ããã«ããã¦ããã®ã¯ããä¸é¨ã§ãããªãã®ã§ãããã¨ã«ããè²ã ãªãã®ãç¨æããã¦ãã¾ãã ããã C# ã®æ¨æºã©ã¤ãã©ãªãèªãä¸ã§çµ¶å¯¾ã«èªããªãã¨ãããªãã®ãããªãã¨ãã£ã¦ã LINQ ã§ãã
LINQ (Language Integrated Query)
ããã°ã©ã ãçµãã§ããã¨ãã³ã¬ã¯ã·ã§ã³ãã¬ã·ã¬ã·æä½ããäºã¯é常ã«å¤ãã§ãããã ãã®å ´åã«æå¹ãªã®ã LINQ ã§ãã
R[] array = [ new R(1), new R(2), new R(3), new R(4) ]; var items = array .Where(x => x.Value % 2 == 0) .Select(x => new R(x.Value * 2)) .OrderByDescending(x => x.Value); foreach (var it in items) { Console.WriteLine(it); } public record R(int Value); // åºå // R { Value = 8 } // R { Value = 4 }
Where() ã¨ã Select() ã LINQ ã®ãªãã¬ã¼ã¿ã«ãªãã¾ãã
LINQ ã®ãªãã¬ã¼ã¿ã¯ããªãã®ç¨®é¡ãããã®ã§ãããããé§ä½¿ããäºã§ã³ã¬ã¯ã·ã§ã³ãæå¿«ãã¤èªç±èªå¨ã«æä½ã§ãã¾ãã
ã§ãåã«ããã ãã ã¨ãä»ã®è¨èªã«ã map ãã filter ããä¼¼ããããªã®ãããããï¼ãã«ãªã£ã¦ãã¾ãã®ã§ãLINQ ã®ç価ãèªã£ã¦ããããã¨æãã¾ãã
ã¾ã第ä¸ã«ãLINQ ã¯é
å»¶è©ä¾¡ããã¾ãï¼ã©ãããäºãã¨ããã¨ãåã« Where() ã Select() çã®ãªãã¬ã¼ã¿ãç¨ãã¦ã¡ã½ãããã§ã¼ã³ããã ãã§ã¯ãè©ä¾¡ãèµ°ãã¾ããããã®ããä¸è¦ãªã¡ã¢ãªã¢ãã±ã¼ã·ã§ã³ãçºçãã¾ãããéã« JavaScript ã®é
åã§ã¯map ã filter ã¯é
å»¶å®è¡ã§ã¯ãªã峿è©ä¾¡ããã¾ãããã®ããåãæ±ãé
åã巨大ãªå ´åãä¾ãã°é
åã®è¦ç´ ã 10000 ã¨ããã£ãå ´åãarray.map(...) ãããå度è¦ç´ æ°ã 10000 ã®é
åã確ä¿ããã¦ãã¾ãã¾ããC# ã® LINQ ã¯åºæ¬çã«é
å»¶è©ä¾¡ããã¾ãããããã®ãããªäºã¯çºçãã¾ããã
var items = array // ãªãã巨大㪠int é å .Where(x => x % 3 == 0) .Select(x => x * 2) .Take(20); // å é 20 åã ãå¼ã£å¼µã£ã¦ãã // é å»¶è©ä¾¡ãªã®ã§ 20 ååã®è¦ç´ ãåå¾ãããçµäº // 峿è©ä¾¡ã®å ´å巨大ã¯ãªé ååã®ã¢ãã±ã¼ã·ã§ã³ãçºçãã¦ãã¾ããã // C# ã® LINQ ã¯é å»¶è©ä¾¡ãªã®ã§ä¸è¦ãªã¡ã¢ãªã¢ãã±ã¼ã·ã§ã³ãçºçããªã foreach (var item in items) { Console.WriteLine(item); }
第äºã«ãC# ã® LINQ ã¯ãã¹ã¦ IEnumerable<T> ã¨ãã interface ã«å¯¾ããæ¡å¼µã¡ã½ããã¨ãã¦å®ç¾©ããã¦ãã¾ãããã㦠C# ã®æ¨æºã©ã¤ãã©ãªãæä¾ãã¦ããã³ã¬ã¯ã·ã§ã³ã«ã¯ãã¹ã¦ IEnumerable<T> ãå®è£
ããã¦ããã®ã§ããã¹ã¦ã®ã³ã¬ã¯ã·ã§ã³ã«å¯¾ã㦠LINQ ã使ãäºãã§ãã¾ããã¾ãã³ã¬ã¯ã·ã§ã³ã struct ã§å®ç¾©ããã¦ãããã®ã«é¢ãã¦ã¯ãinterface ã«å¯¾ããæ¡å¼µã¡ã½ããçµç±ã§å©ã㨠boxing ãçºçãã¦ããã©ã¼ãã³ã¹ãä½ä¸ãã¦ãã¾ãã®ã§ãLINQ ã«å¯¾ããä¸çºç®ã®ã¡ã½ããã¯ãã¹ã¦ãã® struct ã«å¯¾ããæ¡å¼µã¡ã½ããã¨ãã¦å®ç¾©ããã¦ãããããã©ã¼ãã³ã¹ã®äºãååã«èãããã¦ãã¾ãã
ãã¨ãã° Select() ã¯ä»¥ä¸ã®ããã«å®ç¾©ããã¦ãã¾ãã
// æ¨æºã©ã¤ãã©ãªã¯ãããªç´ æ´ãªå®è£ ã§ã¯ãªãããã£ããã¨æé©åããã¦ãã¾ã // å®éã®å®è£ 㯠GitHub åç §ã®äº // https://github.com/dotnet/runtime/blob/v9.0.2/src/libraries/System.Linq/src/System/Linq/Select.cs#L13 public static class Extensions { public static IEnumerable<TResult> Select<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, TResult> selector) { foreach (var item in source) { yield return selector(item); } } }
ããã¦æ¡å¼µã¡ã½ããã§å®ç¾©ããã¦ããã¨ããäºã¯ãèªåã§ãããã§ãæ¡å¼µã§ããã¨ãããã¨ã§ãã
ãã¨ãã°ä»¥ä¸ã®ããã« Custom() ã¨ããã¡ã½ãããå®ç¾©ããã¨ãã¨ã¦ãç°¡åã«èªä½ LINQ ãªãã¬ã¼ã¿ã使ã§ããLINQ ã®ã¡ã½ãããã§ã¼ã³ã«æã¿è¾¼ãäºãã§ãã¾ãã
R[] array = [ new R(1), new R(2), new R(3), new R(4) ]; var items = array .Where(x => x.Value % 2 == 0) .Select(x => new R(x.Value * 2)) .Custom() // èªä½ãªãã¬ã¼ã¿ãç°¡åã«æãã .OrderByDescending(x => x.Value); foreach (var it in items) { Console.WriteLine(it); } // åºå // R { Value = 108 } // R { Value = 104 } public record R(int Value); public static class Extensions { // 以ä¸ã®ããã«èªä½ LINQ ãªãã¬ã¼ã¿ãå®ç¾©ã // ãã®ä¾ã 㨠Select 使ããã¨ãã話ã§ã¯ããã¾ããã // å®éã«ã¯ããã§çµæ§è¤éãªäºãè¡ãã // LINQ ã®ã¡ã½ãããã§ã¼ã³æ¬ä½ããã£ãããããæå³çã«ãåãããããããäºãã§ãã¾ã public static IEnumerable<R> Custom(this IEnumerable<R> source) { foreach (var item in source) { yield return new R(item.Value + 100); } } }
LINQ ã¯å¥ã«ã³ã¬ã¯ã·ã§ã³ãéåã«å¯¾ãããã®ã ãã§ã¯ããã¾ãããæ¨æºã©ã¤ãã©ãªã«çµã¿è¾¼ã¾ãã¦ããã³ã¬ã¯ã·ã§ã³ã«å¯¾ãã LINQ ã LINQ to objects ã¨å¼ç§°ããã®ã§ãããä»ã«ã LINQ to SQL, LINQ to events ãªã©ãåå¨ãã¾ããLINQ to SQL 㯠Entity Framework CoreãLINQ to events 㯠R3 ãªã©ã®ã©ã¤ãã©ãªãçµã¿è¾¼ãäºã«ãªãã¾ãã
ãããã® LINQ to xxx ã¯åºæ¬çã«ãã¹ã¦ä¼¼ãæå³ã®ãªãã¬ã¼ã¿ã¯åä¸ã®ååãä»ãããã¦ãã¾ããããã ããè¦ã¦ãä½ããã¦ãããé常ã«çè§£ãããããã®ã¨ãªã£ã¦ãã¾ãããã¡ããããããã«åºæãªãªãã¬ã¼ã¿ã¯åå¨ãã¾ããã©ããä¾ãã° Rx ãªããã 㨠ã¤ãã³ãã®ãã£ã«ã¿ãªã³ã°ã®ããã« ThrottleFirst/ThrottleLast ã¨ãããªãã¬ã¼ã¿ããã£ãããã¾ãããããã¯ã¤ãã³ãã®å¦çåºæã§ããéåã«å¯¾ããæä½ã¨å¯¾å¿ãããã®ã¯åå¨ãã¾ãããããã
OSS çã®ã©ã¤ãã©ãªäºæ
ç¾ä»£ã®ã½ããã¦ã§ã¢éçºã«ãã㦠OSS ãå©ç¨ããäºã¯æ®ã©ã®å ´åé¿ãã¦éããªãã§ãããã
ãããªç¾ä»£ã®ã½ããã¦ã§ã¢éçºã«ããã¦ãçããã¯ã©ã®ããã«å©ç¨ãã OSS ãé¸å®ãã¦ããã§ããããï¼å©ç¨ããéã©ã®ãããªäºã«æ°ãä»ãã¦ããã§ããããï¼
OSS ã¨ã¯åºæ¬çã« AS IS ã§ããããã«ãããã®ããã®ã¾ã¾æä¾ããã¦ããã ãã§ãããããã«ãªããªããªãã§ããã®ç²¾ç¥ãããã¼ã§ãã£ã¦ããå人éçºãç ç©¶ã§ã¯éã«ä½¿ã£ã¦ã¿ãã°ããã¨æãã¾ãããããããã¯ã·ã§ã³ã§ã®å©ç¨ã¯å½ç¶äºæ ãå¤ãã£ã¦ãã¾ããAS IS ã§æä¾ããã¦ãããã®ãç¡éªæ°ã«ä¿¡ãã¦ãããã¯ã·ã§ã³ã§å©ç¨ããã®ã¯é£ããã
ã¨ããããã§ãç§ã¯ OSS ãå©ç¨ããéã«ã¯ä»¥ä¸ã®ãããªäºãèãã¦ãã¾ãã
| å¤§è¦æ¨¡ or èªã¿è§£ãé£æåº¦ãé«ã | èªã¿è§£ããç¯ç | |
|---|---|---|
| ããã¡ã¯ãã«ãªã£ã¦ãã or åºã使ããã¦ãã |
- éçºå
ã¯ä¿¡ç¨ã§ãããã - ãµãã¼ãæéãã©ã¤ããµã¤ã¯ã«ã¯æç¤ºããã¦ããã - ãããã¯å¿ä¸ãè¦æã§å©ç¨ããã |
- ã³ã¢é¨åã¯èªãã§ããå©ç¨ãã - ç¡éªæ°ã«å©ç¨ãã (å°ã£ããå¾ããã§ãèªã¿è§£ãã°ãããã) |
| åºã使ããã¦ããªã | - éçºãã¦ããã®ãä¼ç¤¾ã®å ´åã¯ãµãã¼ããå¾ããããã©ãã - å人ã®å ´åã¯...è¦éãããª... |
- ä¸éãèªãã§ããå©ç¨ãã - éçºå ã¯ä¿¡ç¨ã§ãããã |
éçºå ãããç¨åº¦ä¿¡ç¨ã§ããããã¡ã¯ãã¹ã¿ã³ãã¼ããªããåºã使ããã¦ããããµãã¼ãæéã¨ã©ã¤ããµã¤ã¯ã«ãæç¤ºããã¦ãããã®ã«ã¤ãã¦ã¯ãç´ç²ã«æ©è½ãæ§è½ã®ã¿ãèãã¦æ¡ç¨ããã°ããã§ããããããã§ããªãæ»ãã ãããã©ããããããªããæ»ãªã°ããã¨ããã¨ã¯ãããã®æã®ãã¤ãæ»ã¬ã¨ã¿ããªå°ãããæ»ãªãªãããã«ã³ãã¥ããã£ãããããåãã§ããããããµãã¼ãæéãæç¤ºããããã«ãªããããè²ã£ã OSS ã¯ããããæ»ãªãªãã§ããã (叿ç観測)ã
åé¡ã¯ãã以å¤ã®ãã¿ã¼ã³ã
ã¾ããå¤§è¦æ¨¡ãã¤ããã¡ã¯ãã¹ã¿ã³ãã¼ããªããåºã使ããã¦ãããããµãã¼ãæéã¨ããªããã¤ã ã¨ãããããããµãã¼ãæéã¨ãæç¤ºããã¦ããã®æ¹ãçããã§ããããããµãã¼ãæéãã©ã¤ããµã¤ã¯ã«ãæç¤ºããã¦ããã®ãåè¨èªã® SDK ã¨ã runtime, æãã¯å·¨å¤§ãªãã¬ã¼ã ã¯ã¼ã¯ã¨ãããããªãã®ã§ãããããµãã¼ãæéãªã©ãæè¨ããã¦ããªãããå¿ä¸è¦æã§ä½¿ããã社å ã«ã³ããã¿ã¼æ±ãããªããæ»ãªãªãããã«ãã® OSS ãã¹ãã³ãµã¼ã¨ãã¦éãåºãã¦ãããããªãã§ãããã
次ã«å¤§è¦æ¨¡ãã¤åºã使ããã¦ããªããã¿ã¼ã³ããã大æ¦ã¯æ°é²æ°éã®æ°ãã伿¥ãçèªããã OSS ã ã£ããããã§ããããããã¯ãã®ä¼æ¥ãããµãã¼ããå¾ããããã©ããã§æ¡ç¨ã®å¯å¦ã¯å¤ãã£ã¦ããã§ããããããã¦å¤§è¦æ¨¡ã§ã¯ãããå人ãä½ã£ããã®ã®å ´åã¯ãä½ç¨ã®é©æ°æ§ãç¡ããã°æ®ã©ã¹ã«ã¼ãããã§ãããããªã®ã§å人éçºã® OSS ã¯ã¹ãªã ããã¹ã (ããã§ãªãã¨ä½¿ãããªã...!)ã
次ã«èªã¿è§£ããç¯çã§ããã¡ã¯ãã¹ã¿ã³ãã¼ããªããåºã使ããã¦ãããã¿ã¼ã³ãå人çã«ã¯ã³ã¢é¨åã¯èªãã§ããå©ç¨ããæ¹ãè¯ãã¨ã¯æãããå®éèªåãªããã¯å²ã¨èªãããã«ãã¦ããã®ã§ãããã¾ãç¡éªæ°ã«ä½¿ã£ã¦ãè¯ããã¨æãã¾ããå©ç¨ãã¦ãã¦å°ã£ãã¨ãã¦ããèªããç¯çã®ã³ã¼ãéãé£æåº¦ã§ããã°å¾ããã§ãèªã¿è§£ãã°ããã§ããããã
æå¾ã«èªã¿è§£ããç¯çã§åºã使ããã¦ããªããã¿ã¼ã³ãããã¯åºæ¬çã«ä¸éãèªãã§ããå©ç¨ããã¹ãã§ãããããhogehoge ããããããã ãã© GitHub ã«ãã㪠OSS 転ãã£ã¦ããããã使ã£ã¦å®ç¾ãã¾ãï¼ãã¯3æµã®ãããã¨ãã¢ã¸ã£ã¤ã«ããåãã½ããã¦ã§ã¢ããä½ãäºãã©ãã ãæ¨é²ãã¦ãããããéã«ããã±ã¼ã¸ã追å ããã ã¼ãã¯å°åºåãå ¥ãããããã®ã§ã¯ããã¾ããããã¨ã¯éçºå ãä¿¡é ¼ã§ãããã©ããã§ãå¤ãã£ã¦ãã¾ãããã㨠OSS ããããã ã¨æãã®ã§ããããã®äººãä½ã£ã¦ãããªã大ä¸å¤«ã§ãããã¿ãããªã®ã¯ããã®ã§ãããããã¢ã³ãããå ã«å¤æãä¸ãã®ãããã§ããããã¾ããä¿¡é ¼ã§ããã§ããï¼ãã®å ´åã§ãèªããç¯çãªãèªãã§ãã¾ã£ãã»ããããã¨ã¯æãã®ã§ãã (åå¼·ã«ããªãã¾ããããï¼)ãã¾ããªã®ã§ãå人㧠OSS ãå ¬éãããã¿ã¼ã³ã¯æ®ã©ãã®ãã¿ã¼ã³ã ã¨æãã¾ããããã¨ã«ããå¾¹åºçã«èªã¿ãããã³ã¼ããæ¸ãã¦ããäºã¯é常ã«éè¦ãªã®ã§ãããããæãã®æ©è½ãæä¾ããã¦ãã¦ãèªã¿ã¥ãã OSS ã¯çµ¶å¯¾ã«æ¡ç¨ãããªãã¨æã£ãã»ããããã§ããã (å人çãªææã§ã)ã
ã§ãããã¯ããã¾ã§ OSS ã®é¸å®äºæ ã§ãããããã°ã©ãã³ã°è¨èªäºæ ã«ãã¾ãé¢ä¿ãªãã®ã§ã¯ï¼ã¨æãæ¹ãããããããã¾ãããããããªãããããã¯å¤§ãããããã£ã¦ãã¾ãã
è¦ããã«ãå§åçã«ä¿¡é ¼ã§ãããã®ãå¿ä¸ãè¦æãã OSS ãé¤ãã°ãåºæ¬çã« OSS ã¨ã¯èªãã§ããå©ç¨ããã¹ããã®ã ã¨ç§ã¯èãã¦ãã¾ããããã¯çæ³è«ã§ãããç¾å®çã§ã¯ãªãã¨è¨åãããæ°ããã¾ãããçæ³çã«ã¯ãã¯ãéçºãã¼ã ã®èª°ãããã¯èªãã§ããã¹ãã ã¨èãã¦ãã¾ãã ååçã« OSS ã AS IS ã§ããäºãå¿ãã¦ã¯ãããªãã®ã§ãã ãã㦠AS IS ã¨ããäºã¯ãããªã«ç¡éªæ°ã«ä¿¡é ¼ã§ããªãã®ã§ã (OSS 使ã£ãéçºãããªãå©ç¨ãã OSS ãå©ç¨ããã㪠OSS ãèªãã³ã¹ãã追å ã§è¼ããã¹ãã ã¨å¸¸ã æã£ã¦ãã¾ã)ã
ããã¦ååçã« OSS ãèªãã§ããå©ç¨ãããã¨ããç«å ´ã«ãã£ãã¨ããC# ã¯é常ã«ãããããã¤ã³ããããã¾ããããã¯å ¬éããã¦ãã OSS ã®ã©ã¤ãã©ãªãããããå¤é¨ã®ããã±ã¼ã¸ã«ä¾åãã¦ããªãããããã¯ä¾åãã¦ããã¨ãã¦ãæ¨ç§»çä¾åå«ãã¦ããããæ°ã®ããã±ã¼ã¸ã«ä¾åãã¦ããªããã¨ãããã¨ã§ããè¦ã¯ C# ã§ã¯ .NET runtime ãä¸çªä¸ã®åºç¤ã¨ããã¨ãã«ã以ä¸ã®ãããªç¶æ³ã«ã»ã¨ãã©ã®å ´åé¥ããªããã¨ãããã¨ã§ãã TypeScript ã Python ã¯ä¾åé¢ä¿å°çãé¿ãããããè¦ããæããããäºã«ãªãããã§ãã(æ¬å½ã«è¦ãããå©ãã¦ãã)ãC# ã§ã¯ãã®ãããªäºæ ã«é¥ãã¾ããããã®ããèªã¾ãªãã¨ãããªãã©ã¤ãã©ãªãèªã¿ãã対象ã®ã©ã¤ãã©ãªã«ã®ã¿éããäºãå¤ãã§ãã

npm ã®ããã«æ¨ç§»çä¾åã«ãã£ã¦ããã±ã¼ã¸ãç¡éã«è¿½å ãããã¨ããã©ãããããããã¾ãããã¨ã¦ããããªããã©ææ¡ãããã¾ããã

ãªã C# ã® OSS ã npm ã§å ¬éããã¦ãããããªããã±ã¼ã¸éã®ãããªæ®å¿µãªç¶æ ã«ãªãããçæ³ã«è¿ãç¶æ ã«ãªã£ã¦ãããã¨ããã¨æ¦ã2ã¤ã®çç±ãããã¨ç§ã¯èãã¦ãã¾ãã
ã¾ã第ä¸ã« C# ã®æ¨æºã©ã¤ãã©ãªãååããããå種ã©ã¤ãã©ãªã¯ä½è¨ãªå¤é¨ããã±ã¼ã¸ã«ä¾åããå¿ è¦ããªãäºãå¤ããããæ¨æºã©ã¤ãã©ãªã§ä½ããè¶³ããªãå ´åã¯å¤§æ¦ãæ¨æºã©ã¤ãã©ãªã«ãããã®ããã¦ã¼ã¹ã±ã¼ã¹ã«ç¹åããä½æãæ¬²ããï¼ããªã®ã§ãã¯ãå¤é¨ã®ããã±ã¼ã¸ã«ä¾åããèªåå®è£ ããäºã«ãªãã®ã§ãä½è¨ãªä¾åãçºçãã¾ããã
ããã¦ç¬¬äºã«ããããã C# ãé·ããã¨ã³ã¿ã¼ãã©ã¤ãºãªé åã§ä½¿ãããè¨èªã ã£ãããã ã¨èãããã¾ããã¨ã³ã¿ã¼ãã©ã¤ãºãªã½ããã¦ã§ã¢éçºã ã¨æ¨ç§»çä¾åé¢ä¿ã«ãã£ã¦ä½è¨ãªããã±ã¼ã¸ã追å ãããäºãæ¯å«ãããã¨æãã®ã§ããã®ãããªæåãåºæ¥ä¸ãã£ãã®ã ã¨æ¨æ¸¬ãã¦ãã¾ãã
C# ã® OSS ã¯ãã®ãããªæåã®ä¸ã«ãªããã£ã¦ããã®ã§ãé常㫠OSS ãèªãã®ãæãã¾ããã¤ãã§ã«æ¨æºã©ã¤ãã©ãªã®ç¥ãããªã£ãæ´»ç¨æ¹æ³ãªãããåå¼·ã§ãã¾ãã ä¸ç³äºé³¥ã
å人çã«ã¯ä»ã®è¨èªã®ã©ã¤ãã©ãªãæ¨æºã©ã¤ãã©ãªã ãã§æç«ãã¦ããäºãæ¬å½ã«å°ãªãã®ã§ãã¨ãã OSS ã®å®è£ ãèªããã¨ãã¦ãããã® OSS ãä¾åãã¦ããå¥ã® OSS ã®å®è£ ãèªã¾ãªãã¨ãããªãã®ã§ããã¡ããã¡ãèªã¿ã«ãããã§ããããå¤åããããæåãããã ãããªãã¿ãããªäºæ¸¬ã¯ã¤ãã¦ãã
ããã¸ã§ã¯ãã¨ããåä½
C# ...ã¨ããã .NET ã«ã¯ããã¸ã§ã¯ãã¨ããåä½ãåå¨ãã¾ãããã®ããã¸ã§ã¯ãã¨ããã®ã¯1ã¤ã®ããã±ã¼ã¸ãªããã¢ã»ã³ã㪠(dll) ã®åä½ã«ãªãã¾ãããã®ã¢ã»ã³ããªã¯ããã±ã¼ã¸ã®ãã¨ãããã°ãå®è¡å¯è½ãªã¢ããªã±ã¼ã·ã§ã³ã®ãã¨ãããã¾ãã ãã®ããã¸ã§ã¯ãã¨ããåä½ãããªãå¬ããã
ããã±ã¼ã¸ã®å ´å
ç¾ä»£çãªæ§æã®å ´åãå¤ãã®å ´åããã±ã¼ã¸ã¯ãæ½è±¡(ã¤ã³ã¿ã¼ãã§ã¼ã¹ç)ãã¨ãå®è£ ãã«åããã¦ãã¾ãã è¨èã§èª¬æãã¦ãåããã¥ããã¨æãã®ã§ãå ·ä½ä¾ãè¦ã¦ã¿ã¾ãããã
ãã¨ãã°ãç¾å¨ C# ã§ logging ãããéã«ã¯ Microsoft.Extensions.Logging ã¨ããããã±ã¼ã¸ãç¨ããã®ãããã¡ã¯ãã«ãªã£ã¦ããã®ã§ããã以ä¸ã®ããã«æä½éã®æ½è±¡ã¨å®è£
ã§ããã±ã¼ã¸ãåé¢ããã¦ãã¾ãã
Microsoft.Extensions.Logging.AbstractionsILoggerinterface ãLogLevelã表ç¾ãã enum ãªã©ã®æä½éã®åã®ã¿ãå«ã¾ããããã±ã¼ã¸
Microsoft.Extensions.Logging.Console- ã³ã³ã½ã¼ã«ã«ãããã°ç¨ã®ã·ã³ãã«ãªãã°ã JSON æ§é åãã°ãåºåããããã®ããã±ã¼ã¸
Microsoft.Extensions.Logging.Abstractionsã«ä¾åãã¦ãã
OpenTelemetry- OpenTelemetry ã®ããã±ã¼ã¸ãOpenTelemetry ã¯ãã°ãåºåããã®ã§ãå½ç¶ãã°é¢ããå®è£ ãå«ã¾ãã¦ããã
Microsoft.Extensions.Logging.Abstractionsã«ä¾åãã¦ãã
ãã®ãããªå
·åã§ãããã®ä»ãã¾ãã¾ãªã©ã¤ãã©ãªã§ãã°ãåºåããããã®ã¯ããç¨æããã¦ããå ´åã§ã Microsoft.Extensions.Logging.Abstractions ã«ã®ã¿ä¾åãã¦ãããå®éã«ã©ã®ãããªå½¢å¼ã§ã©ãã«ãã°ãåºåãããã«ã¤ãã¦ã¯ã©ã¤ãã©ãªã¦ã¼ã¶ãå¥éã©ã¤ãã©ãªã追å ããäºã§ã«ã¹ã¿ãã¤ãºã§ããããã«ãªã£ã¦ãã¾ãã
Clean Architecture
ãã¦ãå¤ãã®äººã大好ã㪠Clean Architectureãããã¦ç¡éã«èª¤è§£ã®çã¾ãã Clean Architectureãæ¯éãç¡éã«åããã Clean Architectureã
C# ã«ããããããã¸ã§ã¯ããã¨ããåä½ã¯ãClean Architecture ã«æ²¿ã£ãã¢ã¼ããã¯ãã£ãçµãã®ã«ãé常ã«åãã¦ãã¾ãã
ã¾ã Clean Architecture ã®æ ¸å¿ã¯ãä¾åã®æ¹åãå¶å¾¡ããã¼ã«å¼ã£å¼µãããªãããã«ãã¢ããªã±ã¼ã·ã§ã³ã®ã³ã¢ (entity, interface, ãã¸ãã¹ãã¸ãã¯ç) ã¯ä½ã«ãä¾åããªãããã«ãã¤ã¤ãåã³ã³ãã¼ãã³ãããã®ã³ã¢ã«åãã£ã¦ä¸æ¹åã«ä¾åãããããã«ããããã¨ããã ãã®è©±ã§ãã ããå°ããã¿ç ãã¨ãã¢ããªã±ã¼ã·ã§ã³ã®ã³ã¢ãåã³ã³ãã¼ãã³ãã«ä¾åããã®ã§ã¯ãªããåã³ã³ãã¼ãã³ããã³ã¢ã«å¯¾ãã¦ä¾åããããã«ããããã«ããããã¨ããäºã§ãããã¨ã©ã®ã¤ã¾ããå¶å¾¡ããã¼ã¨ã³ã³ãã¼ãã³ãã®ä¾åé¢ä¿ãã²ã£ããè¿ãã¨ããæãï¼ãã¨ããäºã§ãã ãªã®ã§ Clean Architecture ã¨ã¯æè©® SOLID ååã® D (Dependency Inversion Principle) ã®å»¶é·ã«éããªãããã§ããSOLID åå大äºã Clean Architecture ã®ãããã¨ååãæ¬ã¨ãèªã¾ãªãã§ãããã ãæãã¦ããã° OKOKã Bob ããããªãã¦è¨ã£ã¦ããæ°ã«ãªãæ¹ã¯ãã®ãã¼ã¸ã¨ãèªãã§ããããããã°è¯ãã¨æãã¾ãã ãã®åå¿åã®å³ã UseCase ã¨ã Interactor çã®æ¹æ³è«ã¯æ»ã¬ã»ã©ã©ãã§ãããã®ã§ãã
ã¾ãã¨ããã大äºãªã®ã¯å¶å¾¡ããã¼ã¨ã³ã³ãã¼ãã³ãã®ä¾åé¢ä¿ãã²ã£ããè¿ããã¨ã§ãããã㦠C# ã®ããã¸ã§ã¯ãã使ããã¨ã§ãéå¸¸ã«æç¢ºãªã³ã³ãã¼ãã³ãã®åé¢ã¨ä¾åé¢ä¿ã®å¶å¾¡ãå¯è½ã¨ãªã£ã¦ãã¾ãããã¨ãã° C# ã® Clean Architecture ã«æ²¿ã£ãã¢ã¼ããã¯ãã£ãçµãå ´åã以ä¸ã®ãããªæ§æã«ãªãã¾ãã

ãã£ã¬ã¯ããªçã«ã¯ä»¥ä¸ã®ãããªæãã§ (ä¸é¨çç¥ãã¦ãã¾ã)ã.csproj ãå«ã¾ãããã£ã¬ã¯ããªé
ä¸ã1ã¤ã®ããã¸ã§ã¯ãã¨ãã¦åãæ±ããã¾ãããã㦠.sln ããã®ããã¸ã§ã¯ãéãã¾ã¨ãã¦ç®¡çãã¦ããæãã§ãã
Root
ââ MyApp.sln
ââsrc
ââ MyApp.Core
â ââ MyApp.Core.csproj
â ââ Entities
â â ââ MyEntity.cs
â ââ Repositories
â â ââ IMyRepository.cs
â ââ Services
â ââ IMyService.cs
â
ââ MyApp.Infrastructure.PostgreSql
â ââ MyApp.Infrastructure.PostgreSql.csproj
â ââ Repositories
â ââ MyRepository.cs
â
ââ MyApp.WebApi
ââ MyApp.WebApi.csproj
ââ Program.cs
ââ Controllers
ââ MyController.cs
MyApp.Core ã¯ä½ã«ä¾åãããentity åãå種 interface ãªã©ããå®ç¾©ããã¦ãã¾ãã
MyApp.Infrastructure.PostgreSql 㯠MyApp.Core ã«ä¾åãã¦ãããMyApp.Core ã§å®ç¾©ããã entity ãåç
§ããinterface ã«å¿
è¦ãªå®è£
ãè¡ããã¦ãã¾ãã
ãã㦠MyApp.WebApi 㯠MyApp.Core ããã³ MyApp.Infrastructure.PostgreSql ã«ä¾åãã¦ãããããããçµã¿åãã DIï¼Dependency Injectionï¼ ãæ§æãã¦ãã¾ãããã®ããã«æ§æããäºã«ãããå¶å¾¡ããã¼ã¨ã³ã³ãã¼ãã³ãã®ä¾åé¢ä¿ãã²ã£ããè¿ãäºãã§ãã¾ããã¤ã¾ãããã¸ãã¹ãã¸ã㯠(=MyApp.Core) ã DB ã«å¯¾ããå®è£
(=MyApp.Infrastructure.PostgreSql) ã«ä¾åããã®ã§ã¯ãªããDB ã«å¯¾ããå®è£
ããã¸ãã¹ãã¸ãã¯å´ã«ä¾åããããã«ãªã£ã¦ãã¾ããããã Clean Architecture ã®æ ¸å¿ã§ãã
ããã¸ã§ã¯ãåä½ã§å®è£
ãåé¢ããä¾åé¢ä¿ãæç¤ºçã«ããäºã¯ãã¾ãã¾ãªã¡ãªãããåå¨ãã¾ãã
ãã¨ãã°MyApp.Core 㯠MyApp.Infrastructure.PostgreSql ã«ä¾åãã¦ãã¾ãããããå½ç¶MyApp.Infrastructure.PostgreSql ã§å®ç¾©ããã諸ã
ãåç
§ãããã¨ã¯çµ¶å¯¾ã«ã§ãã¾ãããããã¸ã§ã¯ãã®ãããªåä½ããªãã¨ãã²ãããªãã¨ã§åç
§ã®æ¹åããããããªã£ãããããã¨ããããããã¦ä¸åº¦å´©ããã¨ããããå¤ãªæ¹åã«å¼ã£å¼µããã¦ãã£ãã䏿¹åã«ãã¦ããä¾åããã¡ããã¡ãã«ãªã...ããã®ãããªãã¨ã¯çµ¶å¯¾ã«ãä»çµã¿ãã«ãã£ã¦èµ·ããå¾ãªããªãã¾ããã¬ãã¥ã¼ã«ãã£ã¦é²ãã¨ãããªãã¦æ¸ã¿ã¾ããã¾ãã©ãé å¼µã£ã¦ãæ£ããæ½è±¡ãä½ããªãã¨ã¾ã¨ãã«ã½ããã¦ã§ã¢ãéçºããäºãåºæ¥ãªããªãã®ã§ãå¿
ç¶çã«è¨è¨è
ãæå³ããéãã®ã¢ã¼ããã¯ãã£ã®ã¾ã¾éçºãç¶ãããã«ãªãã¾ãã大å¤åã°ããã
ãã¡ããããã¸ã§ã¯ãã¨ããåä½ã¯ Clean Architecture ã ãã«ã¨ã£ã¦å¬ãããã®ã§ã¯ããã¾ãããæè¿ã ã¨ãã¤ã¯ããµã¼ãã¹ã«ç²ãã¦ã¢ã¸ã¥ã©ã¢ããªã¹ã¸ã®ç§»è¡ã¿ãããªè©±ãã¡ãã»ãæµãã¦ãã¾ãããã¢ã¸ã¥ã¼ã«ã«åããã¨ããç¹ã§ã C# ã®ããã¸ã§ã¯ãã¯éå¸¸ã«æç¨ã§ããã¨ããã C# ã§ã¯æãããããã¤èªä½ã¯ã¢ããªã¹ã§ã¯ããããããã¸ã§ã¯ã (ã¢ã¸ã¥ã¼ã«) ã¯è¤æ°ã«åããã¦ãããªãã¦å½ããåã®è©±ã ã£ãã®ã§ãC#er ããããã¨å°ã 仿´æããã£ããããã®ã§ãã...ã(ããããã¢ã¸ã¥ã©ã¢ããªã¹ã«å帰å¯è½ãªãæåãããã¤ã¯ããµã¼ãã¹ãªãã¦ä¸è¦ãªã®ã§ãã...!)
徿¹äºæ
C# ã¯ãããã25年鏿ã§ãããè¨èªä»æ§ã®ç ´å£ç夿´ã¯ã»ã¼ããã¾ããã èªåãç¥ãéãã«ããã¦ã¯ãæ®ã©ãã°æ±ãã¿ãããªå½¢ã§ä¿®æ£ããå®è³ªçã«ç ´å£ç夿´ã¨ãªã£ã¦ãã¾ã£ããã®ã1ã¤ããã¾ããããã®ç¨åº¦ã§ãã
ã¾ã C# ã®æ¨æºã©ã¤ãã©ãªã徿¹äºæããã®ãããèãããã¦ä½ããã¦ãããæ®ã©ç ´å£ç夿´ãããã¾ãã (ã¼ãã§ã¯ããã¾ãã)ãç ´å£ç夿´ã¨ãã£ã¦ãå®å®³ã®ãããã®ã¯é常ã«éããã¦ãã¾ãããæ®ã©ã®äººã«ã¯å½±é¿ããªããã®ã大åã§ããåºæ¬çã« .NET ã®ãã¼ã¸ã§ã³ããããå£ããã®ã§ã¯ãªããåã«ããã©ã¼ãã³ã¹ãåä¸ããã ãã§ãã
ã¡ãªã¿ã«ã¤ã³ã¿ã¼ãããã 㨠C# ã¯å¾æ¹äºææ§ããªãï¼ã¨ããã£ã¦ãã C# ã¨ã¢ãå¢ãã¼ã¡ã¼ã¡ããã®ã§ãããããã¯ãããããã¬ã¼ã ã¯ã¼ã¯ã®ãã¼ã¸ã§ã³ãã¬ãã³ã¨ãããããã¦ããããèµ·ãããã¨ã§ããC# ã®è¨èªãã®ãã®ãæ¨æºã©ã¤ãã©ãªã«ã¯å§åçãªå¾æ¹äºæãããããã§ããããããã«ãã¬ã¼ã ã¯ã¼ã¯å´ãå ¨ã¦ã®æ©è½ã«ã¤ãã¦å¾æ¹äºæãæã£ã¦ããããã§ã¯ãªãã®ã§ããã¡ãã§å¼ã£ããã£ã¦ããã®ã§ããããã¨ãããä¸ã®ä¸ã«åºåã£ã¦ãããã¬ã¼ã ã¯ã¼ã¯ã§å¾æ¹äºæã100%ç¶æãã¦ãã代ç©ãªãã¦åå¨ããªãã¨ãã£ã¦ããã§ãããããããã°ã£ããã¯ãããããªããã¾ããããã£ããã¬ã¼ã ã¯ã¼ã¯é½åã§å£ããå ´åã§ãããã®æ®ã©ãå®è¡æã¨ã©ã¼ã¨ããå½¢ã§ã¯ãªããã³ã³ãã¤ã«æã«æ»ãã§ãããã®ã§å端ã«åããããããã¨ããªãã®ã§å¬ããã
éçºä½é¨
ãã¦ãéçºç°å¢ã¯éçºé度ããã³éçºä½é¨ã«ç´çµããããé常ã«éè¦ã§ãã
C# ã§éçºããã«ããã£ã¦ã¯ãVisual Studio ã Rider (Jetbrains) ãç¨ããäºã«ãªãã¾ãã æè¿ã§ã¯ã¡ããã¡ãã Visual Studio Code æ´¾ãåå¨ãã¾ãã (AI 絡ã¿ã®æ©è½ãæ±ã㦠VS Code 使ã£ã¦ãã人ãå¢ãã¦ãããããªæ°ããã¾ã)ãã¾ãæ®ã©ã® C#er ã IDE ã使ã£ã¦ããã¨ãã£ã¦è¯ããããªç¶æ ã§ããVisual Studio 㨠Rider ã¯åæ¹ã¨ãã«åç¨å©ç¨ã§ãªããã°ç¡æã§å©ç¨ã§ãã¾ããC# ã®éçºç°å¢ã¯ãåºæ¬çã« IDE 㨠.NET SDK ããã¤ã³ã¹ãã¼ã«ãã¦ãã¾ãã°ãã¨ãã«é¢åãªæé ããªãéçºç°å¢ãæ´ãã¾ãããããã¬ãªã©ãå©ç¨ããããã®é¢åãªæé ãããããã«ä½¿ããããã«ãªãã¾ãã
ããã§ IDE ç¡æãããªãããããã ï¼ã¨ãã声ãèããã¦ãã¾ãããçãããæ¹¯æ°´ã®ããã«æº¶ããã¦ããã¯ã©ã¦ãè²»ç¨ãèªåéã®äººä»¶è²»ãèãã¦ã¿ã¦ãã ãããçç£æ§ãä½ãéçºç°å¢ã§éçºããåçåä»ãè¨èªã§ããã°ã£ã¦ãã¹ããæ¸ããåã§æåãä¿è¨¼ã§ããªãäºã«æéã¨èªåèªèº«ã®ç²¾ç¥ãåãã人件費ãåãæµããããã©ã¼ãã³ã¹ãä½ãè¨èªãç¨ããäºã«ãããµã¼ãã¼ã®ä¸¦åå°æ°ãå¢ããç¡é§ã«è¨ç®è³æºãå¿
è¦ã¨ãçµæã¨ãã¦ã¯ã©ã¦ãè²»ç¨ã溶ãã...ãRuby on Rails ã Django ãããã©ã¼ãã³ã¹ãæªããã¨ã¯ä¸çªåãã«ã示ãããéãã§ãããããã¯ã©ã¦ãè²»ç¨ããã¶ããã¶ããã«æ¨ã¦ã¦ããã¨ãã£ã¦ãéè¨ã§ã¯ãªãã§ããããIDE ã使ã£ã¦å¿«é©ãã¤é«éã«éçºããC# ã使ã£ã¦ããã©ã¼ãã³ã¹ããã½ããã¦ã§ã¢ãéçºããã°ãããã«å
ã¯åããã§ããããæ°è¦ã®ããã¸ã§ã¯ãã§ Rails ã¨ã Laravel ãªã©ã®ããã©ã¼ãã³ã¹ãåºãªããã®ãæ¡ç¨ãã¦ä¸¦åå°æ°èªã£ã¦ããã®ã©ããã¨æãã¾ããã¨ããããããªãã ãããçµå± OSS ã好ãã¨ãè¨ã£ã¦ããã©ç¡æãªã®ã好ããªã ãã§ããï½ãã¨ãç
½ãããã®ã§ããã¯ã©ã¦ãè²»ç¨ãªã©ãã¡ããå å³ãã¦èããã»ããããã
IDE ã使ããã¨ã«ãã£ã¦ãããããäºããªã¢ã«ã¿ã¤ã ã«ãããã¦æ£ç¢ºã«ææããã.(ããã)ãæ¼ãã°ä½¿ããã¡ã½ããä¸è¦§ãåºã¦ããã®ã§ããã tab ã§é¸æãã¦ä½¿ã£ã¦...ãªã©ã®ä½é¨ã¯é常ã«ãªãºãã«ã«ãªéçºãå®ç¾ãã¦ããã¾ããéçåä»ãè¨èªã¨ IDE ã使ããã¨ã§ã縦横ç¡å°½ã«ã³ã¼ããé§ãå·¡ããä¿®æ£ã IDE ã®æ©è½çµç±ã§è¡ããã¨ã«ããããã¡ã¤ã«ããã£ã¡ãã£ã¡é£ã³åã£ã¦ã¡ã¾ã¡ã¾æä½æ¥ã§ä¿®æ£ãããªã©ã®èç¡ãè¡ãå¿
è¦ããªããªãã¾ãã
ã¡ãªã¿ã«ã³ã¼ãã£ã³ã°ä¸ã«ããããè§£æãã¦ãªã¢ã«ã¿ã¤ã ã«éçºè
ã«ããããææãã¦ãããæ©è½ãç¾ä»£ã§ã¯ Language Server ããã³ Language Server Protocol ããã¾ãã¾ãªè¨èªåãã«æä¾ãããäºã«ãã£ã¦ãIDE ã§ã¯ãªã Visual Studio Code ãªã©ã®ã¨ãã£ã¿ã§ãããç¨åº¦å®ç¾ãã¦ãã¾ããLanguage Server ã®å¤ããå
é¨çã«ã¯ red green trees ã¨ãããã¼ã¿æ§é ãç¨ãã¦å®è£
ãã¦ããããããã§ãªãå ´åã§ã red green trees ã«å¤§ããªå½±é¿ãåãã¦ãã¾ããå®ã¯ãã® red green trees ã¨ãã代ç©ãC# ã®ã³ã³ãã¤ã©ã§ãã Roslyn ã®éçºãã¼ã ã C# ã®éçºä½é¨ãåä¸ãããããã«çºæãããã®ã ã£ãããã¾ããC# ã¯å¸¸ã«éçºçç£æ§ãéè¦ãã¦éçºããã¦ãã¾ãããããã®ããããæããé常ã«èãããã¦ä½ããã¦ãããå
é²çãasync/await ã«éãããããããé¢ã§ãã©ã®è¨èªãçä¼¼ãããããªããããåªãã¦ããããã§ãã
ããã¦ãªã«ãããããã¬ã§ããç¹ã«é¢åãªè¨å®ããããIDE ã®ãã¿ã³1ã¤ã§ããã«ä½¿ãã¾ãããããã¬ã使ãäºã«ããã1è¡1è¡ã¹ãããå®è¡ããªããå¦çã®ä¸èº«ã確èªããå¦çã追ã£ãããäºãã§ãã¾ããã夿°ã®ä¸èº«ããããã確èªã§ãã¾ããã¤ã³ã¿ã©ã¯ãã£ãã«ãªãã¸ã§ã¯ãã®ä¸èº«ãè¦ãäºãã§ããã®ã§ãäºåã«åé¡ç®æãæ¨å®ãã¦ãããééã£ã¦ããã¨ãã¦ããå¨è¾ºãå«ãã¦èª¿æ»ã§ããã®ã§é常ã«å¿«é©ã§ããã¾ãå®è¡æã«ãã®å ´ã®å¤æ°ãç¨ããå¼ãè¨è¿°ããããã°ããäºãã§ãã¾ã (watch å¼ ã¨ããã¾ã)ãèªåèªèº«ãæ¸ããã³ã¼ãã§ã¯ãªããå¤é¨ã®ã©ã¤ãã©ãªãæä¾ããåã®ãªãã¸ã§ã¯ãããããã¬ã使ããã¨ã§ã©ã®ãããªç¶æ ãæã¡ã©ã®ããã«æ¯èã£ã¦ããã®ãæè§£ã«ãªãã¾ããprint debug ã¨ããã£ã¦ãã¨ãä½åº¦ãæªããç®æãæ¨å®ãã¦ãªãã¸ã§ã¯ãã®ä¸èº«ãã³ã³ã½ã¼ã«ã«åºåãã¦ãããã§ãè¶³ããªãäºã夿ãã¦ã¾ã print ããç®æãããç®æãå¢ããã¦åãã«ããã¦åå®è¡ãã¦ããã§ãåãããªãããã¾ã print ããç®æå¢ããã¦...ã¨ããèç¡ãªéçºã«ã¼ããåãã¦æéãç¡é§ã«ããå¿ è¦ãã§ã¦ãã¾ããããããã¬ã使ãã°ãããªäºã«ã¯ãªãã¾ãããprint ãããã°ã¯æå¾ã®æå¾ã®æå¾ã®ææ®µãããã«æã£ãã»ããè¯ãã§ããããprint ãããã°ãããããã« print ãé©åãªç®æã«å·®ãè¾¼ããäºãéçºè ã«ã¨ã£ã¦éè¦ãªã¹ãã«ã ããªã©ã¨ä¸»å¼µããæ¹ããã¾ããããããª20å¹´ã¯æä»£é ããªæ¯è¨ã¯ç¡è¦ãã¦ãããã¬ã使ãã¾ãããã
ã¾ããããã¬ã¯èªåãæ¸ããã³ã¼ããæå¾ ããéãã«åãã¦ããã確èªããããããã°ãããããã ãã§ãªããä»äººãæ¸ããã³ã¼ããèªãã®ã«ã大ããªä¾¡å¤ãããããã¦ããã¾ããä»äººãæ¸ããã³ã¼ãã®å ´åãã©ã®ãããªå¦çããã¦æãã æ¯ãèããå®ç¾ãã¦ããã®ããæ¦ãåãããªãã¨ããããã¹ã¿ã¼ããã¾ãããã®ãããªå ´åãã¾ãã¯ãããã¬ãã¢ã¿ããããªããå®è¡ããã¹ãããå®è¡ã«ãã£ã¦å ·ä½çãªå¦çã追ã£ããã¦ãã¾ãã®ãçè§£ã¸ã®æ©éã§ããè¤éãªãã®ãªãç¶æ´ã§ããç§ã¯ OSS ãèªãéã«ã¯ãããã¬ããã«æ´»ç¨ãã¦ãã¾ããã¨ããã OSS ãèªã¿è§£ãã®ã«ãããã¬ç¡ãã¯çè§£ã®é度ãã¬ã¯ãã¨è½ã¡ã¦ãã¾ãã®ã§ãããªãã·ã³ãã¤ã§ããã¾ããã¹ãããããã¬ãã¢ã¿ããããªããã¹ãããå®è¡ããæ°ã«ãªãç®æã1è¡1è¡å®è¡ããªããèªãäºã«ãã£ã¦ãé¢å¿ã®å¯¾è±¡ã¨ãªã£ã¦ããå¦çãå®éã©ã®ããã«æ¯èã£ã¦ããã®ããç°¡åã«çè§£ã§ããããã«ãªãã¾ããã³ã¼ããèªãã§è³ã¿ãã§å¶å¾¡ããã¼èããã®ã大äºã§ããããã¨ä»äººãæ¸ããã³ã¼ãã«é¢ãã¦ã¯ãããã¬ã使ã£ã¦çè§£ãæ·±ãã¦ãã£ã¦ãã¾ã£ãã»ããæ©ãã§ãã
ããã¯ããã¨ã¡ãã»ããã¹ããæ¸ããããããã¬ãããªãæ´¾é¥ã®äººã«åºä¼ãã®ã§ãã(ããé©ããã¨ã«1人ã2人ãããªããã§ããããã©ãç±æ¥ã®æç¾©ãªã®ãã¯ä¸æã§ãã...)ãå
¨å¡ãã³ãã³å¦æ´¾ãªã®ã§ããããï¼å人çã«ãã³ãã³å¦æ´¾ã¯èç¡ãã®ãã®ã ã¨æãã®ã§ãããã¾ãããããæç¾©ã§ãã£ã¦ãããªããããã¬ã¯ãããããããããªãããããã¾ããã
ãããå¤å
¸å¦æ´¾ã®ã¹ã¿ã¤ã«ã§ãã¹ãæ¸ããªã絶対ã«ãããã¬ã¯æç¨ã ã¨æãã¾ãã
ä¸è¬çã«å®è£
ã®è©³ç´°ããã¹ãããäºã¯ã¢ã³ããã¿ã¼ã³ã¨ãã¦ç¥ããã¦ãã¾ãã
䏿¹ã§ãããã¬ã¯å®è£
ã®è©³ç´°ãã®ãã®ã追ã£ãããããã®ãã®ã§ãã
ãªã®ã§æ
ãã¹ãå½¹å²ãã¾ã£ããç°ãªãããã§ãã
ãã¹ãæ¸ãã¦ãããããããã¬è¦ããªãæ´¾é¥ã®äººã
ã¯å²ã¨çå£ã«å®è£
ã®è©³ç´°ããã¹ãããã¨ããã¢ã³ããã¿ã¼ã³ãè¸ãã§ããå¯è½æ§ãèæ
®ããæ¹ãè¯ãã®ã§ã¯ãªãã§ããããï¼
ããã¦ãã¹ãæ¸ããããããã¬ãããã¨ãè¨ã£ã¦ãã人ã«éã£ã¦ print ãããã°ã¨ãããèç¡ããã£ã¦ããäºãå¤ãæ°ããã¾ããã¤ã¹ãã¹è¨ããã«ãããã¬ã使ãã¾ããããC# ã«éããä»ã®è¨èªãç°å¢ãåæ§ã§ãReact ã¨ãã§ããã³ãã¨ã³ãéçºãã¦ãããªã React Developer Tools ã¨ããæ´»ç¨ãã¾ããããconsole.log ã console.debug ã«ãããããã°ã¨ãèç¡ã§ããèç¡ã
便å©ãªãã®ã¯ä½¿ã£ã¦ããã¾ãããã
ãããã¬ã«å¯¾ãã¦ãããã¨ã¢ã¬ã«ã®ã¼åå¿èµ·ããæ¹ãããã®ã§ãããæ¬å½ã«ä½æ
ãªãã§ãããã...ãããã¬ä»¥å¤ã®ä¾¿å©ãªãã®ã¯æ®éã«ãããã使ã£ã¦ããã§ãããã«...ã
å ãã¦ä¸ã®ä¸ã§ã¯æ°¸é 㨠IDE ã¨ã¨ãã£ã¿è«äºãè¡ããã¦ããäºã¯å¨ç¥ã®äºå®ãã¨æãã¾ãã å人çãªæè¦ã¨ãã¦ã¯ãã¨ãã£ã¿ãã«ã¹ã¿ãã¤ãºãã¾ãã人ã¯å¥ã«ã¨ãã£ã¿ä½¿ãã°ããã¨æãã¾ãã ã§ããã¶ã£ã¡ããä¸ã®ä¸ã®å¤§åã®ã¨ã³ã¸ãã¢ã¯ãããªã¨ãã£ã¿ã®ã«ã¹ã¿ãã¤ãºã«ç±æã注ãã¾ãã...! VSCode ã使ã£ã¦ããå ´åã§ããã¨ãã£ã¿ã¨ãã¦ã®åºæ¬çãªæ©è½ã§ããç¥ããçç£æ§ã®ä½ãéçºããã¦ãã人ãå¤ãã¨ããã®ãå人çãªä½æã§ãã ãªã®ã§å¤§åã®äººã«ã¯æåãã IDE ãæ¸¡ããå¿«é©ãªéçºä½é¨ããã¦ããã£ãã»ããè¯ãã¨æãã¾ãã ããããã¨ãã£ã¿ã«èå³ããã£ãå ´åã¯ç§»è¡ãã¦ã¿ããããã°ããã ãã§ãã çµå±ã便å©ãªãã®ãç¥ããªãã¨çç£æ§ã®ä½ãéçºã«ã¤ãã¦ä½ãçåãæ±ããªããã®ã§ããã便å©ãªãã®ãä¸åº¦ç¥ã£ã¦ãã¾ã£ãããããããã使ããªãã¨è¦çã§è¦çã§ãã¾ããªããªããã®ã§ããããã¨ãã£ã¿ã§ãåç以ä¸ã®éçºä½é¨ãæ§ç¯ããã¹ãé å¼µãããã§ãããããããç¥ããªãã¨ã©ãã«ããªãã¾ããã ããããæå³ã§ããä¸åº¦ IDE ãæ¸¡ãã¦ãã¾ãã°ããã¨æãã¾ãã ã¾ããã¢ããã¨ãããæã¯ IDE ã®ä½¿ãæ¹ãä¸ç·ã«ããããæããããã«ãã¦ãã¾ãããã¨ãã£ã¿ã®å ´åãã®æ¡å¼µããã¦äºã ã¿ãããªã®ãçºçããããå¾ã¾ãããããããã£ãæéãä¸åçºçããããã®ã·ã§ã¼ãã«ããå©ãã¦ã¿ï½ãã¿ãããªã®ã§å®çµããã®ã§è¯ãã§ãã
C# ã¯ä¸ççã«äººæ°
ããã¾ã人æ°ã ã®ã©ãã®ã¨ããã®ã¯è¨ããããªãã®ã§ããããããªãã§ C# ã§æ¸ãã¦ããã®ï¼ï¼ãã¨ãããã¾ãã§ C# ããã¤ãã¼è¨èªã§ãããã®ãããªäºãè¨ãããäºãä¸åº¦ãäºåº¦ã§ã¯ãªãã®ã§ãä¸ççã«äººæ°ãããè¨èªã§ãã£ã¦å¥ã«ãã¤ãã¼ãªè¨èªã§ããªãã§ããªãã®ã ããã¨ããã®ã ãã¯ç¤ºãã¦ããããã¨æãã¾ãã
GitHub ãåºãã¦ãã2024å¹´ã®èª¿æ»ã§ã¯ C# ã¯5ä½ã«ä½ç½®ä»ãã¦ãã¾ãã AI 絡ã¿ã§ä½æãããªã Pythonãweb ããã³ãæ¸ããªã JavaScript/TypeScript ã¿ãããªç¾ä»£ã«ããã¦å¿ éåã¨ãªã£ã¦ããè¨èªãä¸ä½ã«æ¥ã¦ãã¾ãããã®æ¬¡ã«æ ¹å¼·ã人æ°ã® Java ãæ¥ã¦ã次ç¹ã§ C# ã¨ããæãã

stack overflow ãæ¯å¹´å ¬éãã¦ãã人æ°èª¿æ» ã§ãä¼¼ããããªæãã§ãWEB ããã³ãã«å¿ é 㪠JavaScript/TypeScriptãAI ã§å¿ é 㪠Python ãæ¥ã¦ããã®æ¬¡ã« Java, ãã㦠C# ã¨ãã£ãæãã§ããRust ã Go ãã人æ°ã§ãããå®ä¸çã§ã¬ã³ã¬ã³ä½¿ããã¦ããäºã伺ãã¾ãã

Web framework ã«ããã¦ã¯ã©ãã§ããããï¼ä¸ä½ã«ä½ç½®ä»ãã¦ããã®ã¯ã»ã¼ããã³ãã¨ã³ãã®ãã¬ã¼ã ã¯ã¼ã¯ã§ããããããã¯ã¨ã³ãã®ãã¬ã¼ã ã¯ã¼ã¯äººæ°çã«ã¯äºå®ä¸2ä½ã«ä½ç½®ä»ãã¦ãã¾ãã

ããã¦ãã以å¤ã®ãã¬ã¼ã ã¯ã¼ã¯ã«ããã¦ã¯ .NET ãå ã ã®ç¬¬ä¸ä½ã§ãã

C# ã¨ãã®ãã¬ã¼ã ã¯ã¼ã¯éã¯ä¸ççã«ã¯é常ã«äººæ°ãããã®ã§ããä¸ççã«èãã¦ãããããªãã§ C# ã§æ¸ãã¦ããã®ï¼ï¼ãã¨ãè¨ããããããªè¨èªã§ã¯ããã¾ãã...!
ä»è¨èªã¨æ¯è¼ãã¦
ãã¦ãããã¾ã§èªãã çããã®ä¸ã«ã¯ãç´¹ä»ããã¦ãã C# ã®è¨èªæ©è½ (ãããã¯æ¨æºã©ã¤ãã©ãª)ãå¥ã®è¨èªã«ãåå¨ããã ãï¼ããªã©ã¨è¨ããããªãæ¹ãããããããã¾ããã
å®éãrecord ç¸å½ã®æ©è½ã¯ Java ã«ãããã¾ãã æ¡å¼µã¡ã½ããã§ããã°ãKotlin ã®å ´åã¯æ¡å¼µé¢æ°ãSwift ã®å ´å㯠extensions ãªã©ãããã¾ãããRust ãªããããã¬ã¤ããé§ä½¿ããã° C# ã®æ¡å¼µã¡ã½ããã»ã©èªç±ã§ã¯ããã¾ãããããç¨åº¦ä¼¼ããããªãã¨ãã§ãã¾ãã LINQ ãåæ§ã§ãRust ãªããã®ã¤ãã¬ã¼ã¿ã«å¯¾ãã¦åçã®é å»¶è©ä¾¡ãè¡ãã¡ã½ãããåå¨ãã¾ãããKotlin ã§ã Iterable interface ã«å¯¾ããæ¡å¼µé¢æ°ã¨ã㦠LINQ ç¸å½ã®ãã®ãæ¨æºã©ã¤ãã©ãªã«ç¨æããã¦ãããä¸å·¥å¤«ããã°é å»¶è©ä¾¡ãã§ãã¾ãã
ããããªããå ¨ä½ãã¿ãã°ããã¯ã C# ã«è½ã¡çãã¾ãã ãã¨ãã° Java/Kotlin ãªã©ã® JVM ç³»ã¯ã¦ã¼ã¶å®ç¾©ã®å¤åã使ã§ããªãã£ãããã¸ã§ããªã¯ã¹ã®åæ å ±ã¯type erasure ã«ãã£ã¦å¹ãé£ã³ã¾ãããã㦠Rust ã¯æ¨æºã©ã¤ãã©ãªãã¨ã«ããèãã®ã§å¤é¨ã®ããã±ã¼ã¸ãã©ãã©ã追å ããªããã°ãªãã¾ããããããéåæã©ã³ã¿ã¤ã ã¨ããåºç¤ã«ãããã¨ããããã ã¾ã GC ã許容ãããªãç°å¢ã仿§ãæ±ããããã®ã§ããã° Rust ãæ¸ãä»ãªãã®ã§ãã (å°ãªãã¨ãç§ã¯ãã C/C++ ã«ã¯æ»ããªããæ»ããããªã)ãããã§ãªããªã C# ããã¯ãè¯ãã§ããããã¾ã C# 以å¤ã®è¨èªã®å¤é¨ããã±ã¼ã¸ã¯å¤§æ¦æ¨ç§»çä¾åãã¤ãã¤äºã«ãªã£ã¦ãã¾ããã (npm ããã®çé )ãå©ç¨ãã¦ããå¤é¨ããã±ã¼ã¸ã®çè§£ãã¡ã³ãã¨ãã£ãé¢ã§ãå®ç¨ä¸åªãã¦ãã¾ãã
ã¡ãªã¿ã«ããã¾ã§ãã¾ã Go lang ã«è§¦ãã¦ããªãã®ã§ãããå°ã触ãã¦ããããã¨æãã¾ãã å人çã« Go lang ã®è¨èªæ©è½ã¯ãã¾ãã«ãèããè¦çãæããã¬ãã«ã§ããã¾ã Go ã«ã¯ä¸å¤®é権ãªãã±ç®¡ãåå¨ãããå¤é¨ã®ããã±ã¼ã¸ä½¿ãã«ãã¦ã GitHub ä¸ã®ã¬ãã¸ããªçã uri ã§æå®ããæ¹å¼ã§ããä¸å¤®é権ãªãã±ç®¡ããªãã®ã§ GitHub ä¸ãããã®ã½ã¼ã¹ã³ã¼ããæ¶ãé£ã°ãããã峿ã«å©ç¨ã§ããªããªãã¾ããä»è¨èªã®ãã±ç®¡ã ã¨ãã»ã©ã®äº (ã»ãã¥ãªãã£ã¨ãæ³çãªçç±ã¨ã) ããªãã¨ç°¡åã«ããã±ã¼ã¸ãæ¶ãã¾ããããããããã£ããªã¹ã¯ãæ±ããã«æ¸ãã®ã§ãã...ãä¸å¤®é権ãå«ã ãã¨ããæ°æã¡ã¯çè§£ã§ããªãã§ããªãã§ãããä¸å¤®é権ã«ããªãäºã®ãã¡ãªããã®æ¹ãä¸åã£ã¦ããã¨æãã¾ãã ããã«ããã±ã¼ã¸ã®ãã¼ã¸ã§ã³æå®ã¨ããããããåºæ¬çãªäºã§ãããGo lang ã®ç»å ´ããã ãã¶æéãç½®ããå¾ãã£ã¨ããå®ç¾ãããã¨ããå§æ«ã å®ç¨ä¸ä¸ä¾¿ã§ããããã¾ããã generics ãåæ§ã§ãGo lang ã« generics ãå°å ¥ãããã¾ã§ã®éãGo ã«ã¯ generics ããªããããããã ãã¨è±ªèªãã¦ããæ¹ã ããã¾ããããçµå±å¾ããå°å ¥ããã¾ããããå°å ¥ãããããããã§ãªãããããçããåãã§ãããããã¨ããã Go lang ã¯ãã®æã®ãä»ã®è¨èªã«ã¯å½ç¶ããããç¾ç¶è¶³ããªããã®ãåãå ¥ãã¦ã¾ã§ä½¿ãããããã®ã¢ããã¼ã·ã§ã³ãç¡ãéãå®ç¨ã¯æ£ç´ããã©ããã®ãããã¨æãã¦ãã¾ãã 主è¦ãªããã°ã©ãã³ã°è¨èªã¨ãã¦ã¯ããªãå¾çºãªã®ã«ãã©ããã¦ç¾ä»£ã«ããã¦å¿ é ã¨åããåã£ã¦ããæ©è½ã®å°å ¥ããããã¨é ãã®ãã ããã« Go ã®è¨èªä»æ§ã¯èãã¦è¯ãï¼ã¨ãããã¨ãã£ã¦ãã人ã ããã¾ãããè¨èªä»æ§ãèããã¨ã®ã¡ãªãããªãã¦è¨èªã®ã³ã³ãã¤ã©ããã©ã³ã¿ã¤ã å®è£ ããªãæ®ã©ã®äººã ã«ã¨ã£ã¦å¬ããã®ãã¯éå¸¸ã«æççã§ã (ãã¡ãã C++ ã®ãããªè¤éãªä»æ§ãç¡éã«ããã¨ä»äººãæ¸ããé»éè¡ã«è¿ãã³ã¼ãèªããªãã¤ããã¨ãã¯ããã¾ããããããªã® C++ ããããªãã®ã§ããã)ã ãã¼ã éçºã«ããã¦ãã¼ã ã¡ã³ãã¼ãã¾ã¨ããªã³ã¼ããæ¸ãã¦ãããªããã¨ã«çµ¶æã㦠Go lang ã鏿ããã¨ããã®ã¯é常ã«ãããããªè©±ã§ãã...ã
åçåä»ãã¯...è¨ãããããªã
ã¨ã¯ãããè¨èªã®ä¾¡å¤ã¯ããã©ã¼ãã³ã¹ããã®ç¹æ§ã°ãããå ¨ã¦ã§ã¯ããã¾ããã ãã®è¨èªãä¸å¿ã«æ§æããã¦ããã¨ã³ã·ã¹ãã ãéè¦ã§ãã Python ãªãããããé¡èã§ãè¨èªèªä½ããã±ç®¡ãªã©ã¯ãã¾ãã«ãæ¸ãã§ãããnumpy ãä¸å¿ã¨ããæ©æ¢°å¦ç¿ç³»ã®ã©ã¤ãã©ãªã¯ãã¯ãå¯ä¸ç¡äºã§æ©æ¢°å¦ç¿ã«ãããããªããã¯ãé¿ãã¦éãã¾ããããããã¯ããã§é常ã«ä¾¡å¤ãããã¾ã (ã¨ã¯ãã Python ã§æ¸ãã®ãããã±ã¼ã¸ã®ã¡ã³ãããã¾ããè¾ãã®ã§ããã誰ãå©ãã¦ãã)ã Go lang ãªããã k8s ãªã©ã¨åãåãå§ãããå¿ é ã§ããããã¤ãã£ãã¾ããã®è«¸ã ã«ãããããªã C/C++ ã¯å¿ é ãªä¸ã«éå»ã®è¨å¤§ãªè³ç£ãæ±ãã¦ãã¾ãããããããã£ãé¢ã§ã®ä¾¡å¤ãããã¾ãã
ã¾ããããã¾ã§ãããã°ã©ãã³ã°è¨èªã¯éå ·ã§ããããã ããã©ã¼ãã³ã¹ãããä¸è¦ãªè¦ãã¿ãæ±ããã課é¡ã解決ã§ããã°è¯ãã§ãããã ç§ã¯ C# ããã¾ãã¾ãªé¢ã§åªãã¦ããã¨èãã¦ããã®ã§ C# ãæ¨ãã¾ãããã¨ã³ã·ã¹ãã çãªé¢ã¯ã©ããã¦ãä»è¨èªãæé©ãªå ´åã¯åå¨ãã¾ãã ãããã£ãå ´åã¯ã¨ã³ã·ã¹ãã çã«ç®çã«é©ããè¨èªãé¸ã¹ã°ããã§ããã (ç©ä¾¿ãªçµè«)ã
ã¡ãªã¿ã«æè¿ã 㨠TypeScript ã®ã³ã³ãã¤ã©ã TypeScript ãã Go lang ã« port ãã10åé«éã«ãªã£ãäºã話é¡ã«ãªãã¾ããã åç»ã§ã Anders Hejlsberg ããJavaScript runtime 㯠UI ããã©ã¦ã¶ã«æé©åããã¦ãããã³ã³ãã¤ã©çã®è¨ç®ä¸å¿ã¯ã¼ã¯ãã¼ãã«æé©åããã¦ããªããã¨ããçºè¨ãã¦ããäºãããåããéããå¥ã« JavaScript (ããã³ TypeScript) ã¯è¨ç®å¦çã®é¢ã«ããã¦é«éãªããã§ã¯ããã¾ããã Go ã« port ããã¦10åé«éã«ãªã£ã¦ããäºãããããã¯æããã§ããããã¡ãªã¿ã«å¾¡ä»ãããã©ã¼ãã³ã¹ãæªãäºã«ã¤ãã¦ãéãæµªè²»ãã¦ãããã¨åç»ã®ä¸ã§ãçºè¨ããã¦ããããã¾ããä¸è¦ãªéã¯æº¶ãããããªãã§ããããããã¯ãããã©ã¼ãã³ã¹ã¯å¤§äºã ããã¦ï¼ãªã«ãã C# ã§ã Rust ã§ããªã Go lang ãç¨ãããã¦ããäºãããã¢ã³ã C# å¢ããã¯ãTypeScript 㯠Microsoft ã®è¨èªãªã®ã« C# ãããªã㦠Go lang 使ã£ã¦ããããï¼C# ãªã¯ã³ã³wwwãã¨ããC# ã®çã¿ã®è¦ªã§ãã Anders Hejlsberg èªèº«ã C# ãããªã㦠Go lang æ¡ç¨ãã¦ãããããï¼C# ãªã¯ã³ã³wwwããªã©ã¨ç ½ãããã®ã§ãããã¡ããã¨åç»ãã¿ã¦ãã ãã (ã¨ãããé¢ç½ãã®ã§è¦ãã¨ããã¨æãã¾ã)ã Anders Hejlsberg ããport (ç§»æ¤) ã§ãã rewrite (åå®è£ ) ã§ã¯ãªããäºã強調ãã¦ããäºã«æ³¨ç®ãã¦ãã ããã æ¢åã® TypeScript ã®å®è£ ããã®ã¾ã¾ port ãã¦ããã©ã¼ãã³ã¹ãåä¸ãããããã¨ããå¼·ãã¢ããã¼ã·ã§ã³ããã£ãããã§ãã ããã¦æ§ã ãªè¨èªã§ãããã¿ã¤ãã³ã°ããçµæãport ã«æãé©ãã¦ããã®ã Go lang ã ã£ãã®ã§ãGo lang ãæ¡ç¨ããäºã«ããããã§ãã å®è£ ãæ®ã©åä¸ã§ (ä½ãã port ãªã®ã§)ããªãã¨æ¨æºåºåã«å¯¾ããã¨ã©ã¼ã¡ãã»ã¼ã¸ã¾ã§åãå½¢å¼ã«ãªã£ã¦ãã¾ãã å®éå ¨ã¦ã®äºæãç¶æããã¾ã¾ rewrite ããã®ã¯é常ã«å°é£ã§ããããããå½ç¶ã¨ããã°å½ç¶ã ãã®ããæ¨æºåºåã«å¯¾ãã表示ãªã©ãç¾ç¶ç¶æãããã¨æãã¨ããã rewrite ãªãã鏿ããªãã...ã¨ããæãã 御ä»ããã©ãã㦠C# ã Rust ã C++ ç (ã®ä»»æã®èªåã®å¥½ããªè¨èª) ã§å®è£ ããã¦ããªããã ï¼ãã¨ãããªã¢ã¯ã·ã§ã³ãæ¥ãäºã¯åãã£ã¦ããããã§ããã®ãããªå½¢ã§åç»å ã«ã«ã¦ã³ã¿ã¼ãç¨æããã¦ãã¾ããã ããã°ã©ãã³ã°è¨èªã¯éå ·ã§ãããé©åãªãã®ãé¸ã¼ããã¨ããã®ãä½ç¾ãã¦ãã Anders Hejlsbergããã¼ãæµç³ã ...ã
使 C# ã好ãã®ã
C# ã«ã¯ããã ãã®å©ç¹ãåå¨ãã¾ããããã©ã¼ãã³ã¹ããããä»ã®è¨èªãå©ç¨ãã¦ããéã«çºçããæ§ã ãªè¦çãåå¨ãã¾ãã...ã¨ããã®ã¯è¨ãéãããã§ãããå§åçã«å¿«é©ã§ããäºã¯ééãããã¾ãããã¨ãããã¨ã§ãçããã C# ã§éçºãã¾ãããï¼
- åªããããã©ã¼ãã³ã¹
- è¨ç®å¦çã®éã
- éåæ IO æ§è½
- ãã«ãã³ã¢ã»ãã«ãã¹ã¬ããæ§è½
- ãµã¼ãã¹ã®å ´åã¯...
- ã¦ã¼ã¶ãå¬ããï¼
- éå¶ãã¯ã©ã¦ã/ãªã³ãã¬è²»ç¨ãæãããã¦å¬ããï¼
- ããã©ã¼ãã³ã¹å½ãªã²ã¼ã ãåé¡ãªãéçºã§ãã
- ãã㯠Unity ã Godot çã§ä½ãããå¤ãã®ã²ã¼ã ãåå¨ããäºãã証æããã¦ãã¾ã
- ãªã¼ãã³ã½ã¼ã¹
- ãã¯ããªã¼ãã³ã½ã¼ã¹ã ã¨æ°ã«ãªã£ããã½ã¼ã¹ã³ã¼ãèªããã®ã§å¬ãã
- ã¯ãã¹ãã©ãããã©ã¼ã
- å½ç¶ Linux ã§ãåãã¾ããã³ã³ããããªãã£ãæç¾¤ã§ã
- Windows ã§ããåããªãã¨ããèªèã¯æ©æ¥ã«æ¨ã¦ã¦ãã ãã
- è¨èªä½¿ç¨ä¸ã®å©ç¹
- struct/class/ref struct/record
- null å®å ¨
- æ¡å¼µã¡ã½ãã
- ååãæ¨æºã©ã¤ãã©ãª
- å¤ãã®ç®æã§æ¨æºã©ã¤ãã©ãªã使ããããããä»äººãæ¸ããã³ã¼ããèªãã®ãæ¨æºã©ã¤ãã©ãªãææ¡ãã¦ããã°é«éã«çè§£å¯è½
- OSS ã®ã©ã¤ãã©ãªã§ãæ¨æºã©ã¤ãã©ãªãå©ç¨ãããäºãå¤ããããã©ãã®ã©ã¤ãã©ãªç±æ¥ã® API ããåãããªãã³ã¼ããèªãå¿ è¦ããªãã®ã§ãå§åçã«ãªã¼ãã£ã³ã°ãæã
- é常ã®ã³ã¬ã¯ã·ã§ã³ãã³ã³ã«ã¬ã³ããªã³ã¬ã¯ã·ã§ã³ãLINQ ãªã©ã¯æåãå¤ããäºãªãã.NET ã® version ããããã¨ã¨ãã«é«éåãå³ããã¦ããããã
- å¤ãã®ç®æã§æ¨æºã©ã¤ãã©ãªã使ããããããä»äººãæ¸ããã³ã¼ããèªãã®ãæ¨æºã©ã¤ãã©ãªãææ¡ãã¦ããã°é«éã«çè§£å¯è½
- ä¸è¦ãªä¾åããªã OSS 群
- npm ã®ãããªæ¨ç§»çä¾åé¢ä¿å°çã«é¥ããªã
- ããã±ã¼ã¸ç®¡çã®è¦ãã¿ããè§£æ¾ããã
- å©ç¨ãããã©ã¤ãã©ãªã®ã³ã¼ãã®ã¿ã®çè§£ã«åªããã°ãã
- npm ã®ãããªæ¨ç§»çä¾åé¢ä¿å°çã«é¥ããªã
- å§åç徿¹äºæ
- å®å¿ã㦠C# åã³ .NET ã®ã©ã³ã¿ã¤ã version ãããããã
- åªç§ãªéåæã©ã³ã¿ã¤ã
- åªããéçºç°å¢
- IDE 㨠runtime ãã¤ã³ã¹ãã¼ã«ããã°ããã«éçºå¯è½
- é«éãªãã«ã
- ç ©éãªè¨å®ãããªãã¦ããã使ããåªç§ãªãããã¬