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 Classes | Extensible 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 แทน)