Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
泚
ãã®èšäºã§ã¯ãNull 蚱容åç §åã«ã€ããŠèª¬æããŸãã ãŸããNull 蚱容å€åã宣èšããããšãã§ããŸãã
null 蚱容察å¿ã³ã³ããã¹ãå ã®ã³ãŒãã§ã¯ ãnull 蚱容åç §åã䜿çšããŸãã Null 蚱容åç §åãNull ã¹ã¿ãã£ãã¯åæã®èŠåãNull å 逿Œç®åã¯ããªãã·ã§ã³ã®èšèªæ©èœã§ãã æ¢å®ã§ã¯ããã¹ãŠãªãã«ãªã£ãŠããŸãã ãããžã§ã¯ã ã¬ãã«ã§ null 蚱容ã³ã³ããã¹ã ãå¶åŸ¡ããã«ã¯ããã«ãèšå®ã䜿çšãããããã©ã°ãã䜿çšããŠã³ãŒãã§å¶åŸ¡ããŸãã
C# èšèªãªãã¡ã¬ã³ã¹ã«ã¯ãC# èšèªã®ææ°ãªãªãŒã¹ ããŒãžã§ã³ãèšèŒãããŠããŸãã ãŸããä»åŸã®èšèªãªãªãŒã¹ã®ãããªã㯠ãã¬ãã¥ãŒã®æ©èœã«é¢ããåæããã¥ã¡ã³ããå«ãŸããŠããŸãã
ãã®ããã¥ã¡ã³ãã§ã¯ãèšèªã®æåŸã® 3 ã€ã®ããŒãžã§ã³ãŸãã¯çŸåšã®ãããªã㯠ãã¬ãã¥ãŒã§æåã«å°å ¥ãããæ©èœãç¹å®ããŸãã
ãã³ã
C# ã§æ©èœãåããŠå°å ¥ãããææã確èªããã«ã¯ã C# èšèªããŒãžã§ã³å±¥æŽã«é¢ããèšäºãåç §ããŠãã ããã
éèŠ
ãã¹ãŠã®ãããžã§ã¯ã ãã³ãã¬ãŒãã§ããããžã§ã¯ãã«å¯Ÿã㊠㮠null 蚱容ã³ã³ããã¹ã ãæå¹ã«ãªããŸãã 以åã®ãã³ãã¬ãŒãã§äœæããããããžã§ã¯ãã«ã¯ãã®èŠçŽ ã¯å«ãŸããŸããããããã®æ©èœã¯ããããžã§ã¯ã ãã¡ã€ã«ã§æå¹ã«ãããããã©ã°ãã䜿çšããªãéããªãã§ãã
Null 蚱容èªèã³ã³ããã¹ãã§ã¯ã次ã®èŠåã䜿çšãããŸãã
- null 以å€ã®å€ã§
Tåç §åã®å€æ°ãåæåããå¿ èŠããããnullå¯èœæ§ã®ããå€ãå²ãåœãŠãããšã¯ãããŸããã -
T?ã䜿çšããŠnullåç §åã®å€æ°ãåæåããããnullãå²ãåœãŠãããšãã§ããŸãããéåç §ããåã«nullã«å¯ŸããŠç¢ºèªããå¿ èŠããããŸãã -
mã®ããã«ãT?åã®å€æ°m!ã« null 蚱容æŒç®åãé©çšãããšã倿°ã¯ null 以å€ãšèŠãªãããŸãã
ã³ã³ãã€ã©ã¯ãäžèšã®èŠåã䜿çšããŠãnull é蚱容åç
§å T ãš null 蚱容åç
§å T? ã®åºå¥ãé©çšããŸãã
T åã®å€æ°ãš T? åã®å€æ°ã¯ãåã .NET åã§ãã æ¬¡ã®äŸã¯ãNull é蚱容æååãš Null 蚱容æååã宣èšããNull å
逿Œç®åã䜿çšããŠãå€ã Null é蚱容æååã«å²ãåœãŠãŸãã
string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness
倿° notNull ãš nullable ã¯ã©ã¡ãã String åã䜿çšããŸãã null é蚱容åãš null 蚱容åã¯ã©ã¡ããåãåã䜿çšãããããè€æ°ã®å Žæã§ null 蚱容åç
§åã䜿çšããããšã¯ã§ããŸããã äžè¬ã«ãnull 蚱容åç
§åãåºåºã¯ã©ã¹ãŸãã¯å®è£
ã€ã³ã¿ãŒãã§ã€ã¹ãšããŠäœ¿çšããããšã¯ã§ããŸããã ãªããžã§ã¯ãã®äœæåŒãŸãã¯åãã¹ãåŒã§ null 蚱容åç
§åã䜿çšããããšã¯ã§ããŸããã null 蚱容åç
§åãã¡ã³ã㌠ã¢ã¯ã»ã¹åŒã®åãšããŠäœ¿çšããããšã¯ã§ããŸããã æ¬¡ã®äŸã¯ããããã®ã³ã³ã¹ãã©ã¯ãã瀺ããŸãã
public MyClass : System.Object? // not allowed
{
}
var nullEmpty = System.String?.Empty; // Not allowed
var maybeObject = new object?(); // Not allowed
try
{
if (thing is string? nullableString) // not allowed
Console.WriteLine(nullableString);
} catch (Exception? e) // Not Allowed
{
Console.WriteLine("error");
}
Null 蚱容åç §ãšã¹ã¿ãã£ãã¯åæ
åã®ã»ã¯ã·ã§ã³ã®äŸã¯ãNull 蚱容åç §åã®ç¹æ§ã瀺ããŠããŸãã Null 蚱容åç §åã¯æ°ããã¯ã©ã¹ã®åã§ã¯ãªããæ¢åã®åç §åã«å¯Ÿããæ³šéã§ãã ã³ã³ãã€ã©ã¯ããããã®æ³šéã䜿çšããŠããŠãŒã¶ãŒãã³ãŒãå ã§çºçããå¯èœæ§ã®ãã Null åç §ãšã©ãŒãæ€åºããããããŸãã Null é蚱容åç §åãš Null åç §åã®éã«ã¯ãã©ã³ã¿ã€ã ã®éãã¯ãããŸããã ã³ã³ãã€ã©ã¯ãNull é蚱容åç §åã®ã©ã³ã¿ã€ã ãã§ãã¯ã远å ããŸããã ãã®å©ç¹ã¯ãã³ã³ãã€ã«æåæã«ãããŸãã ã³ã³ãã€ã©ã¯ãã³ãŒãå ã§çºçããå¯èœæ§ã®ãã Null ãšã©ãŒã®æ€åºãšä¿®æ£ã«åœ¹ç«ã€èŠåãçæããŸãã æå³ã宣èšãããšãã³ã³ãã€ã©ã¯ãã³ãŒãããã®æå³ã«éåãããšãã«èŠåãçºè¡ããŸãã
éèŠ
Null 蚱容åç §æ³šéã§ã¯åäœã®å€æŽã¯çºçããŸããããä»ã®ã©ã€ãã©ãªã§ã¯ãªãã¬ã¯ã·ã§ã³ã䜿çšããŠãnull 蚱容åç §åãš null é蚱容åç §åã«å¯ŸããŠç°ãªãã©ã³ã¿ã€ã åäœãçæãããå ŽåããããŸãã ç¹ã«ãEntity Framework Core 㯠null èš±å®¹å±æ§ãèªã¿åããŸãã null 蚱容åç §ãçç¥å¯èœãªå€ãšããŠè§£éããnull é蚱容åç §ãå¿ èŠãªå€ãšããŠè§£éããŸãã
Null èš±å®¹ã®æå¹ãªã³ã³ããã¹ãã§ã¯ãã³ã³ãã€ã©ã¯ãNull 蚱容㚠Null é蚱容ã®äž¡æ¹ã®åç §åã®å€æ°ã«å¯ŸããŠã¹ã¿ãã£ãã¯åæãå®è¡ããŸãã ã³ã³ãã€ã©ã¯ãååç §å€æ°ã® "null ç¶æ " ã "null ã§ã¯ãªã" ãŸã㯠"null ãããããªã" ãšããŠè¿œè·¡ããŸãã Null é蚱容åç §ã®æ¢å®ã®ç¶æ ã¯ã"null ã§ã¯ãªã" ã§ãã Null 蚱容åç §ã®æ¢å®ã®ç¶æ ã¯ã"null ãããããªã" ã§ãã
Null é蚱容åç §åã® "null ç¶æ " 㯠"null ã§ã¯ãªã" ã§ããããããã®åã¯åžžã«å®å šã«éåç §ã§ããŸãã ãã®èŠåãé©çšããããã«ãNull é蚱容åç §åã Null 以å€ã®å€ã«åæåãããŠããªãå Žåãã³ã³ãã€ã©ã¯èŠåãçºè¡ããŸãã ããŒã«ã«å€æ°ã宣èšããå Žæã«å²ãåœãŠãå¿ èŠããããŸãã ãã£ãŒã«ãåæååãŸãã¯ãã¹ãŠã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ããã¹ãŠã®ãã£ãŒã«ãã« "null ã§ã¯ãªã" å€ãå²ãåœãŠãå¿ èŠããããŸãã ç¶æ ã "null ãããããªã" ã§ããåç §ã«ãNull é蚱容åç §ãå²ãåœãŠãããŠããå Žåãã³ã³ãã€ã©ã«ãã£ãŠèŠåãçºè¡ãããŸãã äžè¬ã«ãnull é蚱容åç §ã¯ null ã§ã¯ãªã ããããã®å€æ°ãéåç §ããŠãèŠåã¯çºè¡ãããŸããã
泚
"null ãããããªã" åŒã Null é蚱容åç §åã«å²ãåœãŠããšãã³ã³ãã€ã©ãŒã«ãã£ãŠèŠåãçæãããŸãã ããã«ãã³ã³ãã€ã©ã§ã¯ã倿°ã "null ã§ã¯ãªã" åŒã«å²ãåœãŠããããŸã§ãããã«å¯ŸããŠèŠåãçæããŸãã
null 蚱容åç
§åã« null ãåæåãŸãã¯å²ãåœãŠãããšãã§ããŸãã ãããã£ãŠãã¹ã¿ãã£ãã¯åæã§ã¯ã倿°ãéåç
§ãããåã«ãããã "null ã§ã¯ãªã" ã§ããããšã確èªããå¿
èŠããããŸãã null 蚱容åç
§ã null ã§ãããšå€æãããå Žåã null é蚱容åç
§å€æ°ã«å²ãåœãŠããšãã³ã³ãã€ã©èŠåãçæãããŸãã æ¬¡ã®ã¯ã©ã¹ã¯ããããã®èŠåã®äŸã瀺ããŸãã
public class ProductDescription
{
private string shortDescription;
private string? detailedDescription;
public ProductDescription() // Warning! shortDescription not initialized.
{
}
public ProductDescription(string productDescription) =>
this.shortDescription = productDescription;
public void SetDescriptions(string productDescription, string? details=null)
{
shortDescription = productDescription;
detailedDescription = details;
}
public string GetDescription()
{
if (detailedDescription.Length == 0) // Warning! dereference possible null
{
return shortDescription;
}
else
{
return $"{shortDescription}\n{detailedDescription}";
}
}
public string FullDescription()
{
if (detailedDescription == null)
{
return shortDescription;
}
else if (detailedDescription.Length > 0) // OK, detailedDescription can't be null.
{
return $"{shortDescription}\n{detailedDescription}";
}
return shortDescription;
}
}
次ã®ã¹ããããã¯ããã®ã¯ã©ã¹ã䜿çšãããšãã«ã³ã³ãã€ã©ãèŠåãçºè¡ããå Žæã瀺ããŸãã
string shortDescription = default; // Warning! non-nullable set to null;
var product = new ProductDescription(shortDescription); // Warning! static analysis knows shortDescription maybe null.
string description = "widget";
var item = new ProductDescription(description);
item.SetDescriptions(description, "These widgets will do everything.");
äžèšã®äŸã§ã¯ãã³ã³ãã€ã©ã®ã¹ã¿ãã£ãã¯åæã§ãåç §å€æ°ã® "null ç¶æ " ãã©ã®ããã«å€æãããã®ãã瀺ããŠããŸãã ã³ã³ãã€ã©ã¯ãnull ã®ãã§ãã¯ãšå²ãåœãŠã«é¢ããèšèªèŠåãé©çšããŠããã®åæãéç¥ããŸãã ã³ã³ãã€ã©ã¯ãã¡ãœãããŸãã¯ããããã£ã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠæ³å®ããããšã¯ã§ããŸããã null ãã§ãã¯ãå®è¡ããã¡ãœãããåŒã³åºããå Žåãã³ã³ãã€ã©ã§ã¯ããããã®ã¡ãœããã倿°ã® "null ç¶æ " ã«åœ±é¿ããããšãèªèããããšã¯ã§ããŸããã API ã«å±æ§ã远å ããŠãåŒæ°ãšæ»ãå€ã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠã³ã³ãã€ã©ã«éç¥ã§ããŸãã .NET ã©ã€ãã©ãªã®å€ãã®äžè¬ç㪠API ã«ã¯ããããã®å±æ§ããããŸãã ããšãã°ãã³ã³ãã€ã©ã¯ãIsNullOrEmpty ã null ãã§ãã¯ãšããŠæ£ããè§£éããŸãã "null ç¶æ " ã®ã¹ã¿ãã£ãã¯åæã«é©çšããã屿§ã®è©³çްã«ã€ããŠã¯ã"Null èš±å®¹å±æ§" ã«é¢ããèšäºãåç §ããŠãã ããã
Null 蚱容ã³ã³ããã¹ã
null 蚱容ã³ã³ããã¹ãã¯ãã³ã³ãã€ã©ã null 蚱容åç §åã®æ³šéãåŠçããæ¹æ³ãšãéç null ç¶æ åæäžã«çæãããèŠåãæ±ºå®ããŸãã ãã©ãã«ã³ã³ããã¹ãã«ã¯ã泚é èšå®ãš èŠå èšå®ã® 2 ã€ã®ãã©ã°ãå«ãŸããŠããŸãã
æ¢åã®ãããžã§ã¯ãã§ã¯ã泚é ãš èŠå èšå®ã®äž¡æ¹ãæ¢å®ã§ç¡å¹ã«ãªã£ãŠããŸãã .NET 6 (C# 10) 以éã§ã¯ãnew ãããžã§ã¯ãã§ã¯ãäž¡æ¹ã®ãã©ã°ãæ¢å®ã§æå¹ã«ãªããŸãã null 蚱容ã³ã³ããã¹ãã® 2 ã€ã®ç°ãªããã©ã°ã®çç±ã¯ãnull 蚱容åç §åã®å°å ¥åã®å€§èŠæš¡ãªãããžã§ã¯ãã®ç§»è¡ã容æã«ããããã§ãã
å°èŠæš¡ãªãããžã§ã¯ãã®å Žåã¯ãnullableåç §åãæå¹ã«ããèŠåã解決ããŠç¶è¡ããããšãã§ããŸãã ãã ããå€§èŠæš¡ãªãããžã§ã¯ãããã«ããããžã§ã¯ã ãœãªã¥ãŒã·ã§ã³ã§ã¯ããã®ããã»ã¹ã«ãã£ãŠå€æ°ã®èŠåãçæãããå¯èœæ§ããããŸãã Null 蚱容åç §åã®äœ¿çšãéå§ããéã«ãpragma ã䜿çšããŠãã¡ã€ã«ããšã« Null 蚱容åç §åãæå¹ã«ããããšãã§ããŸãã System.NullReferenceException ãã¹ããŒããä¿è·ããæ°æ©èœã¯ãæ¢åã®ã³ãŒãããŒã¹ã§æå¹ã«ãããšãäžæã䌎ãå¯èœæ§ããããŸãã
- æç€ºçã«åæå®ãããåç §å€æ°ã¯ãã¹ãŠãnull é蚱容åç §åãšããŠè§£éãããŸãã
- ãžã§ããªãã¯å
ã®
classå¶çŽã®æå³ã¯ãnull é蚱容åç §åãæå³ããããã«å€æŽãããŸããã - ãããã®æ°ããèŠåã«ãããæ°ããèŠåãçæãããŸãã
null 蚱容泚éã³ã³ããã¹ãã¯ãã³ã³ãã€ã©ã®åäœã決å®ããŸãã null 蚱容ã³ã³ããã¹ãã® èšå®ã«ã¯ã次㮠4 ã€ã®çµã¿åããããããŸãã
-
äž¡æ¹ç¡å¹: ã³ãŒã㯠null èš±å®¹æªæå®ã§ãã
Disable ã¯ãNull 蚱容åç
§åãæå¹ã«ãªãåã®åäœãšäžèŽããŸãããã ããæ°ããæ§æã§ã¯ãšã©ãŒã§ã¯ãªãèŠåãçæãããŸãã
- Null 蚱容ã®èŠåã¯ç¡å¹ã«ãªã£ãŠããŸãã
- åç §åã®å€æ°ã¯ãã¹ãŠãnull 蚱容åç §åã§ãã
- null蚱容åç
§åã宣èšããããã«
?ãµãã£ãã¯ã¹ã䜿çšãããšãèŠåã衚瀺ãããŸãã - null å
逿Œç®å
!ã¯äœ¿çšã§ããŸããã广ããããŸããã
-
äž¡æ¹ãšãæå¹: ã³ã³ãã€ã©ã¯ããã¹ãŠã® null åç
§åæãšãã¹ãŠã®èšèªæ©èœãæå¹ã«ããŸãã
- æ°ãã Null 蚱容ã®ãã¹ãŠã®èŠåãæå¹ã«ãªããŸãã
-
?ãµãã£ãã¯ã¹ã䜿çšããŠãnull 蚱容åç §åã宣èšã§ããŸãã -
?ãµãã£ãã¯ã¹ã®ãªãåç §å倿°ã¯ãnull é蚱容åç §åã§ãã - null 蚱容æŒç®åã¯ã
nullã®éåç §ã®å¯èœæ§ã«é¢ããèŠåãæå¶ããŸãã
-
èŠåãæå¹ãª: ã³ã³ãã€ã©ã¯ãã¹ãŠã® null åæãå®è¡ããã³ãŒãã
nullãéåç §ããå¯èœæ§ãããå Žåã«èŠåãåºåããŸãã- æ°ãã Null 蚱容ã®ãã¹ãŠã®èŠåãæå¹ã«ãªããŸãã
- null蚱容åç
§åã宣èšããããã«
?ãµãã£ãã¯ã¹ã䜿çšãããšãèŠåã衚瀺ãããŸãã - åç
§åã®å€æ°ã¯ãã¹ãŠ null ã«ããããšãã§ããŸãã ãã ãã ãµãã£ãã¯ã¹ã䜿çšããŠå®£èšããªãéããã¡ã³ããŒã¯ããã¹ãŠã®ã¡ãœãããå·Šäžãã£ãã§å²ãŸãã "null 以å€" ã® "
?" ã«ãªããŸãã - null å
逿Œç®å
!ã䜿çšã§ããŸãã
- 泚éãæå¹
: ã³ãŒãã ãéåç §ããå¯èœæ§ãããæããŸã㯠maybe-null åŒã null éèš±å®¹å€æ°ã«å²ãåœãŠãæãã³ã³ãã€ã©ã¯èŠåãåºåããŸããã - Null èš±å®¹ã®æ°ããèŠåã¯ãã¹ãŠç¡å¹ã«ãªã£ãŠããŸãã
-
?ãµãã£ãã¯ã¹ã䜿çšããŠãnull 蚱容åç §åã宣èšã§ããŸãã -
?ãµãã£ãã¯ã¹ã®ãªãåç §å倿°ã¯ãnull é蚱容åç §åã§ãã - null å
逿Œç®å
!ã¯äœ¿çšã§ããŸããã广ããããŸããã
.csproj ãã¡ã€ã«ã® <Nullable> èŠçŽ ã䜿çšããŠããããžã§ã¯ãã® null 蚱容泚éã³ã³ããã¹ããš null 蚱容èŠåã³ã³ããã¹ããèšå®ã§ããŸãã ãã®èŠçŽ ã¯ãã³ã³ãã€ã©ãåã® null 蚱容ãè§£éããæ¹æ³ãšãçæãããèŠåãæ§æããŸãã æ¬¡ã®è¡šã«ã蚱容ãããå€ãšãæå®ãããã³ã³ããã¹ãã®æŠèŠã瀺ããŸãã
| Context | éåç §ã®èŠå | å²ãåœãŠã®èŠå | åç §ã®ã¿ã€ã |
? ãµãã£ãã¯ã¹ |
! æŒç®å |
|---|---|---|---|---|---|
disable |
Disabled | Disabled | ãã¹ãŠ Null 蚱容ã§ã | èŠåãçæããŸã | 圱é¿ã¯ãããŸãã |
enable |
æå¹ | æå¹ |
? ã§å®£èšãããŠããå Žåãé€ããnull é蚱容ã§ãã |
null 蚱容åã宣èšããŸã | å¯èœæ§ã®ããnullå²ãåœãŠã«å¯ŸããèŠåãæå¶ããŸã |
warnings |
æå¹ | é©çšãªã | ãã¹ãŠ null 蚱容ã§ãããã¡ãœããã®å·Šäžæ¬åŒ§äœçœ®ã§ãã¡ã³ããŒã¯ not-null ã§ãããšã¿ãªãããŸãã | èŠåãçæããŸã | å¯èœæ§ã®ããnullå²ãåœãŠã«å¯ŸããèŠåãæå¶ããŸã |
annotations |
Disabled | Disabled |
? ã§å®£èšãããŠããå Žåãé€ããnull é蚱容ã§ãã |
null 蚱容åã宣èšããŸã | 圱é¿ã¯ãããŸãã |
"ç¡å¹ãª" ã³ã³ããã¹ãå
ã®ã³ã³ãã€ã«ãããã³ãŒãã®åç
§å倿°ã¯ã"null èš±å®¹æªæå®" ã§ãã
null ã§ãã倿°ã«ã¯ã ãªãã©ã«ãŸã㯠maybe-null ã®å€æ°ãå²ãåœãŠãããšãã§ããŸãã ãã ãã"null èš±å®¹æªæå®" 倿°ã®æ¢å®ã®ç¶æ
ã¯ã"null 以å€" ã§ãã
ãããžã§ã¯ãã«æé©ãªèšå®ãéžæããŸãã
- 蚺æãæ°æ©èœã«åºã¥ããŠæŽæ°ããããªãã¬ã¬ã· ãããžã§ã¯ãã«ã¯ã"ç¡å¹" ãéžæããŸãã
- ã³ãŒãã ãã¹ããŒããå¯èœæ§ãããå Žæãç¹å®ããã«ã¯ãSystem.NullReferenceExceptionãéžæããŸãã ã³ãŒãã倿Žãããnull é蚱容åç §åãæå¹ã«ãªãåã«ããããã®èŠåã«å¯ŸåŠããããšãã§ããŸãã
- èŠåãæå¹ã«ãªãåã«ãã¶ã€ã³ã®æå³ã衚çŸããã«ã¯ã"泚é" ãéžæããŸãã
- null åç §ã®äŸå€ããä¿è·ããæ°ãããããžã§ã¯ããšã¢ã¯ãã£ããªãããžã§ã¯ãã«ã¯ "æå¹" ãéžæããŸãã
äŸ:
<Nullable>enable</Nullable>
ãã£ã¬ã¯ãã£ãã䜿çšããŠããœãŒã¹ ã³ãŒãå ã®ä»»æã®å Žæã§ãããã®åããã©ã°ãèšå®ããããšãã§ããŸãã ãããã®ãã£ã¬ã¯ãã£ãã¯ãå€§èŠæš¡ãªã³ãŒãããŒã¹ãç§»è¡ããŠããå Žåã«æã圹ç«ã¡ãŸãã
-
#nullable enable: 泚éãã©ã°ãšèŠåãã©ã°ã enable ã«èšå®ããŸãã -
#nullable disable: 泚éãã©ã°ãšèŠåãã©ã°ãç¡å¹ã«ãããã èšå®ããŸãã -
#nullable restore: 泚éãã©ã°ãšèŠåãã©ã°ããããžã§ã¯ãèšå®ã«åŸ©å ããŸãã -
#nullable disable warnings: èŠåãã©ã°ãç¡å¹ã«èšå® ããŸãã -
#nullable enable warnings: æå¹ã«ããèŠåãã©ã°ãèšå®ããŸãã -
#nullable restore warnings: èŠåãã©ã°ããããžã§ã¯ãèšå®ã«åŸ©å ããŸãã -
#nullable disable annotations: ç¡å¹ã«ããæ³šéãã©ã°ãèšå®ããŸãã -
#nullable enable annotations: æå¹ã«ããæ³šéãã©ã°ãèšå®ããŸãã -
#nullable restore annotations: 泚éãã©ã°ããããžã§ã¯ãèšå®ã«åŸ©å ããŸãã
ä»»æã®ã³ãŒãè¡ã«å¯ŸããŠã次ã®ããããã®çµã¿åãããèšå®ã§ããŸãã
| èŠåãã©ã° | 泚éãã©ã° | Use |
|---|---|---|
| ãããžã§ã¯ã ããã©ã«ã | ãããžã§ã¯ã ããã©ã«ã | ããã©ã«ã |
| æå¹ã«ãã | ç¡å¹ã«ãã | åæèŠåãä¿®æ£ãã |
| æå¹ã«ãã | ãããžã§ã¯ã ããã©ã«ã | åæèŠåãä¿®æ£ãã |
| ãããžã§ã¯ã ããã©ã«ã | æå¹ã«ãã | åã®æ³šéã®è¿œå |
| æå¹ã«ãã | æå¹ã«ãã | æ¢ã«ç§»è¡ãããŠããã³ãŒã |
| ç¡å¹ã«ãã | æå¹ã«ãã | èŠåãä¿®æ£ããåã«ã³ãŒãã«æ³šéãä»ãã |
| ç¡å¹ã«ãã | ç¡å¹ã«ãã | ç§»è¡ããããããžã§ã¯ããžã®ã¬ã¬ã· ã³ãŒãã®è¿œå |
| ãããžã§ã¯ã ããã©ã«ã | ç¡å¹ã«ãã | ã»ãšãã©ãªã |
| ç¡å¹ã«ãã | ãããžã§ã¯ã ããã©ã«ã | ã»ãšãã©ãªã |
ããã 9 ã€ã®çµã¿åããã«ãããã³ã³ãã€ã©ãã³ãŒãã«å¯ŸããŠåºåãã蚺æããã现ããå¶åŸ¡ã§ããŸãã æŽæ°ããŠããä»»æã®é åå ã§ãããã«å€ãã®æ©èœãæå¹ã«ããããšãã§ããŸãããŸã 察åŠããããšãã§ããªã远å ã®èŠåã¯è¡šç€ºãããŸããã
éèŠ
ã°ããŒãã« null 蚱容ã³ã³ããã¹ãã¯ãçæãããã³ãŒã ãã¡ã€ã«ã«ã¯é©çšãããŸããã ãããã®æ¹æ³ã§ããNull 蚱容ã³ã³ããã¹ãã¯ãçææžã¿ãšããŠããŒã¯ãããŠãããã¹ãŠã®ãœãŒã¹ ãã¡ã€ã«ã«å¯Ÿã㊠"ç¡å¹ã«ãªããŸã"ã ãã®æ¡ä»¶ã¯ãçæããããã¡ã€ã«å ã® API ã«ã³ã³ãã€ã©ã泚éãä»ããªãããšãæå³ããŸãã ã³ã³ãã€ã©ã¯ãçæããããã¡ã€ã«ã«å¯Ÿã㊠null 蚱容èŠåãçæããŸããã ãã¡ã€ã«ã¯ã次㮠4 ã€ã®æ¹æ³ã®ããããã§çææžã¿ãšããŠããŒã¯ãããŸãã
- .editorconfig ã§ããã®ãã¡ã€ã«ã«é©çšãããã»ã¯ã·ã§ã³ã§
generated_code = trueãæå®ããŸãã - ãã¡ã€ã«ã®å
é ã«ããã³ã¡ã³ãã«
<auto-generated>ãŸãã¯<auto-generated/>ãé 眮ããŸãã ããã¯ãã³ã¡ã³ãå ã®ä»»æã®è¡ã«é 眮ã§ããŸãããã³ã¡ã³ã ãããã¯ã¯ãã¡ã€ã«å ã®æåã®èŠçŽ ã§ããå¿ èŠããããŸãã - ãã¡ã€ã«åã TemporaryGeneratedFile_ ã§éå§ããŸã
- ãã¡ã€ã«åã®æ«å°Ÿã .designer.csã .generated.csã .g.csããŸã㯠.g.i.cs ã«ããŸãã
ãžã§ãã¬ãŒã¿ãŒã¯ã #nullable ããªããã»ããµ ãã£ã¬ã¯ãã£ãã䜿çšããŠãªããã€ã³ã§ããŸãã
æ¢å®ã® null 蚱容泚éããã³èŠåãã©ã°ã㯠disabled ã§ãã ãã®æ¢å®å€ã¯ãæ¢åã®ã³ãŒãã倿Žããããæ°ããèŠåãçæããã«ã³ã³ãã€ã«ãããããšãæå³ããŸãã .NET 6 以éãæ°ãããããžã§ã¯ãã«ã¯ãã¹ãŠã®ãããžã§ã¯ã ãã³ãã¬ãŒãã« <Nullable>enable</Nullable> èŠçŽ ãå«ãŸããã®ã§ããããã®ãã©ã°ã enabled ã«èšå®ããŸãã
ãããã®ãªãã·ã§ã³ã§ã¯ãnull 蚱容åç §åã䜿çšããããã«æ¢åã®ã³ãŒãããŒã¹ãæŽæ°ããããã® 2 ã€ã®æ¹æ³ãæäŸãããŸãã
Null 蚱容ã³ã³ããã¹ãã®èšå®
null 蚱容ã³ã³ããã¹ãã¯ã2 ã€ã®æ¹æ³ã§å¶åŸ¡ã§ããŸãã ãããžã§ã¯ã ã¬ãã«ã§ã <Nullable>enable</Nullable> ãããžã§ã¯ãèšå®ã远å ããŸãã åäžã® C# ãœãŒã¹ ãã¡ã€ã«ã§ãnull 蚱容ã³ã³ããã¹ããæå¹ã«ãã #nullable enable ãã©ã°ãã远å ããŸãã 詳现ã«ã€ããŠã¯ã null 蚱容æŠç¥ã®èšå®ãåç
§ããŠãã ããã .NET 6 ããåã®æ°ãããããžã§ã¯ãã§ã¯ãæ¢å®ã® <Nullable>disable</Nullable>ã䜿çšãããŸãã .NET 6 以éã§ã¯ãæ°ãããããžã§ã¯ãã«ã¯ããããžã§ã¯ã ãã¡ã€ã«ã« <Nullable>enable</Nullable> èŠçŽ ãå«ãŸããŠããŸãã
ãžã§ããªãã¯
Tåãã©ã¡ãŒã¿ãŒã null 蚱容ã®å¯Ÿå¿T?ãšããŠäœ¿çšãããšãå®éã®ååŒæ°ã«ãã£ãŠ?ã®è§£éæ¹æ³ã決ãŸããŸãã æ¬¡ã®äžè¬çãªå®£èšã«ã€ããŠèããŠã¿ãŸãããã
public class Box<T>
{
public T Contents { get; set; }
}
åãã©ã¡ãŒã¿ãŒã¯åç
§åãŸãã¯å€åã«å¯ŸããŠäœ¿çšã§ããããã T? ã®æå³ã¯åŒã³åºãå
ãæå®ããååŒæ°ã«ãã£ãŠç°ãªããŸãã æ¬¡ã®èŠåã§ã¯ãTã«å¶çŽããªãå Žåã«è§£æ±ºT?ã«ã€ããŠèª¬æããŸãã
- ååŒæ°ã¯ null é蚱容åç
§åã§ãã
Box<string>ã®å ŽåãTã¯stringãããT?ã¯å¯Ÿå¿ãã null 蚱容åç §åã§ããstring?ã - ååŒæ°ã¯å€åã§ãã
Box<int>ã®å ŽåãTã¯intãããT?ãåãå€ã®åintãããŸãã æ³šéã¯ãåãã©ã¡ãŒã¿ãŒã«structå¶çŽããªãéããå€åã«ã¯åœ±é¿ããŸããããã®å ŽåãT?㯠Nullable<T> (int?) ãæå³ããŸãã - ååŒæ°ã¯æ¢ã« null 蚱容ã§ãã
Box<string?>ã®å ŽåãTã¯string?ãããT?ã¯ãŸãstring?ã "äºéã« null 蚱容" åã¯ååŸãããŸããã
å¶çŽ ã«ãã£ãŠãèš±å¯ãããååŒæ°ãå¶éãããŸãã ãŸãã T ã®äœ¿ç𿹿³ã«é¢ããã³ã³ãã€ã©ã®çç±ã瀺ããŸãã
-
where T : classã«ã¯ null é蚱容åç §åãå¿ èŠã§ããBox<string>ã¯èš±å¯ãããŸããBox<string?>ã¯èŠåãçæããŸãã -
where T : class?ã§ã¯ãnull 蚱容åç §åãŸã㯠null é蚱容åç §åã®ããããã䜿çšã§ããŸããBox<string>ãšBox<string?>ã®äž¡æ¹ãèš±å¯ãããŸãã -
where T : structã«ã¯ null é蚱容å€åãå¿ èŠã§ããBox<int>ã¯èš±å¯ãããŸããBox<int?>ã§ã¯ãããŸããã ãã®å¶çŽã§ã¯ããžã§ããªãã¯ææ®µNullable<T>å ã®T?ãBox<int>ã®å ŽåãT?ã¯int?ãããŸãã -
where T : notnullã«ã¯ãnull é蚱容åç §åãŸãã¯å€åãå¿ èŠã§ããBox<string>ãšBox<int>ãèš±å¯ãããŠããŸããBox<string?>ã¯èŠåãçæããŸãã -
where T : BaseTypeã«ã¯ãBaseTypeããæŽŸçãã null é蚱容åç §åãå¿ èŠã§ãã?(where T : BaseType?) ã远å ããŠãnull 蚱容掟çåãèš±å¯ããŸãã
å¶çŽã¯ããžã§ããªãã¯åãã©ã¡ãŒã¿ãŒã®äœ¿ç𿹿³ã«é¢ããã³ã³ãã€ã©ã®çç±ã«åœ¹ç«ã¡ãŸãã
public static T? FirstOrDefault<T>(IEnumerable<T> source)
{
foreach (T item in source)
{
return item;
}
return default;
}
public static void RequireNotNull<T>(T value) where T : notnull
{
ArgumentNullException.ThrowIfNull(value);
}
public static void Generics()
{
string? first = FirstOrDefault<string>([]);
Console.WriteLine(first ?? "<empty>");
RequireNotNull("not null");
}
C# èšèªä»æ§
詳现ã«ã€ããŠã¯ãC# èšèªä»æ§ã® Null 蚱容åç §åã«é¢ããã»ã¯ã·ã§ã³ãåç §ããŠãã ããã