.NETã¯åœåãã䜿çšããŠããŸãããæåããææ°ã®.NETCore 3.1ãŸã§ãæ¬çªç°å¢ã®ãã¬ãŒã ã¯ãŒã¯ã®ãã¹ãŠã®ããŒãžã§ã³ã§ãœãªã¥ãŒã·ã§ã³ãäœæãããŠããŸãã
11æã«ãªãªãŒã¹ãäºå®ãããŠãã.NET5ã®ããŒãžã§ã³ã¯ããªãªãŒã¹åè£2ã®åœ¢ã§ãªãªãŒã¹ãããã°ããã§ãã5çªç®ã®ããŒãžã§ã³ã¯ç»æçãªãã®ã«ãªããšé·ãéèŠåãããŠããŸãããããã§çµãããŸãããã¬ãŒã ã¯ãŒã¯ã«ã¯ã©ã·ãã¯ãšã³ã¢ã®2ã€ã®ãã©ã³ãããã£ãå Žåã®.NETçµ±å倱調çãä»ããããã¯ãšã¯ã¹ã¿ã·ãŒã§ããŒãžããã1ã€ã®é£ç¶ãã.NETããããŸããRC2ã
ãªãªãŒã¹ãã§ã«å®å šã«äœ¿ãå§ããããšãã§ããŸã-ãªãªãŒã¹åã«æ°ãã倿Žã¯æåŸ ãããŠããŸãããèŠã€ãã£ããã°ã®ä¿®æ£ã®ã¿ããããŸããããã«ãRC2ã«ã¯ãã§ã«.NETå°çšã®å ¬åŒãŠã§ããµã€ãããããŸãã
ãŸãã.NET 5ããã³CïŒ9ã®ã€ãããŒã·ã§ã³ã®æŠèŠã玹ä»ããŸããã³ãŒãäŸãå«ããã¹ãŠã®æ å ±ã¯ã.NETãã©ãããã©ãŒã ã®éçºè ã®å ¬åŒããã°ïŒããã³ä»ã®å€ãã®ãœãŒã¹ïŒããååŸãããå人çã«æ€èšŒãããŠããŸãã
æ°ãããã€ãã£ããšã¡ããã©æ°ããã¿ã€ã
CïŒãš.NETã¯åæã«ãã€ãã£ãã¿ã€ãã远å ããŸããïŒ
- CïŒã®nintãšnuint
- BCLå ã®å¯Ÿå¿ããSystem.IntPtrããã³System.UIntPtr
ãããã®ã¿ã€ãã远å ããããã®ãã€ã³ãã¯ãäœã¬ãã«ã®APIã䜿çšããæäœã§ãããããŠç§èš£ã¯ããããã®ã¿ã€ãã®å®éã®ãµã€ãºã¯å®è¡æã«ãã§ã«æ±ºå®ãããŠãããã·ã¹ãã ã®ãããæ°ã«äŸåããããšã§ãã32ãããã®ãã®ã®å Žåã¯4ãã€ãã64ãããã®ãã®ã®å Žåã¯ãããã8ãã€ãã«ãªããŸãã
ã»ãšãã©ã®å Žåãå®éã®äœæ¥ã§ã¯ãããã®ã¿ã€ãã«ééããããšã¯ãããŸããããã ããå¥ã®æ°ããã¿ã€ãã®å Žåãšåæ§ã«ãååã§ãããã®ã¿ã€ãã¯BCLã«ã®ã¿ååšããCïŒã«ã¯ãŸã é¡äŒŒç©ã¯ãããŸãããæµ®åå°æ°ç¹å€çšã®16ãããã¿ã€ãã§ããå°çã®ãããªç²ŸåºŠãå¿ èŠãªãå Žåã«äŸ¿å©ã§ãããŸããfloatåãšdoubleåã¯4ãã€ããš8ãã€ããå ãããããå€ãæ ŒçŽããããã®ã¡ã¢ãªãç²åŸã§ããŸããæãè峿·±ãã®ã¯ããããŸã§ã®ãšããããã®ã¿ã€ãã®äžè¬çãªãã®ã§ãç®è¡æŒç®ã¯å®çŸ©ãããŠããããfloatãŸãã¯doubleã«æç€ºçã«ãã£ã¹ãããã«ãHalfåã®2ã€ã®å€æ°ã远å ããããšãã§ããŸãããã€ãŸãããã®ã¿ã€ãã®ç®çã¯ãã¹ããŒã¹ãç¯çŽããããã«ãçŽç²ã«å®çšçãªãã®ã«ãªããŸããããã ãã.NETããã³CïŒã®æ¬¡ã®ãªãªãŒã¹ã§ã¯ãããã«ç®è¡ã远å ããäºå®ã§ããäžå¹Žã§ã
ããŒã«ã«é¢æ°ã®å±æ§
以åã¯çŠæ¢ãããŠãããããäžäŸ¿ãçããŠããŸãããç¹ã«ãããŒã«ã«é¢æ°ã®ãã©ã¡ãŒã¿ã®å±æ§ããã³ã°ã¢ããããããšã¯äžå¯èœã§ãããããã§ã颿°èªäœãšãã®ãã©ã¡ãŒã¿ãŒã®äž¡æ¹ã«å±æ§ãèšå®ã§ããŸããããšãã°ã次ã®ããã«ãªããŸãã
#nullable enable
private static void Process(string?[] lines, string mark)
{
foreach (var line in lines)
{
if (IsValid(line))
{
// Processing logic...
}
}
bool IsValid([NotNullWhen(true)] string? line)
{
return !string.IsNullOrEmpty(line) && line.Length >= mark.Length;
}
}
éçã©ã ãåŒ
ãã®æ©èœã®ãã€ã³ãã¯ãã©ã ãåŒãåŒèªäœã®å€éšã«ååšããã³ã³ããã¹ãããã³ããŒã«ã«å€æ°ããã£ããã£ã§ããªãããã«ããããšã§ããäžè¬ã«ãããŒã«ã«ã³ã³ããã¹ãããã£ããã£ã§ãããšããäºå®ã¯ãéçºã«åœ¹ç«ã€ããšããããããŸãããã ããããããã£ãããã«ãããšã©ãŒã®åå ãšãªãå ŽåããããŸãã
ãã®ãããªãšã©ãŒãåé¿ããããã«ãã©ã ãåŒãstaticããŒã¯ãŒãã§ããŒã¯ã§ããããã«ãªããŸããããããŠãã®å ŽåãããŒã«ã«å€æ°ãããããšããŒã¹ãŸã§ãããŒã«ã«ã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ã§ããªããªããŸãã
ããã¯ããªãå æ¬çãªäœ¿çšäŸã§ãïŒ
static void SomeFunc(Func<int, int> f)
{
Console.WriteLine(f(5));
}
static void Main(string[] args)
{
int y1 = 10;
const int y2 = 10;
SomeFunc(i => i + y1); // 15
SomeFunc(static i => i + y1); // : y1
SomeFunc(static i => i + y2); // 15
}
宿°ã¯éçã©ã ããããŸããã£ããã£ããããšã«æ³šæããŠãã ããã
æ¡åŒµã¡ãœãããšããŠã®GetEnumerator
ããã§ãGetEnumeratorã¡ãœãããæ¡åŒµã¡ãœããã«ããããšãã§ããŸããããã«ããã以åã¯å埩ã§ããªãã£ãforeachãå埩åŠçã§ããŸããããšãã°-ã¿ãã«ã
ããã¯ãforeachãä»ããŠValueTupleã«å¯ŸããŠèšè¿°ãããæ¡åŒµã¡ãœããã䜿çšããŠãValueTupleãå埩åŠçã§ããããã«ãªã£ãå Žåã®äŸã§ãã
static class Program
{
public static IEnumerator<T> GetEnumerator<T>(this ValueTuple<T, T, T, T, T> source)
{
yield return source.Item1;
yield return source.Item2;
yield return source.Item3;
yield return source.Item4;
yield return source.Item5;
}
static void Main(string[] args)
{
foreach(var item in (1,2,3,4,5))
{
System.Console.WriteLine(item);
}
}
}
ãã®ã³ãŒãã¯ã1ãã5ãŸã§ã®æ°åãã³ã³ãœãŒã«ã«åºåããŸãã
ã©ã ãåŒãšå¿å颿°ã®ãã©ã¡ãŒã¿ãŒã®ãã¿ãŒã³ãç Žæ£ããŸã
ãã€ã¯ãæ¹åãã©ã ãåŒãŸãã¯å¿å颿°ã§ãã©ã¡ãŒã¿ãŒãå¿ èŠãªãå Žåã¯ããã©ã¡ãŒã¿ãŒãã¢ã³ããŒã¹ã³ã¢ã«çœ®ãæããŠã以äžãç¡èŠããããšãã§ããŸãã
Func<int, int, int> someFunc1 = (_, _) => {return 5;};
Func<int, int, int> someFunc2 = (int _, int _) => {return 5;};
Func<int, int, int> someFunc3 = delegate (int _, int _) {return 5;};
Cã®ãããã¬ãã«ã¹ããŒãã¡ã³ãïŒ
ããã¯åçŽåãããCïŒã³ãŒãæ§é ã§ããããŠãæãåçŽãªã³ãŒããæžãããšã¯æ¬åœã«ç°¡åã«èŠããŸãïŒ
using System;
Console.WriteLine("Hello World!");
ãããŠãããã¯ãã¹ãŠããŸãã³ã³ãã€ã«ãããŸããã€ãŸããã³ã³ãœãŒã«åºåã¹ããŒãã¡ã³ããé 眮ããã¡ãœãããäœæããå¿ èŠã¯ãªããã¡ãœãããé 眮ããã¯ã©ã¹ãèšè¿°ããå¿ èŠããã¯ã©ã¹ãäœæããåååãå®çŸ©ããå¿ èŠããããŸããã
ã¡ãªã¿ã«ãå°æ¥çã«ã¯ãCïŒéçºè ã¯ãåçŽåãããæ§æã§ãããã¯ãéçºãã䜿çšããŠããã·ã¹ãã ãåãé€ãããšãèããŠããŸããæãããªå ŽåããããŸã§ã®éãæ¬¡ã®ããã«æžãã ãã§ãããåãé€ãããšãã§ããŸãã
System.Console.WriteLine("Hello World!");
ãããŠãããã¯å®éã«ã¯åäžè¡ã®äœæ¥ããã°ã©ã ã«ãªããŸãã
ããè€éãªãªãã·ã§ã³ã䜿çšã§ããŸãã
using System;
using System.Runtime.InteropServices;
Console.WriteLine("Hello World!");
FromWhom();
Show.Excitement("Top-level programs can be brief, and can grow as slowly or quickly in complexity as you'd like", 8);
void FromWhom()
{
Console.WriteLine($"From {RuntimeInformation.FrameworkDescription}");
}
internal class Show
{
internal static void Excitement(string message, int levelOf)
{
Console.Write(message);
for (int i = 0; i < levelOf; i++)
{
Console.Write("!");
}
Console.WriteLine();
}
}
å®éã«ã¯ãã³ã³ãã€ã©èªäœããã®ãã¹ãŠã®ã³ãŒããå¿ èŠãªåååãšã¯ã©ã¹ã«ã©ããããŸããããªãã¯ããã«ã€ããŠç¥ããªãã§ãããã
ãã¡ããããã®æ©èœã«ã¯å¶éããããŸããäž»ãªãã®ã¯ãããã¯1ã€ã®ãããžã§ã¯ããã¡ã€ã«ã§ã®ã¿å®è¡ã§ãããšããããšã§ããååãšããŠãããã¯ãMainïŒstring [] argsïŒé¢æ°ã®åœ¢åŒã§ããã°ã©ã ãžã®ãšã³ããªãã€ã³ãã以åã«äœæãããã¡ã€ã«ã§è¡ãã®ãçã«ããªã£ãŠããŸããåæã«ãMain颿°èªäœãããã§å®çŸ©ããããšã¯ã§ããŸãããããã¯2çªç®ã®å¶éã§ããå®éãæ§æãç°¡ç¥åããããã®ãããªãã¡ã€ã«èªäœãMain颿°ã§ããããã©ã¡ãŒã¿ãŒãæã€é åã§ããargs倿°ãæé»çã«å«ãŸããŠããŸããã€ãŸãããã®ã³ãŒãã¯é åã®é·ããã³ã³ãã€ã«ããŠè¡šç€ºããŸãã
System.Console.WriteLine(args.Length);
äžè¬ã«ããã®æ©èœã¯æãéèŠã§ã¯ãããŸãããããã¢ã³ã¹ãã¬ãŒã·ã§ã³ããã¬ãŒãã³ã°ã®ç®çã«ã¯ãããèªäœã«éåžžã«é©ããŠããŸãã詳现ã¯ãã¡ãã
ifã¹ããŒãã¡ã³ãã§ã®ãã¿ãŒã³ãããã³ã°
ç¹å®ã®ã¿ã€ã ã§ã¯ãªããªããžã§ã¯ã倿°ããã§ãã¯ããå¿ èŠããããšæ³åããŠãã ããããããŸã§ã¯ã次ã®ããã«æžãå¿ èŠããããŸããã
if (!(vehicle is Car)) { ... }
ããããCïŒ9.0ã䜿çšãããšã人éã§æžãããšãã§ããŸãã
if (vehicle is not Car) { ... }
ãŸããããã€ãã®ãã§ãã¯ãã³ã³ãã¯ãã«èšé²ããããšãå¯èœã«ãªããŸããã
if (context is {IsReachable: true, Length: > 1 })
{
Console.WriteLine(context.Name);
}
ãã®æ°ãã衚èšã¯ã次ã®ãããªå€ãè¯ã衚èšãšåçã§ãã
if (context is object && context.IsReachable && context.Length > 1 )
{
Console.WriteLine(context.Name);
}
ãŸãã¯ãåãããšãæ¯èŒçæ°ããæ¹æ³ã§æžãããšãã§ããŸãïŒãã ããããã¯ãã§ã«æšæ¥ã§ãïŒã
if (context?.IsReachable && context?.Length > 1 )
{
Console.WriteLine(context.Name);
}
æ°ããæ§æã§ã¯ãããŒã«æŒç®åã䜿çšããããšãã§ããŸãããŸããæ¬åŒ§ã䜿çšããŠåªå é äœãä»ããããšãã§ããŸãã
if (context is {Length: > 0 and (< 10 or 25) })
{
Console.WriteLine(context.Name);
}
ãããŠããããã¯éåžžã®ifã§ã®ãã¿ãŒã³ãããã³ã°ã®åãªãæ¹åã§ããã¹ã€ããåŒã®ãã¿ãŒã³ãããã³ã°ã«è¿œå ãããã®-èªã¿é²ããŠãã ããã
ã¹ã€ããåŒã®ãã¿ãŒã³ãããã³ã°ã®æ¹å
switchåŒïŒswitchã¹ããŒãã¡ã³ããšæ··åããªãã§ãã ããïŒã§ã¯ããã¿ãŒã³ãããã³ã°ãå€§å¹ ã«æ¹åãããŠããŸããå ¬åŒããã¥ã¡ã³ãã®äŸãèŠãŠã¿ãŸããããäŸã¯ãç¹å®ã®æéã«ãããç¹å®ã®èŒžéã®éè³ãèšç®ããããšã«å°å¿µããŠããŸãããããæåã®äŸã§ãïŒ
public decimal CalculateToll(object vehicle) =>
vehicle switch
{
Car c => 2.00m,
Taxi t => 3.50m,
Bus b => 5.00m,
DeliveryTruck t => 10.00m,
{ } => throw new ArgumentException("Unknown vehicle type", nameof(vehicle)),
null => throw new ArgumentNullException(nameof(vehicle))
};
switchã¹ããŒãã¡ã³ãã®æåŸã®2è¡ã¯æ°ãããã®ã§ããäžæ¬åŒ§ã¯ãnull以å€ã®ãªããžã§ã¯ãã衚ããŸãããŸããmatchingããŒã¯ãŒãã䜿çšããŠnullãšç §åã§ããããã«ãªããŸããã
ããã ãã§ã¯ãããŸããããªããžã§ã¯ããžã®ãããã³ã°ããšã«ã倿°ãäœæããå¿ èŠãããããšã«æ³šæããŠãã ãããè»ã®å Žåã¯cãã¿ã¯ã·ãŒã®å Žåã¯tãªã©ã§ãããã ãããããã®å€æ°ã¯äœ¿çšãããŸããããã®ãããªå ŽåãCïŒ8.0ã®ç Žæ£ãã¿ãŒã³ããã§ã«äœ¿çšã§ããŸãã
public decimal CalculateToll(object vehicle) =>
vehicle switch
{
Car _ => 2.00m,
Taxi _ => 3.50m,
Bus _ => 5.00m,
DeliveryTruck _ => 10.00m,
// ...
};
ãã ããCïŒã®9çªç®ã®ããŒãžã§ã³ä»¥éããã®ãããªå Žåã¯äœãèšè¿°ã§ããŸããã
public decimal CalculateToll(object vehicle) =>
vehicle switch
{
Car => 2.00m,
Taxi => 3.50m,
Bus => 5.00m,
DeliveryTruck => 10.00m,
// ...
};
ã¹ã€ããåŒã®æ¹åã¯ããã ãã§ã¯ãããŸãããããè€éãªåŒãæžãã®ãç°¡åã«ãªããŸãããããšãã°ãè¿ãããçµæã¯ãæž¡ããããªããžã§ã¯ãã®ããããã£å€ã«äŸåããå¿ èŠãããããšããããããŸããããã§ãifã®çµã¿åãããããçããŠäŸ¿å©ã«æžãããšãã§ããŸãã
public static decimal CalculateToll(object vehicle) =>
vehicle switch
{
Car { Passengers: 0 } => 2.00m + 0.50m,
Car { Passengers: 1 } => 2.0m,
Car { Passengers: 2 } => 2.0m - 0.50m,
Car => 2.00m - 1.0m,
// ...
};
ã¹ã€ããã®æåã®3è¡ã«æ³šæããŠãã ãããå®éã«ã¯ãPassengersããããã£ã®å€ããã§ãã¯ãããçããå Žåã¯ã察å¿ããçµæãè¿ãããŸããäžèŽãããã®ããªãå Žåã¯ãäžè¬çãªããªã¢ã³ãã®å€ãè¿ãããŸãïŒã¹ã€ããå ã®4è¡ç®ïŒãã¡ãªã¿ã«ãããããã£å€ã¯ãæž¡ãããè»äž¡ãªããžã§ã¯ããnullã§ãªããCarã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ããå Žåã«ã®ã¿ãã§ãã¯ãããŸããã€ãŸãããã§ãã¯ãããšãã«Nullåç §äŸå€ãæããŠã¯ãªããŸããã
ããããããã ãã§ã¯ãããŸãããããã§ãswitchåŒã§ããã䟿å©ãªãããã³ã°ã®ããã®åŒãäœæããããšãã§ããŸãã
public static decimal CalculateToll(object vehicle) =>
vehicle switch
{
Bus b when ((double)b.Riders / (double)b.Capacity) < 0.50 => 5.00m + 2.00m,
Bus b when ((double)b.Riders / (double)b.Capacity) > 0.90 => 5.00m - 1.00m,
Bus => 5.00m,
DeliveryTruck t when (t.GrossWeightClass >= 5000) => 10.00m + 5.00m,
DeliveryTruck t when (t.GrossWeightClass >= 3000 && t.GrossWeightClass < 5000) => 10.00m,
DeliveryTruck => 8.00m,
// ...
};
ãããŠãããã ãã§ã¯ãããŸãããã¹ã€ããåŒã®æ§æããã¹ããããã¹ã€ããåŒã«æ¡åŒµãããè€éãªæ¡ä»¶ã®èšè¿°ãããã«ç°¡åã«ãªããŸããã
public static decimal CalculateToll(object vehicle) =>
vehicle switch
{
Car c => c.Passengers switch
{
0 => 2.00m + 0.5m,
1 => 2.0m,
2 => 2.0m - 0.5m,
_ => 2.00m - 1.0m
},
// ...
};
ãã®çµæããã§ã«ç€ºãããã¹ãŠã®ã³ãŒãäŸãå®å šã«æ¥çãããšã説æãããŠãããã¹ãŠã®ã€ãããŒã·ã§ã³ããŸãšããæ¬¡ã®å³ãåŸãããŸãã
public static decimal CalculateToll(object vehicle) =>
vehicle switch
{
Car c => c.Passengers switch
{
0 => 2.00m + 0.5m,
1 => 2.0m,
2 => 2.0m - 0.5m,
_ => 2.00m - 1.0m
},
Taxi t => t.Fares switch
{
0 => 3.50m + 1.00m,
1 => 3.50m,
2 => 3.50m - 0.50m,
_ => 3.50m - 1.00m
},
Bus b when ((double)b.Riders / (double)b.Capacity) < 0.50 => 5.00m + 2.00m,
Bus b when ((double)b.Riders / (double)b.Capacity) > 0.90 => 5.00m - 1.00m,
Bus => 5.00m,
DeliveryTruck t when (t.GrossWeightClass >= 5000) => 10.00m + 5.00m,
DeliveryTruck t when (t.GrossWeightClass >= 3000 && t.GrossWeightClass < 5000) => 10.00m,
DeliveryTruck => 8.00m,
null => throw new ArgumentNullException(nameof(vehicle)),
_ => throw new ArgumentException(nameof(vehicle))
};
ããããããã ãã§ã¯ãããŸãããå¥ã®äŸã次ã«ç€ºããŸããã¹ã€ããåŒã¡ã«ããºã ã䜿çšããŠãçµéæéã«åºã¥ããŠè² è·ã決å®ããéåžžã®é¢æ°ïŒæ/倿¹ã®ã©ãã·ã¥ã¢ã¯ãŒãæŒãšå€ã®æéïŒ
private enum TimeBand
{
MorningRush,
Daytime,
EveningRush,
Overnight
}
private static TimeBand GetTimeBand(DateTime timeOfToll) =>
timeOfToll.Hour switch
{
< 6 or > 19 => TimeBand.Overnight,
< 10 => TimeBand.MorningRush,
< 16 => TimeBand.Daytime,
_ => TimeBand.EveningRush,
};
ã芧ã®ãšãããCïŒ9.0ã§ã¯ãæ¯èŒæŒç®å<ã>ã<=ã> =ãããã³è«çæŒç®åandããŸãã¯notãç §åæã«äœ¿çšããããšãã§ããŸãã
ããããããã¯ããããŒãçµããã§ã¯ãããŸãããããã§ãswitchåŒã§...ã¿ãã«ã䜿çšã§ããŸããããã¯ãææ¥ãæå»ãããã³ç§»åæ¹åïŒéœåžãž/ããïŒã«å¿ããŠãéè³ã®ç¹å®ã®ä¿æ°ãèšç®ããã³ãŒãã®å®å šãªäŸã§ãã
private enum TimeBand
{
MorningRush,
Daytime,
EveningRush,
Overnight
}
private static bool IsWeekDay(DateTime timeOfToll) =>
timeOfToll.DayOfWeek switch
{
DayOfWeek.Saturday => false,
DayOfWeek.Sunday => false,
_ => true
};
private static TimeBand GetTimeBand(DateTime timeOfToll) =>
timeOfToll.Hour switch
{
< 6 or > 19 => TimeBand.Overnight,
< 10 => TimeBand.MorningRush,
< 16 => TimeBand.Daytime,
_ => TimeBand.EveningRush,
};
public static decimal PeakTimePremiumFull(DateTime timeOfToll, bool inbound) =>
(IsWeekDay(timeOfToll), GetTimeBand(timeOfToll), inbound) switch
{
(true, TimeBand.MorningRush, true) => 2.00m,
(true, TimeBand.MorningRush, false) => 1.00m,
(true, TimeBand.Daytime, true) => 1.50m,
(true, TimeBand.Daytime, false) => 1.50m,
(true, TimeBand.EveningRush, true) => 1.00m,
(true, TimeBand.EveningRush, false) => 2.00m,
(true, TimeBand.Overnight, true) => 0.75m,
(true, TimeBand.Overnight, false) => 0.75m,
(false, TimeBand.MorningRush, true) => 1.00m,
(false, TimeBand.MorningRush, false) => 1.00m,
(false, TimeBand.Daytime, true) => 1.00m,
(false, TimeBand.Daytime, false) => 1.00m,
(false, TimeBand.EveningRush, true) => 1.00m,
(false, TimeBand.EveningRush, false) => 1.00m,
(false, TimeBand.Overnight, true) => 1.00m,
(false, TimeBand.Overnight, false) => 1.00m,
};
PeakTimePremiumFullã¡ãœããã¯ãããã³ã°ã«ã¿ãã«ã䜿çšããŸããããã¯CïŒ9.0ã®æ°ããããŒãžã§ã³ã§å¯èœã«ãªããŸãããã¡ãªã¿ã«ãã³ãŒããããèŠããšã2ã€ã®æé©åã瀺åããŠããŸãã
- æåŸã®8è¡ã¯åãå€ãè¿ããŸãã
- æŒãšå€ã®ãã©ãã£ãã¯ã¯åãä¿æ°ãæã£ãŠããŸãã
ãã®çµæã廿£ãã¿ãŒã³ã䜿çšããŠã¡ãœããã³ãŒããå€§å¹ ã«åæžã§ããŸãã
public static decimal PeakTimePremiumFull(DateTime timeOfToll, bool inbound) =>
(IsWeekDay(timeOfToll), GetTimeBand(timeOfToll), inbound) switch
{
(true, TimeBand.MorningRush, true) => 2.00m,
(true, TimeBand.MorningRush, false) => 1.00m,
(true, TimeBand.Daytime, _) => 1.50m,
(true, TimeBand.EveningRush, true) => 1.00m,
(true, TimeBand.EveningRush, false) => 2.00m,
(true, TimeBand.Overnight, _) => 0.75m,
(false, _, _) => 1.00m,
};
ããèŠããšããã®ãªãã·ã§ã³ãæžãããŠãäžè¬çãªå Žåã®ä¿æ°1.0ãåãåºãããšãã§ããŸãã
public static decimal PeakTimePremiumFull(DateTime timeOfToll, bool inbound) =>
(IsWeekDay(timeOfToll), GetTimeBand(timeOfToll), inbound) switch
{
(true, TimeBand.Overnight, _) => 0.75m,
(true, TimeBand.Daytime, _) => 1.5m,
(true, TimeBand.MorningRush, true) => 2.0m,
(true, TimeBand.EveningRush, false) => 2.0m,
_ => 1.0m,
};
念ã®ãããæç¢ºã«ããŠãããŸããæ¯èŒã¯ããªã¹ããããŠããé åºã§è¡ãããŸããæåã®äžèŽã§ã察å¿ããå€ãè¿ããããã以äžã®æ¯èŒã¯è¡ãããŸããã
ã¹ã€ããåŒã®æŽæ°ã¿ãã«ã¯ãCïŒ8.0ã§ã䜿çšã§ããŸãããã®èšäºãæžãã䟡å€ã®ãªãéçºè ã¯ãå°ãè³¢ããªã£ãã ãã§ãã
ãããŠæåŸã«ãã¿ãã«ãšãªããžã§ã¯ãããããã£ã®äž¡æ¹ãšç §åããããã®æ°ããæ§æã瀺ãå¥ã®ã¯ã¬ã€ãžãŒãªäŸã次ã«ç€ºããŸãã
public static bool IsAccessOkOfficial(Person user, Content content, int season) =>
(user, content, season) switch
{
({Type: Child}, {Type: ChildsPlay}, _) => true,
({Type: Child}, _, _) => false,
(_ , {Type: Public}, _) => true,
({Type: Monarch}, {Type: ForHerEyesOnly}, _) => true,
(OpenCaseFile f, {Type: ChildsPlay}, 4) when f.Name == "Sherlock Holmes" => true,
{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}}
when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true,
(OpenCaseFile, var c, 4) when c.Name.Contains("Sherrinford") => true,
(OpenCaseFile {RiskLevel: >50 and <100 }, {Type: StateSecret}, 3) => true,
_ => false,
};
ããã¯ãã¹ãŠããªãçããããã«èŠããŸããå®å šã«çè§£ããããã«ããœãŒã¹ã確èªããããšããå§ãããŸããã³ãŒãã®å®å šãªäŸããããŸãã
æ°ããæ°ããã ãã§ãªããåºæ¬çã«æ¹åãããã¿ãŒã²ããã¿ã€ãã³ã°
æãCïŒã§ã¯ãåèªäœãã³ã³ããã¹ãããæ±ºå®ã§ãããããååã®ä»£ããã«varãæžãããšãå¯èœã«ãªããŸããïŒå®éãããã¯ã¿ãŒã²ããåä»ããšåŒã°ããŸãïŒãã€ãŸããæ¬¡ã®ãšã³ããªã®ä»£ããã«ïŒ
SomeLongNamedType variable = new SomeLongNamedType();
ããã³ã³ãã¯ãã«æžãããšãå¯èœã«ãªããŸããïŒ
var variable = new SomeLongNamedType()
ãããŠãã³ã³ãã€ã©ã¯å€æ°èªäœã®ã¿ã€ããæšæž¬ããŸããäœå¹Žã«ãããã£ãŠãéã®æ§æãå®è£ ãããŸããã
SomeLongNamedType variable = new ();
ãã®æ§æã¯ã倿°ã宣èšãããšãã ãã§ãªããã³ã³ãã€ã©ãããã«åãæšæž¬ã§ããä»ã®å€ãã®å Žåã«ãæ©èœãããšããäºå®ã«ç¹ã«æè¬ããŸããããšãã°ããã©ã¡ãŒã¿ãã¡ãœããã«æž¡ããã¡ãœããããå€ãè¿ãå Žåãæ¬¡ã®ããã«ãªããŸãã
var result = SomeMethod(new (2020,10,01));
//...
public Car SomeMethod(DateTime p)
{
//...
return new() { Passengers = 2 };
}
ãã®äŸã§ã¯ãSomeMethodãåŒã³åºããšãã«ãDateTimeã¿ã€ãã®ãã©ã¡ãŒã¿ãŒãç°¡ç¥æ§æã§äœæãããŸããã¡ãœããããè¿ãããå€ãåãæ¹æ³ã§äœæãããŸãã
ãã®æ§æã«å®éã«ã¡ãªãããããã®ã¯ãã³ã¬ã¯ã·ã§ã³ãå®çŸ©ãããšãã§ãã
List<DateTime> datesList = new()
{
new(2020, 10, 01),
new(2020, 10, 02),
new(2020, 10, 03),
new(2020, 10, 04),
new(2020, 10, 05)
};
Car[] cars =
{
new() {Passengers = 2},
new() {Passengers = 3},
new() {Passengers = 4}
};
ã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ãäžèŠ§è¡šç€ºãããšãã«å®å šãªååãèšè¿°ããå¿ èŠããªããããã³ãŒããå°ããããããããªããŸãã
ã¿ãŒã²ããåæŒç®å?? ãããŠïŒïŒ
äžå æŒç®åïŒïŒCïŒ9.0ã§æ¹åãããŸããã以åã¯ãè¿åã¿ã€ãã«å®å šã«æºæ ããå¿ èŠããããŸããããçŸåšã¯ããã¹ããŒãã«ãªã£ãŠããŸããããã¯ã以åã®ããŒãžã§ã³ã®èšèªã§ã¯ç¡å¹ã§ãããã9çªç®ã®ããŒãžã§ã³ã§ã¯ããªãåæ³ã§ãã£ãåŒã®äŸã§ãã
int? result = b ? 0 : null; // nullable value type
以åã¯ããŒãããintã«æç€ºçã«ãã£ã¹ãããå¿ èŠããããŸãããïŒ..çŸåšã¯å¿ èŠãããŸããã
ãŸããæ°ããããŒãžã§ã³ã®èšèªã§ã¯ãæ¬¡ã®æ§é ã䜿çšã§ããŸãã
Person person = student ?? customer; // Shared base type
顧客ãšåŠçã®ã¿ã€ãã¯ãPersonããæŽŸçããŠããŸãããæè¡çã«ç°ãªããŸãã以åã®ããŒãžã§ã³ã®èšèªã§ã¯ãæç€ºçãªåãã£ã¹ããªãã§ãã®ãããªæ§æã䜿çšããããšã¯ã§ããŸããã§ãããããã§ãã³ã³ãã€ã©ã¯æå³ãå®å šã«çè§£ããŸãã
ã¡ãœããã®æ»ãã¿ã€ãããªãŒããŒã©ã€ããã
CïŒ9.0ã§ã¯ããªãŒããŒã©ã€ããããã¡ãœããã®æ»ãã¿ã€ãããªãŒããŒã©ã€ãããããšãèš±å¯ãããŠããŸãããèŠä»¶ã¯1ã€ã ãã§ããæ°ããã¿ã€ãã¯ãå ã®ã¿ã€ãïŒå ±å€ïŒããç¶æ¿ããå¿ èŠããããŸããæ¬¡ã«äŸã瀺ããŸãã
abstract class Animal
{
public abstract Food GetFood();
...
}
class Tiger : Animal
{
public override Meat GetFood() => ...;
}
Tigerã¯ã©ã¹ã§ã¯ãGetFoodã¡ãœããã®æ»ãå€ãFoodããMeatã«åå®çŸ©ãããŸãããèãé£ç©ã«ç±æ¥ãããã©ããã¯ä»ã§ã¯å€§äžå€«ã§ãã
initããããã£ã¯å®éã«ã¯èªã¿åãå°çšã¡ã³ããŒã§ã¯ãããŸãã
èšèªã®æ°ããããŒãžã§ã³ã§ããinit-propertiesã«è峿·±ãæ©èœãç»å ŽããŸããããããã¯ããªããžã§ã¯ãã®åæåæåäžã«ã®ã¿èšå®ã§ããããããã£ã§ããããã«ã¯èªã¿åãå°çšã®ã¯ã©ã¹ã¡ã³ããŒãååšããããã«èŠããŸãããå®éã«ã¯ãããŸããŸãªåé¡ã解決ã§ããããŸããŸãªãã®ã§ããinitããããã£ã®éããšçŸãããçè§£ããããã«ã次ã®äŸã瀺ããŸãã
Person employee = new () {
Name = "Paul McCartney",
Company = "High Technologies Center",
CompanyAddress = new () {
Country = "Russia",
City = "Izhevsk",
Line1 = "246, Karl Marx St."
}
}
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã宣èšããããã®ãã®æ§æã¯ãç¹ã«ã¯ã©ã¹ã®ããããã£ã®äžã«ãªããžã§ã¯ããå€ãå Žåã«éåžžã«äŸ¿å©ã§ãããã ãããã®æ§æã«ã¯å¶éããããŸãã察å¿ããã¯ã©ã¹ããããã£ã¯å€æŽå¯èœã§ããå¿ èŠããããŸããããã¯ããããã®ããããã£ã®åæåãã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒã³åºãåŸã«è¡ãããããã§ããã€ãŸããäŸã®Personã¯ã©ã¹ã¯æ¬¡ã®ããã«å®£èšããå¿ èŠããããŸãã
class Person {
//...
public string Name {get; set;}
public string Company {get; set;}
public Address CompanyAddress {get; set;}
//...
}
ãã ããå®éã«ã¯ãNameããããã£ã¯äžå€ã§ããçŸåšããã®èªã¿åãå°çšããããã£ãäœæããå¯äžã®æ¹æ³ã¯ããã©ã€ããŒãã»ãã¿ãŒã宣èšããããšã§ãã
class Person {
//...
public string Name {get; private set;}
//...
}
ãã ãããã®å Žåãäžæ¬åŒ§å ã®ããããã£ã«å€ãå²ãåœãŠãããšã§ãã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã宣èšããããã®äŸ¿å©ãªæ§æã䜿çšããæ©èœãããã«å€±ãããŸãããŸããNameããããã£ã®å€ã¯ããã©ã¡ãŒã¿ã§ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ã«æž¡ãããšã«ãã£ãŠã®ã¿èšå®ã§ããŸããããã§ãCompanyAddressããããã£ãå®éã«ã¯äžå€ã§ãããšæ³åããŠãã ãããäžè¬çã«ãç§ã¯äœåºŠããã®ãããªç¶æ³ã«é¥ããåžžã«2ã€ã®æªããéžæããªããã°ãªããŸããã§ããã
- ããããã®ãã©ã¡ãŒã¿ãåãã豪è¯ãªã³ã³ã¹ãã©ã¯ã¿ã§ãããèªã¿åãå°çšã¯ã©ã¹ã®ãã¹ãŠã®ããããã£ã
- ãªããžã§ã¯ããäœæããããã®äŸ¿å©ãªæ§æã§ãããèªã¿åã/æžã蟌ã¿ã¯ã©ã¹ã®ãã¹ãŠã®ããããã£ã§ãããããèŠããŠããå¿ èŠãããã誀ã£ãŠã©ããã§å€æŽããªãããã«ããå¿ èŠããããŸãã
ãã®æç¹ã§ã誰ããã¯ã©ã¹ã®èªã¿åãå°çšã¡ã³ããŒãæãåºããŠãPersonã¯ã©ã¹ã®ã¹ã¿ã€ã«ã次ã®ããã«ææ¡ããå¯èœæ§ããããŸãã
class Person {
//...
public readonly string Name;
public readonly string Company;
public readonly string CompanyAddress;
//...
}
ãã®æ¹æ³ã¯FengShuiã«ããã ãã§ãªãã䟿å©ãªåæåã®åé¡ã解決ããªããšç§ã¯çããŸããèªã¿åãå°çšã¡ã³ããŒã¯ããã©ã€ããŒãã»ãã¿ãŒãæã€ããããã£ã®ããã«ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ã®ã¿èšå®ã§ããŸãã
ããããCïŒ9.0ã§ã¯ããã®åé¡ã¯è§£æ±ºãããŠããŸããããããã£ãinitããããã£ãšããŠå®çŸ©ãããšããªããžã§ã¯ããäœæããããã®äŸ¿å©ãªæ§æãšãå°æ¥å®éã«äžå€ã®ããããã£ã®äž¡æ¹ãåŸãããŸãã
class Person {
public string Name { get; init; }
public string Company { get; init; }
public Address CompanyAddress { get; init; }
}
ã¡ãªã¿ã«ãinit-propertiesã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãšåæ§ã«ãèªã¿åãå°çšã®ã¯ã©ã¹ã¡ã³ããŒãåæåã§ããæ¬¡ã®ããã«èšè¿°ã§ããŸãã
public class Person
{
private readonly string name;
public string Name
{
get => name;
init => name = (value ?? throw new ArgumentNullException(nameof(Name)));
}
}
ã¬ã³ãŒãã¯åæ³åãããDTOã§ã
äžå€ã®ããããã£ã®ãããã¯ãç¶ããŠãç§ã®æèŠã§ã¯ãèšèªã®é©æ°ãã€ãŸãã¬ã³ãŒãã¿ã€ãã«è¡ãçããŸãããã®ã¿ã€ãã¯ãããããã£ã ãã§ãªããäžå€ã®æ§é å šäœã䟿å©ã«äœæããããã«èšèšãããŠããŸããå¥ã®ã¿ã€ããç»å Žããçç±ã¯åçŽã§ãããã¹ãŠã®åºæºã«åŸã£ãŠæ©èœããã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªã¬ã€ã€ãŒãåé¢ããããã«åžžã«DTOãäœæããŸãã DTOã¯éåžžãããžãã¹ããžãã¯ãæããªããåãªããã£ãŒã«ãã®ã³ã¬ã¯ã·ã§ã³ã§ãããããŠãååãšããŠããããã®ãã£ãŒã«ãã®å€ã¯ããã®DTOã®åç¶æéäžã«å€æŽãããŸããã
.
DTO â Data Transfer Object. (DAL, BL, PL) - . «». -DTO' DAL BL, , DTO-, , DTO-, - ( HTML- JSON-).
â DTO-, - -, .
DTO- - . DTO-, AutoMapper - .
, DTO- .
ãã®ãããäœå¹Žã«ãããã£ãŠãCïŒéçºè ã¯æ¬åœã«å¿ èŠãªæ¹åã«å°éããŸããã圌ãã¯DTOã¢ãã«ãå¥åã®ã¬ã³ãŒãã¿ã€ããšããŠåæ³åããŸããã
ãããŸã§ãç§ãã¡ãäœæããïŒãããŠå€§éã«äœæããïŒãã¹ãŠã®DTOã¢ãã«ã¯éåžžã®ã¯ã©ã¹ã§ãããã³ã³ãã€ã©ãŒãšã©ã³ã¿ã€ã ã«ã€ããŠã¯ãå€å žçãªæå³ã§ã¯ããã§ã¯ãããŸããã§ããããä»ã®ãã¹ãŠã®ã¯ã©ã¹ãšéãã¯ãããŸããã§ããã DTOã¢ãã«ã«æ§é ã䜿çšãã人ã¯ã»ãšãã©ããŸãããããã¯ãããŸããŸãªçç±ã§åžžã«åãå ¥ãããããšã¯éããŸããã§ããã
ããã§ãã¬ã³ãŒãïŒä»¥äžãã¬ã³ãŒããšåŒã³ãŸãïŒãå®çŸ©ã§ããŸããããã¯ãäžå€ã®DTOã¢ãã«ãäœæããããã«èšèšãããç¹å¥ãªæ§é ã§ããé²é³ã¯ãéåžžã®æå³ã§æ§é ãšã¯ã©ã¹ã®äžéã«äœçœ®ããŸããããã¯ãµãã¯ã©ã¹ãšã¹ãŒããŒã¹ãã©ã¯ãã£ãŒã®äž¡æ¹ã§ããã¬ã³ãŒãã¯äŸç¶ãšããŠåç §ã¿ã€ãã§ããããã®åŸã®ãã¹ãŠã®çµæã䌎ããŸããã»ãšãã©ã®å Žåãã¬ã³ãŒãã¯éåžžã®ã¯ã©ã¹ã®ããã«åäœããã¡ãœãããå«ããããšãã§ããç¶æ¿ãèš±å¯ããŸãïŒãã ãããªããžã§ã¯ãããã§ã¯ãªããä»ã®ã¬ã³ãŒãããã®ã¿ã§ãããã ããã¬ã³ãŒããæç€ºçã«äœãããç¶æ¿ããªãå Žåã¯ãCïŒã®ãã¹ãŠãšåãããã«æé»çã«ãªããžã§ã¯ãããç¶æ¿ããŸãïŒã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ã§ããŸããããã«ãã¬ã³ãŒããå®å šã«äžå€ã«ããå¿ èŠã¯ãŸã£ãããããŸãããã§ã¯ããã®æå³ã¯ã©ãã«ãããéãã¯äœã§ããïŒ
ãšã³ããªãäœæããŠã¿ãŸãããã
public record Person
{
public string LastName { get; }
public string FirstName { get; }
public Person(string first, string last) => (FirstName, LastName) = (first, last);
}
ãããŠä»ããã«ããã䜿çšããæ¹æ³ã®äŸããããŸãïŒ
Person p1 = new ("Paul", "McCartney");
Person p2 = new ("Paul", "McCartney");
System.Console.WriteLine(p1 == p2);
ãã®äŸã¯ãã³ã³ãœãŒã«ã«trueãåºåããŸããPersonãã¯ã©ã¹ã®å Žåããªããžã§ã¯ãã¯åç §ã«ãã£ãŠæ¯èŒããããããfalseãã³ã³ãœãŒã«ã«åºåãããŸãã2ã€ã®åç §å€æ°ã¯ãåããªããžã§ã¯ããåç §ããŠããå Žåã«ã®ã¿çãããªããŸããããããããã¯é²é³ã«ã¯åœãŠã¯ãŸããŸãããã¬ã³ãŒãã¯ããã©ã€ããŒããã£ãŒã«ããå«ããã¹ãŠã®ãã£ãŒã«ãã®å€ã«ãã£ãŠæ¯èŒãããŸãã
åã®äŸãç¶ããŠã次ã®ã³ãŒããèŠãŠã¿ãŸãããã
System.Console.WriteLine(p1);
ã¯ã©ã¹ã®å Žåãã³ã³ãœãŒã«ã«ã¯ã©ã¹ã®ãã«ããŒã ã衚瀺ãããŸãããã ãããšã³ããªã®å Žåãã³ã³ãœãŒã«ã«æ¬¡ã®ããã«è¡šç€ºãããŸãã
Person { LastName = McCartney, FirstName = Paul}
å®éã®ãšãããã¬ã³ãŒãã®å ŽåãToStringïŒïŒã¡ãœããã¯æé»çã«ãªãŒããŒã©ã€ããããã¿ã€ãåã§ã¯ãªããå€ãå«ããããªãã¯ãã£ãŒã«ãã®å®å šãªãªã¹ãã衚瀺ããŸããåæ§ã«ãã¬ã³ãŒãã®å Žåã==ããã³ïŒ=æŒç®åã¯æé»çã«åå®çŸ©ãããŸããããã«ãããæ¯èŒããžãã¯ã倿Žã§ããŸãã
ã¬ã³ãŒãã®ç¶æ¿ã§éãã§ã¿ãŸãããïŒ
public record Teacher : Person
{
public string Subject { get; }
public Teacher(string first, string last, string sub)
: base(first, last) => Subject = sub;
}
次ã«ãç°ãªãã¿ã€ãã®2ã€ã®æçš¿ãäœæããããããæ¯èŒããŠã¿ãŸãããã
Person p = new("Paul", "McCartney");
Teacher t = new("Paul", "McCartney", "Programming");
System.Console.WriteLine(p == t);
Teacherã¬ã³ãŒãã¯Personããç¶æ¿ãããŸãããp倿°ãšt倿°ã¯çãããªããfalseãã³ã³ãœãŒã«ã«åºåãããŸããããã¯ãã¬ã³ãŒãã®ãã¹ãŠã®ãã£ãŒã«ãã ãã§ãªããã¿ã€ãã«ã€ããŠãæ¯èŒãè¡ãããããã§ã®ã¿ã€ããæããã«ç°ãªãããã§ãã
ãŸããç¶æ¿ãããã¬ã³ãŒãã¿ã€ãã®æ¯èŒã¯èš±å¯ãããŠããŸããïŒãã ãæå³ããããŸããïŒãäžè¬ã«ç°ãªãã¬ã³ãŒãã¿ã€ãã®æ¯èŒã¯ååãšããŠèš±å¯ãããŠããŸããã
public record Person
{
public string LastName { get; }
public string FirstName { get; }
public Person(string first, string last) => (FirstName, LastName) = (first, last);
}
public record Person2
{
public string LastName { get; }
public string FirstName { get; }
public Person2(string first, string last) => (FirstName, LastName) = (first, last);
}
// ...
Person p = new("Paul", "McCartney");
Person2 p2 = new("Paul", "McCartney");
System.Console.WriteLine(p == p2); //
ãšã³ããªã¯åãããã«èŠããŸãããæåŸã®è¡ã«ã³ã³ãã€ã«ãšã©ãŒããããŸããåãã¿ã€ããŸãã¯ç¶æ¿ãããã¿ã€ãã®ã¬ã³ãŒãã®ã¿ãæ¯èŒã§ããŸãã
ã¬ã³ãŒãã®ãã1ã€ã®åªããæ©èœã¯ãwithããŒã¯ãŒãã§ããããã«ãããDTOã¢ãã«ã«å€æŽãç°¡åã«äœæã§ããŸããäŸãèŠãŠãã ããïŒ
Person me = new("Steve", "Brown");
Person brother = me with { FirstName = "Paul" };
ãã®äŸã§ã¯ãå åŒã¬ã³ãŒãã®å ŽåãFirstNameãã£ãŒã«ããé€ããã¹ãŠã®ãã£ãŒã«ãã®å€ãmeã¬ã³ãŒãããå ¥åãããPaulã«å€æŽãããŸãã
ãããŸã§ãã³ã³ã¹ãã©ã¯ã¿ãŒãããããã£ãªã©ã®å®å šãªå®çŸ©ã䜿çšããŠãã¬ã³ãŒããäœæããåŸæ¥ã®æ¹æ³ãèŠãŠããŸãããããããä»ã§ã¯ç°¡æœãªæ¹æ³ããããŸãã
public record Person(string FirstName, string LastName);
public record Teacher(string FirstName, string LastName,
string Subject)
: Person(FirstName, LastName);
public sealed record Student(string FirstName,
string LastName, int Level)
: Person(FirstName, LastName);
ãšã³ããªãç°¡åã«å®çŸ©ãããšãã³ã³ãã€ã©ãããããã£ãšã³ã³ã¹ãã©ã¯ã¿ãäœæããŸãããã ãããã®æ©èœã«ã¯è¿œå ã®æ©èœããããŸããç°¡ç¥è¡šèšã䜿çšããŠããããã£ãšã³ã³ã¹ãã©ã¯ã¿ãŒãå®çŸ©ã§ããã ãã§ãªããåæã«ç¬èªã®ã¡ãœããããšã³ããªã«è¿œå ã§ããŸãã
public record Pet(string Name)
{
public void ShredTheFurniture() =>
Console.WriteLine("Shredding furniture");
}
public record Dog(string Name) : Pet(Name)
{
public void WagTail() =>
Console.WriteLine("It's tail wagging time");
public override string ToString()
{
StringBuilder s = new();
base.PrintMembers(s);
return $"{s.ToString()} is a dog";
}
}
ãã®å Žåãã¬ã³ãŒãã®ããããã£ãšã³ã³ã¹ãã©ã¯ã¿ãŒãèªåçã«äœæãããŸãããã€ã©ãŒãã¬ãŒãã³ãŒãã¯ãŸããŸãå°ãªããªã£ãŠããŸãããæçš¿ã«ã®ã¿é©çšãããŸããããã¯ãã¯ã©ã¹ãšæ§é ã§ã¯æ©èœããŸããã
ãã§ã«è¿°ã¹ããã¹ãŠã«å ããŠãã³ã³ãã€ã©ã¯ã¬ã³ãŒãã®ãã³ã³ã¹ãã©ã¯ã¿ãèªåçã«äœæããããšãã§ããŸãã
var person = new Person("Bill", "Wagner");
var (first, last) = person; //
Console.WriteLine(first);
Console.WriteLine(last);
ãã ããILã¬ãã«ã§ã¯ãã¬ã³ãŒãã¯äŸç¶ãšããŠã¯ã©ã¹ã§ãããã ãã確èªããŸã èŠã€ãã£ãŠããªãçãã1ã€ãããŸããã¬ã³ãŒãã¯ãå®è¡æã¬ãã«ã®ã©ããã§å€§å¹ ã«æé©åãããå¯èœæ§ããããŸãããããããç¹å®ã®ã¬ã³ãŒããäžå€ã§ããããšãäºåã«ããã£ãŠããããã§ããããã«ãããå°ãªããšããã«ãã¹ã¬ããç°å¢ã§ã¯æé©åã®æ©äŒãéãããéçºè ã¯ããã«ç¹å¥ãªåªåãæãå¿ èŠãããããŸããã
ãã®éããã¹ãŠã®DTOã¢ãã«ãã¯ã©ã¹ããã¬ã³ãŒãã«æžãçŽããŠããŸãã
.NETãœãŒã¹ãžã§ãã¬ãŒã¿
ãœãŒã¹ãžã§ãã¬ãŒã¿ãŒïŒä»¥äžãåã«ãžã§ãã¬ãŒã¿ãŒãšåŒã³ãŸãïŒã¯ãéåžžã«è峿·±ãæ©èœã§ãããžã§ãã¬ãŒã¿ãŒã¯ãã³ã³ãã€ã«æ®µéã§å®è¡ãããã³ãŒãã®äžéšã§ãããæ¢ã«ã³ã³ãã€ã«ãããã³ãŒããåæããæ©èœããããã³ã³ãã€ã«ããã远å ã®ã³ãŒããçæã§ããŸããå®å šã«æç¢ºã§ã¯ãªãå Žåã¯ããžã§ãã¬ãŒã¿ãŒãå¿ èŠã«ãªãå¯èœæ§ãããå Žåã®1ã€ã®ããªãé©åãªäŸã次ã«ç€ºããŸãã
ASP.NET Coreã§äœæããCïŒ/ãNETWebã¢ããªã±ãŒã·ã§ã³ãæ³åããŠã¿ãŠãã ããããã®ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšããã®ã¢ããªã±ãŒã·ã§ã³ãäœã§æ§æãããŠããã®ãããããŠäœããã¹ãããåæããããã®åæåã®ããã¯ã°ã©ãŠã³ãäœæ¥ã倧éã«ãããŸããåå°ã¯å¿ æ»ã«äœ¿çšãããŸãããã®çµæãã¢ããªã±ãŒã·ã§ã³ã®èµ·åããæåã®èŠæ±ã®åŠçã®éå§ãŸã§ã®æéãã²ã©ãé·ããªãå¯èœæ§ããããããã¯é«è² è·ã®ãµãŒãã¹ã§ã¯åãå ¥ããããŸããããžã§ãã¬ãŒã¿ã¯ããã®æéãççž®ããã®ã«åœ¹ç«ã¡ãŸããã³ã³ãã€ã«æ®µéã§ãããã§ã«ã³ã³ãã€ã«ãããã¢ããªã±ãŒã·ã§ã³ãåæããããã«ãèµ·åæã«ã¯ããã«é«éã«åæåããããã«å¿ èŠãªã³ãŒããçæã§ããŸãã
ãŸãããªãã¬ã¯ã·ã§ã³ã䜿çšããŠå®è¡æã«äœ¿çšããããªããžã§ã¯ãã®ã¿ã€ããæ±ºå®ããã©ã€ãã©ãªãããªã倿°ãããŸãïŒãã®äžã«ã¯å€ãã®ãããNugetããã±ãŒãžããããŸãïŒãããã«ããããžã§ãã¬ãŒã¿ãŒã䜿çšããæé©åã®å€§ããªå¯èœæ§ãéããããã®æ©èœã®äœæè ã¯ãã©ã€ãã©ãªéçºè ããã®é©åãªæ¹åãæåŸ ããŠããŸãã
ã³ãŒããžã§ãã¬ãŒã¿ãŒã¯æ°ãããããã¯ã§ããããã®æçš¿ã®ç¯å²ã«åãŸããªãã»ã©çãããã®ã§ããããã«ãæãåçŽãªãHelloãworldïŒãã®äŸãèŠãããšãã§ããŸãããã®ã¬ãã¥ãŒã®ãžã§ãã¬ãŒã¿ã
ã³ãŒããžã§ãã¬ãŒã¿ã«é¢é£ãã2ã€ã®æ°æ©èœãããã以äžã§èª¬æããŸãã
éšåçãªæ¹æ³
CïŒã®éšåã¯ã©ã¹ã¯é·ãéååšããŠããããã®æ¬æ¥ã®ç®çã¯ãç¹å®ã®èšèšè ã«ãã£ãŠçæãããã³ãŒããããã°ã©ããŒã«ãã£ãŠäœæãããã³ãŒãããåé¢ããããšã§ããéšåçãªã¡ãœããã¯CïŒ9.0ã§èª¿æŽãããŠããŸãããããã¯æ¬¡ã®ããã«ãªããŸãã
public partial class MyClass
{
public partial int DoSomeWork(out string p);
}
public partial class MyClass
{
public partial int DoSomeWork(out string p)
{
p = "test";
System.Console.WriteLine("Partial method");
return 5;
}
}
ãã®ä»£çã®äŸã¯ãéšåçãªã¡ãœãããéåžžã®ã¡ãœãããšæ¬è³ªçã«å€ãããªãããšã瀺ããŠããŸããå€ãè¿ãããšãã§ããåºå倿°ãåãå ¥ããããšãã§ããã¢ã¯ã»ã¹ä¿®é£Ÿåãæã€ããšãã§ããŸãã
å ¥æå¯èœãªæ å ±ãããéšåçãªã¡ãœããã¯ã䜿çšãæå³ãããŠããã³ãŒããžã§ãã¬ãŒã¿ãŒãšå¯æ¥ã«é¢é£ããŠããŸãã
ã¢ãžã¥ãŒã«åæåå
ãã®æ©èœãå°å ¥ããçç±ã¯3ã€ãããŸãã
- æå°éã®ãªãŒããŒãããã§ããŠãŒã¶ãŒãäœããåŒã³åºãå¿ èŠããªããã©ã€ãã©ãªãèµ·åæã«1åéãã®åæåãè¡ãããšãã§ããããã«ããŸãã
- éçã³ã³ã¹ãã©ã¯ã¿ãŒã®æ¢åã®æ©èœã¯ããã®åœ¹å²ã«ã¯ããŸãé©ããŠããŸãããéšå£ã¯ãéçã³ã³ã¹ãã©ã¯ã¿ãŒãæã€ã¯ã©ã¹ã䜿çšãããŠãããã©ãããæåã«ææ¡ããå¿ èŠãããïŒãããã¯ã«ãŒã«ã§ãïŒãããã«ããæž¬å®å¯èœãªé å»¶ãçºçããŸãã
- ã³ãŒããžã§ãã¬ãŒã¿ã«ã¯ãæç€ºçã«åŒã³åºãå¿ èŠã®ãªããããçš®ã®åæåããžãã¯ãå¿ èŠã§ãã
å®éããã®æ©èœããªãªãŒã¹ã«å«ãŸããããã«ã¯ãæåŸã®ç¹ã決å®çã«ãªã£ãŠããããã§ãããã®çµæãåæåã§ããã¡ãœãããã³ãŒãã£ã³ã°ããå¿ èŠãããæ°ãã屿§ãæãã€ããŸããã
using System.Runtime.CompilerServices;
class C
{
[ModuleInitializer]
internal static void M1()
{
// ...
}
}
ãã®æ¹æ³ã«ã¯ããã€ãã®å¶éããããŸãã
- éçã§ããå¿ èŠããããŸãã
- ãã©ã¡ãŒã¿ããã£ãŠã¯ãªããŸããã
- äœãè¿ããªãã¯ãã§ãã
- ãžã§ããªãã¯ã§ã¯æ©èœããªãã¯ãã§ãã
- å«ãŸããŠããã¢ãžã¥ãŒã«ããã¢ã¯ã»ã¹ã§ããå¿
èŠããããŸãã
- å éšãŸãã¯å ¬éã§ããå¿ èŠããããŸã
- ããŒã«ã«ã¡ãœããã§ããå¿ èŠã¯ãããŸãã
ãããŠã次ã®ããã«æ©èœããŸããã³ã³ãã€ã©ã¯ãModuleInitializer屿§ã§ããŒã¯ããããã¹ãŠã®ã¡ãœãããèŠã€ãããšããã«ãããããã¹ãŠãåŒã³åºãç¹å¥ãªã³ãŒããçæããŸããã€ãã·ã£ã©ã€ã¶ã¡ãœããã®åŒã³åºãé åºã¯æå®ã§ããŸããããåã³ã³ãã€ã«ã§åãã«ãªããŸãã
çµè«
ãã§ã«æçš¿ãå ¬éããŠããã®ã§ã.NETèªäœã®ãã¥ãŒã¹ãããCïŒ9.0èšèªã®ãã¥ãŒã¹ã«å°å¿µããŠããããšã«æ°ã¥ããŸãããããããããã¯ããŸããããŸããã