C# Academy · บทเรียน

unmanaged, notnull, new() (จำลองใน C# 6)

C# 6 รองรับข้อจำกัดของ class/struct/new() จำลอง notnull/unmanaged รุ่นใหม่ด้วยการตรวจสอบ รูปแบบ API และแนวปฏิบัติร่วมกัน

บทเรียน 1 จาก 38 ขั้นตอน

unmanaged, notnull, new() (จำลองใน C# 6) เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

ภาพรวมของข้อจำกัด

เป้าหมาย: ใช้ข้อจำกัดชนิดทั่วไปของ C# 6 ให้เกิดประสิทธิผล

  • คลาส เทียบกับ โครงสร้าง
  • ตัวสร้างแบบไม่มีพารามิเตอร์สำหรับการสร้างโดยไม่ใช้ตัวสร้างแบบไดนามิก
  • จำลองข้อกำหนด ไม่เป็นค่าว่าง/ไม่มีการจัดการหน่วยความจำ ด้วยการตรวจสอบและการออกแบบส่วนติดต่อการเขียนโปรแกรม

คลาสเทียบกับโครงสร้าง

คลาส จำกัด T ให้เป็นชนิดอ้างอิง ส่วน โครงสร้าง จำกัด T ให้เป็นชนิดค่า การใช้งานผิดจะล้มเหลวขณะคอมไพล์

using System;

// Works only for reference types
public static class RefBox
{
  public static string Show<T>(T value) where T : class
  {
    return value == null ? "null ref" : "ref: " + value.ToString();
  }
}

// Works only for value types
public static class ValBox
{
  public static string Show<T>(T value) where T : struct
  {
    return "value: " + value.ToString();
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    string s = "hello";
    int n = 42;

    Console.WriteLine(RefBox.Show<string>(s)); // OK
    Console.WriteLine(ValBox.Show<int>(n));    // OK

    // Console.WriteLine(RefBox.Show<int>(n)); // compile-time error (int is struct)
    // Console.WriteLine(ValBox.Show<string>(s)); // compile-time error (string is class)
  }
}

การใช้ตัวสร้างแบบไม่มีพารามิเตอร์จริง

ข้อจำกัดตัวสร้างแบบไม่มีพารามิเตอร์รับประกันว่ามีตัวสร้างสาธารณะที่ไม่มีพารามิเตอร์ ทำให้โค้ดชนิดทั่วไปสามารถสร้าง T ได้โดยตรง

using System;

// Requires public parameterless ctor on T
public static class Factory
{
  public static T Create<T>() where T : new()
  {
    return new T(); // safe in C# 6 with new()
  }
}

public sealed class Sample
{
  public string Name { get; set; }
  public Sample() { Name = "default"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Sample x = Factory.Create<Sample>();
    Console.WriteLine("Created: " + x.Name);
  }
}

จำลองข้อกำหนดไม่เป็นค่าว่าง

C# 6 ไม่มีข้อกำหนดเรื่องค่าที่ไม่เป็นค่าว่าง ให้ประมาณการด้วย ข้อจำกัด T เป็นชนิดอ้างอิง และเพิ่ม การตรวจสอบค่าว่าง อย่างชัดเจนภายในส่วนติดต่อการเขียนโปรแกรม

using System;

// C# 6 has no notnull constraint. Use where T : class and guard at runtime.
public static class NotNullApi
{
  public static int LengthOf<T>(T x) where T : class
  {
    if (x == null) throw new ArgumentNullException("x");
    return x.ToString().Length; // placeholder usage
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(NotNullApi.LengthOf<string>("hi")); // 2
    try
    {
      Console.WriteLine(NotNullApi.LengthOf<string>(null)); // throws
    }
    catch (Exception ex)
    {
      Console.WriteLine("Guard fired: " + ex.GetType().Name);
    }
  }
}

จำลองเจตนาของชนิดที่ไม่มีการจัดการหน่วยความจำ

C# 6 ไม่มีข้อกำหนดชนิดที่ไม่มีการจัดการหน่วยความจำ คุณสามารถใช้ โครงสร้าง และอินเทอร์เฟซ เช่น อินเทอร์เฟซสำหรับการเปรียบเทียบ เพื่อมุ่งเป้าไปยังชนิดค่าที่มีลักษณะคล้ายตัวเลข

using System;

// No unmanaged constraint in C# 6.
// Use struct for value types and restrict API usage (document numeric-only intent).
public static class NumericOps
{
  public static T Max<T>(T a, T b) where T : struct, IComparable
  {
    // Works for numeric primitives because they implement IComparable
    return (a.CompareTo(b) >= 0) ? a : b;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(NumericOps.Max<int>(3, 9));     // 9
    Console.WriteLine(NumericOps.Max<double>(2.5, 2)); // 2.5
  }
}

เคล็ดลับเชิงปฏิบัติ

เคล็ดลับ:

  • เลือก คลาส/โครงสร้าง เพื่อจำกัด T ตั้งแต่เนิ่น ๆ
  • ใช้ตัวสร้างแบบไม่มีพารามิเตอร์หากต้องสร้าง T
  • จำลองข้อกำหนด ไม่เป็นค่าว่าง ด้วยการตรวจสอบขณะทำงาน
  • จำลองข้อกำหนด ไม่มีการจัดการหน่วยความจำ ด้วยโครงสร้างและการใช้งานที่มีเอกสารกำกับ ซึ่งมักเป็นชนิดพื้นฐานทางตัวเลข

ข้อจำกัดตัวสร้าง

ตรวจสอบสั้น ๆ: ข้อจำกัดใดใน C# 6 ที่กำหนดให้อาร์กิวเมนต์ชนิดต้องมีตัวสร้างสาธารณะที่ไม่มีพารามิเตอร์

สรุปทบทวน

สรุปทบทวน: ใช้ข้อจำกัด คลาส/โครงสร้าง/ตัวสร้างแบบไม่มีพารามิเตอร์ ใน C# 6 จำลองข้อกำหนด ไม่เป็นค่าว่าง ด้วยการตรวจสอบค่าว่าง และจำลองเจตนาของชนิด ไม่มีการจัดการหน่วยความจำ ด้วยขอบเขตของโครงสร้างและอินเทอร์เฟซ

เริ่มต้นได้ฟรี

เรียนรู้ C# ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
93
บทเรียน
346

คำถามที่พบบ่อย

บทเรียน “unmanaged, notnull, new() (จำลองใน C# 6)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “unmanaged, notnull, new() (จำลองใน C# 6)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “unmanaged, notnull, new() (จำลองใน C# 6)”

C# 6 รองรับข้อจำกัดของ class/struct/new() จำลอง notnull/unmanaged รุ่นใหม่ด้วยการตรวจสอบ รูปแบบ API และแนวปฏิบัติร่วมกัน คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน

บทเรียน “unmanaged, notnull, new() (จำลองใน C# 6)” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. unmanaged, notnull, new() (จำลองใน C# 6)
  2. คณิตศาสตร์แบบเจเนอริก (ภาพรวม) และแอตทริบิวต์แบบเจเนอริก (เมื่อเหมาะสม)
  3. เครื่องมือเจเนอริกที่นำกลับมาใช้ซ้ำได้
← กลับไปที่ C# Academy