Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Local Inner Class (Nested Class) ใน C#

Nested Class (Local Inner Class) ใน C# คือ Class ที่ประกาศภายใน Class อีก Class หนึ่ง มีสิทธิ์เข้าถึง Private Members ของ Outer Class

Syntax และ Basic Usage

using System;

public class Outer
{
    private int _outerPrivate = 100;
    public int OuterPublic = 200;

    // Nested Class (Inner Class)
    public class Inner
    {
        public int InnerPublic = 300;

        // เข้าถึง Private ของ Outer ได้!
        public void AccessOuter(Outer outer)
        {
            Console.WriteLine($"Outer Private: {outer._outerPrivate}");
            Console.WriteLine($"Outer Public: {outer.OuterPublic}");
        }
    }

    public void Demo()
    {
        var inner = new Inner();
        inner.AccessOuter(this);
    }
}

public class Program
{
    public static void Main()
    {
        // สร้าง Outer
        var outer = new Outer();
        outer.Demo();

        // สร้าง Inner โดยตรง (Public Nested Class)
        var inner = new Outer.Inner();
        inner.AccessOuter(outer);
    }
}

Nested Class Types

Modifierเข้าถึง Outer Privateเข้าถึงจากภายนอกUse Case
publicได้ได้ (Outer.Inner)Builder, Factory, Iterator, Node
privateได้ไม่ได้ (เฉพาะใน Outer)Helper, Implementation Detail
internalได้ได้ใน Assembly เดียวInternal Factory
protectedได้ได้ใน Derived ClassesExtensible Inner

Static Nested Class (ไม่มี Outer Instance)


public class Outer
{
    public static int StaticField = 10;

    // Static Nested Class - ไม่ต้องการ Outer Instance
    public static class StaticInner
    {
        public void Print()
        {
            Console.WriteLine(Outer.StaticField); // เข้าถึง Static Members ได้
            // Console.WriteLine(_instanceField); // Error: ไม่มี this
        }
    }

    // Instance Nested Class - ต้องการ Outer Instance
    public class InstanceInner
    {
        public void Print()
        {
            Console.WriteLine(StaticField); // OK
        }
    }
}

// ใช้งาน
Outer.StaticInner si = new Outer.StaticInner(); // ไม่ต้อง new Outer()
si.Print();

var outer = new Outer();
var ii = outer.InstanceInner(); // หรือ new Outer.InstanceInner() ผ่าน outer instance
ii.Print();

Generic Nested Class


public class Repository
{
    private List _items = new();

    // Nested Generic Class
    public class Iterator
    {
        private readonly Repository _repo;
        private int _index;

        public Iterator(Repository repo) => _repo = repo;

        public bool MoveNext() => ++_index < _repo._items.Count;
        public T Current => _repo._items[_index];
    }

    public Iterator GetIterator() => new Iterator(this);
}

Local Class (ภายใน Method) - C# ไม่รองรับโดยตรง

C# ไม่มี Local Class (Class ใน Method) แต่ใช้ได้:

  • Anonymous Types: `new { Name = "X", Value = 1 }`
  • Local Functions (C# 7+): Method ใน Method
  • Lambda/Delegate

Pattern ที่นิยม: Builder Pattern


public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }
    public string Email { get; private set; }

    private Person() { }

    // Nested Builder Class
    public class Builder
    {
        private readonly Person _person = new Person();

        public Builder WithName(string name) { _person.Name = name; return this; }
        public Builder WithAge(int age) { _person.Age = age; return this; }
        public Builder WithEmail(string email) { _person.Email = email; return this; }

        public Person Build() => _person;
    }
}

// ใช้งาน
var person = new Person.Builder()
    .WithName("John")
    .WithAge(30)
    .WithEmail("john@example.com")
    .Build();

สรุป

  • Nested Class เข้าถึง Private Members ของ Outer Class ได้
  • ใช้สำหรับ Encapsulation, Builder, Factory, Iterator, Node
  • Static Nested Class ไม่ผูกกับ Outer Instance
  • C# ไม่มี Local Class ใน Method (ใช้ Anonymous Type/Local Function แทน)