【C#】Listのインスタンスを複数のクラスで共有する方法

C#において、あるクラスで作成したリスト(例:List<Status>)を他のクラスでも使用したい場合、複数の方法があります。この技術資料では、以下の3つの一般的なアプローチについて解説します。

  1. シングルトンパターンの使用
  2. 依存性注入 (DI) の使用
  3. 静的メンバーの使用

シングルトンパターンの使用

概要

シングルトンパターンを使うことで、List<Status>はアプリケーション全体で1つのインスタンスとして管理され、どのクラスからも同じリストにアクセスすることが可能です。

実装例

public class Status
{
    public string Name { get; set; }
}

public class StatusManager
{
    private static StatusManager _instance;
    public List<Status> Statuses { get; private set; }

    private StatusManager()
    {
        Statuses = new List<Status>();
    }

    public static StatusManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new StatusManager();
            }
            return _instance;
        }
    }
}

public class SomeClass
{
    public void AddStatus(Status status)
    {
        StatusManager.Instance.Statuses.Add(status);
    }
}

public class AnotherClass
{
    public void PrintStatuses()
    {
        foreach (var status in StatusManager.Instance.Statuses)
        {
            Console.WriteLine(status.Name);
        }
    }
}

使い方

public class Program
{
    public static void Main(string[] args)
    {
        SomeClass someClass = new SomeClass();
        someClass.AddStatus(new Status { Name = "Active" });
        someClass.AddStatus(new Status { Name = "Inactive" });

        AnotherClass anotherClass = new AnotherClass();
        anotherClass.PrintStatuses();
    }
}

実行結果

Active
Inactive


依存性注入 (DI) の使用

概要

依存性注入を使用すると、List<Status>のインスタンスをクラス間で簡単に共有できます。DIは特にASP.NET Coreのようなフレームワークでよく使用されます。

実装例

public class Status
{
    public string Name { get; set; }
}

public class StatusService
{
    public List<Status> Statuses { get; set; } = new List<Status>();
}

public class SomeClass
{
    private readonly StatusService _statusService;

    public SomeClass(StatusService statusService)
    {
        _statusService = statusService;
    }

    public void AddStatus(Status status)
    {
        _statusService.Statuses.Add(status);
    }
}

public class AnotherClass
{
    private readonly StatusService _statusService;

    public AnotherClass(StatusService statusService)
    {
        _statusService = statusService;
    }

    public void PrintStatuses()
    {
        foreach (var status in _statusService.Statuses)
        {
            Console.WriteLine(status.Name);
        }
    }
}

使い方

public class Program
{
    public static void Main(string[] args)
    {
        StatusService statusService = new StatusService();

        SomeClass someClass = new SomeClass(statusService);
        someClass.AddStatus(new Status { Name = "Online" });
        someClass.AddStatus(new Status { Name = "Offline" });

        AnotherClass anotherClass = new AnotherClass(statusService);
        anotherClass.PrintStatuses();
    }
}

実行結果

Online
Offline


静的メンバーの使用

概要

静的メンバーを使用することで、複数のクラスから直接アクセスできるリストを簡単に作成できます。

実装例

public class Status
{
    public string Name { get; set; }
}

public static class StatusRepository
{
    public static List<Status> Statuses { get; set; } = new List<Status>();
}

public class SomeClass
{
    public void AddStatus(Status status)
    {
        StatusRepository.Statuses.Add(status);
    }
}

public class AnotherClass
{
    public void PrintStatuses()
    {
        foreach (var status in StatusRepository.Statuses)
        {
            Console.WriteLine(status.Name);
        }
    }
}

使い方

public class Program
{
    public static void Main(string[] args)
    {
        SomeClass someClass = new SomeClass();
        someClass.AddStatus(new Status { Name = "Enabled" });
        someClass.AddStatus(new Status { Name = "Disabled" });

        AnotherClass anotherClass = new AnotherClass();
        anotherClass.PrintStatuses();
    }
}

実行結果

Enabled
Disabled


まとめ

  • シングルトンパターンは、リストを1つに限定して管理したい場合に最適です。
  • 依存性注入は、フレームワークを使用する際に便利で、拡張性やテストがしやすくなります。
  • 静的メンバーは最もシンプルにリストを共有する方法ですが、規模が大きくなると管理が難しくなる場合があります。

C#

Posted by hidepon