C#でプロパティやスコープについて学んでいました。
そこでふと思ったのですが、多くのプログラミング言語に存在するfor文の、カッコ内で宣言した変数を、中カッコの中で絶対に更新しないことがわかっている場合があると思います。
例
cs
1for(int i = 0; i < 10; i++) 2{ 3 Console.Write(i); 4 // i = 0; ここでiを変更してはならないが、可能 5}
この場合、中括弧の中で誤って i を変更してしまうと意図しない挙動になるため、i を変更しようとするとエラーとなるようにしたいです。より具体的に言うと、中括弧の中では i を get only にしたいです。
こうした機能を持っている言語、あるいは方法があれば教えていただきたいです。
本質的な解決にはなっていませんが、C#にて以下のような変則的な方法を考えました。
cs
1static void Main() 2{ 3 for(intfor i = new intfor(); i < 10; i.Plus()) 4 { 5 Console.Write(i); 6 // i = 0; エラー。intfor型に暗黙的に変換できない 7 } 8} 9 10struct intfor 11{ 12 private int i; 13 public intfor(int _int = 0) => this.i = _int; 14 public void Plus(int _int = 1) => this.i += _int; 15 public static implicit operator int(intfor _intfor) => _intfor.i; 16}
もう1つ
cs
1static void Main() 2{ 3 For(10, (int i) => 4 { 5 Console.Write(i); 6 // i = 0; iは引数なので変更しても影響がない 7 }); 8} 9 10static void For(int executeTimes, Action<int> method) 11{ 12 for(int i = 0; i < executeTimes; i++) method(i); 13}
追記:2番目の解法はこの方がシンプルかもしれません。普通は書かないと思いますが...
cs
1for (int i = 0; i< 10; i++) 2{ 3 new Action<int>((int i) => 4 { 5 Console.Write(i); 6 i = 0; 7 })(i); 8}
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/11 08:46