非常に初歩的な質問で恐縮なのですが、例えば生成されたインスタンスの数などの、Count的なstaticクラス変数をもたせたい場合、
その値はどのようにして更新すればいいのでしょうか?
例えば、C#において、あるint型のインスタンス変数の値を、生成されたインスタンス分合計した値を持つstaticなクラス変数を持ちたい場合、どのような記述をすればいいのでしょうか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
単純に生成されたインスタンスの数を把握したいだけならCountで問題ないのですが、各インスタンスごとのある変数の値をすべて合計した数を持つクラス変数を持ちたいのです。さらにそのインスタンス変数は生成以降も変更される可能性がある、といった感じです。
そのクラスのコンストラクタでthisをstatic List<T>辺りに代入して、
staticなプロパティやメソッドでCountを計算して返してやればいいと思います
csharp
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.WriteLine(Test.AllNumCount); // 0 6 new Test(10); 7 Console.WriteLine(Test.AllNumCount); // 10 8 new Test(50); 9 Console.WriteLine(Test.AllNumCount); // 50 10 Console.ReadKey(); 11 } 12 } 13 14 class Test 15 { 16 static List<Test> sharedTests = new List<Test>(); 17 18 /// <summary> 19 /// 生成したすべてのインスタンスのNumの合計を返す 20 /// </summary> 21 static public int AllNumCount => sharedTests.Select(x => x.Num).Sum(); 22 23 public int Num = 0; 24 25 public Test(int x) 26 { 27 Num = x; 28 sharedTests.Add(this); 29 } 30 }
投稿2018/04/22 06:37
編集2018/04/22 06:58総合スコア2378
0
複数のスレッドから値を更新されるかどうかが一つのポイントです。
→更新されない
static 変数をインクリメントしてください。
→更新される
Interlocked.Increment を使ってください。
あとは単純に生成されたものも管理する必要があるなら、
List<int>.Count()プロパティを使えばいい気もしますが。。
投稿2018/04/22 05:56
総合スコア5846
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
普通にメンバ変数のように更新できますよ。
インスタンス間で同じ変数が共有されるだけです。
C#
1public class MyClass : IDisposable 2{ 3 private static int _count = 0; 4 5 public static int GetInstanceCount() => _count; 6 7 public MyClass() 8 { 9 _count++; 10 } 11 12 public void Dispose() 13 { 14 _count--; 15 } 16} 17
マルチスレッドに対応する場合は_countを更新する間ロックする必要があります。
投稿2018/04/22 05:52
編集2018/04/22 05:54総合スコア2850
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/22 06:44
2018/04/22 06:48
2018/04/22 06:48
2018/04/22 06:51
2018/04/22 06:54 編集
2018/04/22 06:56