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

คอนสตรักเตอร์แบบสแตติก

กำหนดค่าเริ่มต้นให้สถานะแบบสแตติกเพียงครั้งเดียว

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

คอนสตรักเตอร์สแตติกคืออะไร

คอนสตรักเตอร์สแตติกใช้เริ่มต้นข้อมูลสแตติกของคลาส คอนสตรักเตอร์นี้จะทำงานโดยอัตโนมัติครั้งเดียวก่อนที่คลาสจะถูกใช้งานครั้งแรก และคุณจะไม่เรียกใช้โดยตรง

using System;

class App
{
    public static string Version;

    static App()
    {
        Version = "1.0.0";
        Console.WriteLine("Static constructor ran");
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(App.Version);
    }
}

กฎไวยากรณ์

คอนสตรักเตอร์สแตติกใช้คีย์เวิร์ด static ใช้ชื่อเดียวกับคลาส รับไม่มีพารามิเตอร์ และไม่มีตัวระบุการเข้าถึง

using System;

class Config
{
    public static int MaxUsers;

    static Config()
    {
        MaxUsers = 100;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Max: " + Config.MaxUsers);
    }
}

ทำงานเพียงครั้งเดียวอย่างแน่นอน

ไม่ว่าคุณจะใช้คลาสกี่ครั้ง คอนสตรักเตอร์สแตติกจะทำงานเพียงครั้งเดียว คือครั้งแรกที่จำเป็นต้องใช้

using System;

class Counter
{
    public static int Instances;

    static Counter()
    {
        Console.WriteLine("Initializing static state");
        Instances = 0;
    }

    public Counter() { Instances++; }
}

class Program
{
    static void Main()
    {
        new Counter();
        new Counter();
        Console.WriteLine("Instances: " + Counter.Instances);
    }
}

คอนสตรักเตอร์นี้เริ่มทำงานเมื่อใด

สภาพแวดล้อมขณะทำงานจะเรียกใช้คอนสตรักเตอร์นี้ก่อนการเข้าถึงสมาชิกสแตติกใด ๆ ครั้งแรก OR ก่อนการสร้างอินสแตนซ์ครั้งแรก แล้วแต่ว่าเหตุการณ์ใดเกิดขึ้นก่อน

using System;

class Lazy
{
    public static string Data;

    static Lazy()
    {
        Console.WriteLine("Triggered now");
        Data = "ready";
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Before access");
        Console.WriteLine(Lazy.Data);
    }
}

การเริ่มต้นข้อมูลสแตติกที่ซับซ้อน

ใช้คอนสตรักเตอร์สแตติกเมื่อฟิลด์สแตติกต้องใช้ตรรกะจริงในการตั้งค่า ไม่ใช่เพียงค่าตามตัวอักษรอย่างง่าย

using System;
using System.Collections.Generic;

class Lookup
{
    public static Dictionary<int, string> Table;

    static Lookup()
    {
        Table = new Dictionary<int, string>();
        for (int i = 1; i <= 3; i++)
            Table[i] = "Item" + i;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Lookup.Table[2]);
    }
}

คอนสตรักเตอร์สแตติกเทียบกับตัวเริ่มต้นฟิลด์

ค่าที่ไม่ซับซ้อนสามารถใช้ตัวเริ่มต้นแบบเขียนในบรรทัดเดียวได้ ส่วนคอนสตรักเตอร์สแตติกเหมาะกับการตั้งค่าที่ต้องใช้คำสั่ง วนรอบ หรือการจัดการข้อผิดพลาด

using System;

class Settings
{
    public static int Simple = 10;        // inline initializer
    public static int Computed;            // needs logic

    static Settings()
    {
        Computed = Simple * Simple;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Settings.Simple + ", " + Settings.Computed);
    }
}

ไม่อนุญาตให้มีพารามิเตอร์

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

using System;

class Clock
{
    public static int StartHour;

    static Clock()
    {
        StartHour = 9;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Start: " + Clock.StartHour);
    }
}

การใช้คอนสตรักเตอร์สแตติกและอินสแตนซ์ร่วมกัน

คลาสหนึ่งสามารถมีคอนสตรักเตอร์ทั้งสองแบบได้ คอนสตรักเตอร์สแตติกจะทำงานครั้งเดียวสำหรับชนิดข้อมูลนั้น ส่วนคอนสตรักเตอร์อินสแตนซ์จะทำงานสำหรับออบเจ็กต์ทุกตัว

using System;

class Game
{
    public static string Title;
    public int Score;

    static Game()
    {
        Title = "Coddy Quest";
    }

    public Game(int score)
    {
        Score = score;
    }
}

class Program
{
    static void Main()
    {
        var g = new Game(50);
        Console.WriteLine(Game.Title + " score " + g.Score);
    }
}

การรับรองลำดับการทำงาน

คอนสตรักเตอร์สแตติกจะทำงานเสร็จก่อนบล็อกคำสั่งของคอนสตรักเตอร์อินสแตนซ์ใด ๆ ที่เป็นตัวกระตุ้นให้คอนสตรักเตอร์สแตติกทำงานเสมอ ดังนั้น state สแตติกจึงพร้อมใช้งานอยู่เสมอ

using System;

class Service
{
    public static string Endpoint;

    static Service()
    {
        Endpoint = "https://api.example.com";
    }

    public Service()
    {
        Console.WriteLine("Using " + Endpoint);
    }
}

class Program
{
    static void Main()
    {
        new Service();
    }
}

ใช้เท่าที่จำเป็น

คอนสตรักเตอร์สแตติกจะเพิ่มการตรวจสอบหนึ่งครั้งก่อนใช้คลาส และอาจทำให้ประสิทธิภาพลดลงหากใช้มากเกินไปหรือหากเกิดข้อผิดพลาด ควรทำให้คอนสตรักเตอร์เหล่านี้สั้นและเชื่อถือได้

using System;

class Cache
{
    public static int[] Data;

    static Cache()
    {
        Data = new int[] { 2, 4, 6, 8 };
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Cache.Data[3]);
    }
}

นำทุกอย่างมารวมกัน

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

using System;
using System.Collections.Generic;

class Currency
{
    public static Dictionary<string, string> Symbols;

    static Currency()
    {
        Symbols = new Dictionary<string, string>
        {
            ["USD"] = "$",
            ["EUR"] = "E",
            ["JPY"] = "Y"
        };
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("USD symbol: " + Currency.Symbols["USD"]);
    }
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับคอนสตรักเตอร์สแตติก

ทบทวน

คอนสตรักเตอร์สแตติกใช้ static ClassName() โดยไม่มีพารามิเตอร์และไม่มีตัวระบุการเข้าถึง คอนสตรักเตอร์นี้ทำงานครั้งเดียวโดยอัตโนมัติก่อนที่คลาสจะถูกใช้งานครั้งแรก เพื่อเริ่มต้น state สแตติกที่ต้องใช้ตรรกะจริง ควรใช้เท่าที่จำเป็นสำหรับการตั้งค่าข้อมูลที่ใช้ร่วมกันเพียงครั้งเดียว

using System;

class Demo
{
    public static int Value;
    static Demo() { Value = 42; }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Demo.Value);
    }
}

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

บทเรียน “คอนสตรักเตอร์แบบสแตติก” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “คอนสตรักเตอร์แบบสแตติก”

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

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

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

บทเรียน “คอนสตรักเตอร์แบบสแตติก” ใช้เวลานานแค่ไหน

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

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

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

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

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