การอนุมานชนิดของคอลเลกชันจากเป้าหมาย
ให้ชนิดข้อมูลเป้าหมายกำหนดการสร้างคอลเลกชัน
การอนุมานชนิดของคอลเลกชันจากเป้าหมาย เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
การกำหนดชนิดตามเป้าหมายคืออะไร
การกำหนดชนิดตามเป้าหมาย หมายถึงการที่คอมไพเลอร์อนุมานว่านิพจน์คอลเลกชันควรสร้างสิ่งใดจากบริบทที่นำไปใช้ แทนที่จะดูจากชนิดที่ระบุไว้อย่างชัดเจนทางด้านขวา
using System;
int[] numbers = [1, 2, 3]; // target type is int[]
Console.WriteLine(numbers.GetType().Name); // Int32[]เป้าหมายเป็นตัวกำหนดชนิด
ค่าตามตัวอักษรเดียวกันอาจกลายเป็นชนิดรูปธรรมที่แตกต่างกัน ขึ้นอยู่กับชนิดของตัวแปร พารามิเตอร์ หรือค่าที่คืนซึ่งรับค่านั้นไป
using System;
using System.Collections.Generic;
int[] asArray = [1, 2, 3];
List<int> asList = [1, 2, 3];
Console.WriteLine(asArray is int[]); // True
Console.WriteLine(asList is List<int>); // Trueการกำหนดชนิดตามเป้าหมายในการเรียกใช้เมธอด
เมื่อพารามิเตอร์ของเมธอดเป็นชนิดคอลเลกชัน ค่าตามตัวอักษรของอาร์กิวเมนต์จะถูกกำหนดชนิดตามเป้าหมายให้ตรงกับพารามิเตอร์นั้น
using System;
using System.Collections.Generic;
static void Show(List<int> items) =>
Console.WriteLine(string.Join(",", items));
Show([10, 20, 30]); // target-typed to List<int>การกำหนดชนิดตามเป้าหมายในค่าที่คืน
เนื้อหาเมธอดสามารถคืนค่านิพจน์คอลเลกชันเปล่า ๆ ได้ โดยชนิดค่าที่คืนซึ่งประกาศไว้จะเป็นตัวกำหนดเป้าหมาย
using System;
using System.Collections.Generic;
static List<string> Tags() => ["csharp", "dotnet", "ranges"];
Console.WriteLine(Tags().Count); // 3การอนุมานชนิดขององค์ประกอบ
ชนิดขององค์ประกอบมาจากเป้าหมาย หากเป้าหมายเป็น double[] ค่าตามตัวอักษรชนิดจำนวนเต็มจะถูกขยายเป็น double โดยอัตโนมัติ
using System;
double[] values = [1, 2, 3]; // ints widen to double
Console.WriteLine(values[0] + 0.5); // 1.5อินเทอร์เฟซในฐานะเป้าหมาย
นิพจน์คอลเลกชันสามารถกำหนดเป้าหมายเป็นอินเทอร์เฟซ เช่น IEnumerable<T>, IReadOnlyList<T> หรือ ICollection<T> ได้ โดยคอมไพเลอร์จะเลือกชนิดรูปธรรมที่เหมาะสม
using System;
using System.Collections.Generic;
IReadOnlyList<int> ro = [1, 2, 3];
Console.WriteLine(ro.Count); // 3นิพจน์เงื่อนไขสามทางกับการกำหนดชนิดตามเป้าหมาย
ทั้งสองแขนงของเงื่อนไขสามารถเป็นนิพจน์คอลเลกชันได้ โดยแต่ละแขนงจะถูกกำหนดชนิดตามเป้าหมายให้เป็นชนิดผลลัพธ์ร่วมกัน
using System;
bool useDefaults = false;
int[] config = useDefaults ? [0, 0, 0] : [1, 2, 3];
Console.WriteLine(string.Join(",", config)); // 1,2,3var ไม่ใช่เป้าหมาย
คุณไม่สามารถเขียน var x = [1, 2, 3]; ได้ เพราะ var ไม่ได้ระบุชนิดเป้าหมาย ให้ระบุชนิดอย่างชัดเจน หรือใช้นิพจน์ในบริบทที่คาดว่าจะมีชนิด
using System;
// var x = [1, 2, 3]; // compile error: no target type
int[] x = [1, 2, 3]; // ok
Console.WriteLine(x.Length); // 3การกำหนดชนิดตามเป้าหมายร่วมกับองค์ประกอบแบบกระจาย
การกำหนดชนิดตามเป้าหมายและองค์ประกอบแบบกระจายทำงานร่วมกันได้ โดยเป้าหมายจะกำหนดชนิดคอลเลกชันสุดท้าย ส่วนองค์ประกอบแบบกระจายจะจัดหาเนื้อหา
using System;
using System.Collections.Generic;
int[] src = [1, 2, 3];
List<int> copy = [..src]; // copies into a List<int>
Console.WriteLine(copy is List<int>); // Trueลดความซ้ำซ้อน
การกำหนดชนิดตามเป้าหมายช่วยตัดชื่อชนิดที่ซ้ำกันออก ลองเปรียบเทียบรูปแบบเดิมที่ซ้ำซ้อนกับรูปแบบใหม่ที่กระชับ
using System;
// old: type repeated
int[] oldWay = new int[] { 1, 2, 3 };
// new: type only on the left
int[] newWay = [1, 2, 3];
Console.WriteLine(oldWay.Length == newWay.Length); // Trueนำทุกอย่างมารวมกัน
ในที่นี้ ตัวช่วยหนึ่งตัวรับคอลเลกชันแบบอ่านอย่างเดียวชนิดใดก็ได้ และผู้เรียกสามารถส่งค่าตามตัวอักษรที่กำหนดชนิดตามเป้าหมายได้อย่างอิสระ
using System;
using System.Collections.Generic;
static int Count(IReadOnlyCollection<int> c) => c.Count;
Console.WriteLine(Count([1, 2, 3, 4])); // 4ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการกำหนดชนิดตามเป้าหมายของคุณ
สรุปทบทวน
คุณได้เรียนรู้ว่านิพจน์คอลเลกชันกำหนดชนิดตามเป้าหมายอย่างไร
- ชนิดปลายทาง (ตัวแปร พารามิเตอร์ หรือค่าที่คืน) เป็นตัวกำหนดการสร้าง
- ชนิดขององค์ประกอบสามารถขยายให้ตรงกับเป้าหมายได้
- อินเทอร์เฟซอย่าง
IReadOnlyList<T>สามารถเป็นเป้าหมายได้ varไม่สามารถเป็นเป้าหมายได้
คำถามที่พบบ่อย
บทเรียน “การอนุมานชนิดของคอลเลกชันจากเป้าหมาย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การอนุมานชนิดของคอลเลกชันจากเป้าหมาย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การอนุมานชนิดของคอลเลกชันจากเป้าหมาย”
ให้ชนิดข้อมูลเป้าหมายกำหนดการสร้างคอลเลกชัน คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การอนุมานชนิดของคอลเลกชันจากเป้าหมาย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ไวยากรณ์นิพจน์คอลเลกชัน
- องค์ประกอบกระจาย
- การอนุมานชนิดของคอลเลกชันจากเป้าหมาย
- ตัวสร้างคอลเลกชัน