0Pricing
C# Academy · บทเรียน

การอนุมานชนิดของคอลเลกชันจากเป้าหมาย

ให้ชนิดข้อมูลเป้าหมายกำหนดการสร้างคอลเลกชัน

การอนุมานชนิดของคอลเลกชันจากเป้าหมาย เป็นบทเรียน 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,3

var ไม่ใช่เป้าหมาย

คุณไม่สามารถเขียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ไวยากรณ์นิพจน์คอลเลกชัน
  2. องค์ประกอบกระจาย
  3. การอนุมานชนิดของคอลเลกชันจากเป้าหมาย
  4. ตัวสร้างคอลเลกชัน
← กลับไปที่ C# Academy