次のようなリストを持つクラスがあるとします。
static class Accounts
{
public static List<Account> Items;
...
}
foreach を有効にして、Items リストを参照せずに foreach を実行できるようにする方法があります。
foreach(Accounts の Account account) ?
次のようなリストを持つクラスがあるとします。
static class Accounts
{
public static List<Account> Items;
...
}
foreach を有効にして、Items リストを参照せずに foreach を実行できるようにする方法があります。
foreach(Accounts の Account account) ?
いいえ。C# 5.0 仕様のセクション 10.1.1.3 によると、静的クラスはインターフェイスを実装できません。
静的クラス宣言には、次の制限があります。
...
- 静的クラスには、クラスベースの仕様 (§10.1.4) を含めることはできず、基本クラスまたは実装されたインターフェイスのリストを明示的に指定することはできません。静的クラスは型オブジェクトから暗黙的に継承します。
...
そのため、 を実装する方法はありません。IEnumerable
これがどのように機能するかforeach
です。
foreach
メンバールックアップを実行するGetEnumerator
か、インターフェイスが見つからない場合に見えるという事実を利用してオプションを調査しましたが、残念ながら期待しexpr
ている引数がforeach
型名をサポートしていないため、それも機能しません。
最良の代替手段は、静的ではなく、代わりにシングルトン パターンに従うことです。つまり、クラスの唯一の許容インスタンスである静的プロパティを持っています。しかし、それでプロパティを読み取る必要がなくなるわけではないので、実際には何も得られません。
実装を不明瞭にするだけの場合 (適切な呼び出し)、 type のプロパティを作成しIEnumerable<Account>
、それを (どこで行っても) new に等しく設定できますList<Account>
。次に、契約により、他のクラスがリストを変更することを許可しておらず、それらを実装に結合していません。IEnumerable
とにかく、これらがこのようなものを実装する主な利点です。それで十分なはずです。
リストを使用しないのはなぜですか?
foreach (Account account in Accounts.Items)
これを実装する場合は、 IEnumerableインターフェイスを継承し、その動作を実装する必要があります。
私の意見では、そうすると、リストを直接使用するよりも混乱するでしょう。