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

ข้อมูลระดับซอร์ส (แอตทริบิวต์ Caller)

ใช้ CallerMemberName, CallerFilePath และ CallerLineNumber เพื่อบันทึกข้อมูลจุดเรียกใช้สำหรับบันทึกเหตุการณ์ การตรวจสอบ และการแจ้งเตือนคุณสมบัติ

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

เหตุผลที่ต้องใช้ข้อมูลผู้เรียก

เป้าหมาย: เก็บข้อมูลจุดเรียกโดยอัตโนมัติ

  • CallerMemberName — ใครเป็นผู้เรียก
  • CallerFilePath — ไฟล์ใด
  • CallerLineNumber — บรรทัดใด
  • เหมาะอย่างยิ่งสำหรับบันทึกเหตุการณ์ การตรวจสอบเงื่อนไข และการแจ้งเตือน

ชื่อสมาชิกสำหรับบันทึกเหตุการณ์

CallerMemberName จะเติมชื่อเมธอดหรือคุณสมบัติของผู้เรียกโดยอัตโนมัติเมื่อไม่ระบุอาร์กิวเมนต์

using System;
using System.Runtime.CompilerServices;

public static class Log
{
  // Caller fills "member" automatically if not provided
  public static void Info(string msg, [CallerMemberName] string member = null)
  {
    Console.WriteLine("[" + (member ?? "?") + "] " + msg);
  }
}

public class Program
{
  static void DoWork() { Log.Info("started"); }

  public static void Main(string[] args)
  {
    Log.Info("app boot");
    DoWork(); // prints caller method name
  }
}

ข้อมูลไฟล์และบรรทัด

เพิ่ม CallerFilePath และ CallerLineNumber เพื่อวินิจฉัยปัญหาได้อย่างแม่นยำ

using System;
using System.Runtime.CompilerServices;

public static class Diag
{
  public static void Trace(string msg,
    [CallerFilePath] string file = null,
    [CallerLineNumber] int line = 0,
    [CallerMemberName] string member = null)
  {
    Console.WriteLine(file + ":" + line + " in " + member + " -> " + msg);
  }
}

public class Program
{
  static void Step() { Diag.Trace("stepping"); }

  public static void Main(string[] args)
  {
    Diag.Trace("start");
    Step();
  }
}

การแจ้งเตือนคุณสมบัติ

ใช้ CallerMemberName ในตัวกำหนดค่า หรือเมธอดช่วยจัดการเหตุการณ์ เพื่อหลีกเลี่ยงสตริงที่เขียนตายตัว

using System;
using System.Runtime.CompilerServices;

public class Person
{
  private string _name;

  // Notify helper uses CallerMemberName so callers need not pass the property name
  void Notify([CallerMemberName] string property = null)
  {
    Console.WriteLine("Changed: " + property);
  }

  public string Name
  {
    get { return _name; }
    set { _name = value; Notify(); } // property name auto-filled
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Person p = new Person();
    p.Name = "Ada"; // prints "Changed: Name"
  }
}

การตรวจสอบด้วยชื่อผู้เรียก

ข้อมูลผู้เรียกช่วยให้ข้อความตรวจสอบเงื่อนไขชัดเจนขึ้นโดยไม่ต้องเขียนสตริงด้วยตนเอง

using System;
using System.Runtime.CompilerServices;

public static class Guard
{
  public static void NotNull(object x, [CallerMemberName] string caller = null)
  {
    if (x == null) throw new ArgumentNullException("value", "Null passed by " + (caller ?? "?"));
  }
}

public class Program
{
  static void Save(string path)
  {
    Guard.NotNull(path); // if null, message includes "Save"
    Console.WriteLine("Saving to " + path);
  }

  public static void Main(string[] args)
  {
    try
    {
      Save(null);
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

เคล็ดลับและข้อสังเกต

ข้อสังเกต:

  • แอตทริบิวต์ผู้เรียกทำงานกับพารามิเตอร์เสริมที่มีค่าเริ่มต้นได้
  • อย่าพึ่งพาเส้นทางไฟล์ที่แน่นอนสำหรับข้อมูลลับ เพราะเส้นทางอาจเปิดเผยโฟลเดอร์ได้
  • เหมาะอย่างยิ่งสำหรับการบันทึกเหตุการณ์ การวินิจฉัย และเหตุการณ์การเปลี่ยนแปลงคุณสมบัติ

แอตทริบิวต์ชื่อผู้เรียก

ตรวจสอบอย่างรวดเร็ว: แอตทริบิวต์ใดทำให้เมธอดรับชื่อของผู้เรียกเป็นค่าพารามิเตอร์เริ่มต้นได้

สรุป

สรุป: เพิ่ม CallerMemberName CallerFilePath และ CallerLineNumber ให้กับพารามิเตอร์เสริม เพื่อเก็บบริบทของผู้เรียกได้โดยไม่ต้องเขียนโค้ดเพิ่มเติม

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

บทเรียน “ข้อมูลระดับซอร์ส (แอตทริบิวต์ Caller)” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ข้อมูลระดับซอร์ส (แอตทริบิวต์ Caller)”

ใช้ CallerMemberName, CallerFilePath และ CallerLineNumber เพื่อบันทึกข้อมูลจุดเรียกใช้สำหรับบันทึกเหตุการณ์ การตรวจสอบ และการแจ้งเตือนคุณสมบัติ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ข้อมูลระดับซอร์ส (แอตทริบิวต์ Caller)” ใช้เวลานานแค่ไหน

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

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

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

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

  1. Type, MethodInfo, การสร้างอินสแตนซ์ และแอตทริบิวต์แบบกำหนดเอง
  2. ข้อมูลระดับซอร์ส (แอตทริบิวต์ Caller)
  3. สถานการณ์เมตาโปรแกรมมิงแบบเบื้องต้น
← กลับไปที่ C# Academy