C#引用循环变量
是否有可能在C#中出现类似以下内容
foreach (ref string var in arr) { var = "new value"; }
以便将var变量视为参考并分配给var将改变数组元素?
没有这样的构造来更新循环; 迭代器是只读的。 例如,以下提供了一个完全有效的迭代器:
public IEnumerable Get1Thru5() { yield return 1; yield return 2; yield return 3; yield return 4; yield return 5; }
它会如何更新? 它会更新什么?
如果数据是数组/列表/等,那么类似于:
for(int i = 0 ; i < arr.Length ; i++) { arr[i] = "new value"; }
或其他选项取决于特定容器。
更新; 在推 ,一个扩展方法:
public static void UpdateAll(this IList list, Func operation) { for (int i = 0; i < list.Count; i++) { list[i] = operation(list[i]); } } static void Main() { string[] arr = { "abc", "def", "ghi" }; arr.UpdateAll(s => "new value"); foreach (string s in arr) Console.WriteLine(s); }
不, foreach
语句只是IEnumerable
接口之上的语法糖。 此接口定义了一个获取IEnumerator
的方法, IEnumerator
又具有进行只读枚举的方法:
- 当前:对象
- MoveNext():bool
- 重置():无效
foreach(string s in strings) { Console.WriteLine(s); }
是编译器快捷方式:
IEnumerator e = strings.GetEnumerator(); string s; while(e.MoveNext()) { s = e.Current; Console.WriteLine(s); }
由于IEnumerator.Current是一个只用属性,因此无法设置该值。
// Non-generic IEnumerator shown. interface IEnumerator { bool MoveNext(); object Current { get; } void Reset(); }
如果你想支持一个可更新的枚举器,你需要自己创建它 – 但你将无法使用它“foreach”,并且你必须在所有常见的IEnumerable类周围实现包装器。
您必须分析当前的情况并找出如何更新。 如果您使用的是IList接口,则可以执行以下操作:
for(int i = 0; i < strings.Count; ++i) { string s = strings[i]; //do work s = s.ToUpperInvariant(); strings[i] = s; }
在字符串的情况下,没有; C#字符串是不可变的(不能更改)。 如果要枚举不同的可变类型的对象,则可以更改这些对象的属性。
只是为了说明雅各正在谈论的内容。 请考虑以下代码段:
class MyInt { public int Val { get; set; } public MyInt(int val) { this.Val = val; } } class Program { static void Main(string[] args) { MyInt[] array = new MyInt[] { new MyInt(1), new MyInt(2) }; foreach (var obj in array) Console.Write("{0}\t", obj.Val); foreach (var obj in array) { obj = new MyInt(100); // This doesn't compile! the reference is read only obj.Val *= 10; // This works just fine! } foreach (var obj in array) Console.Write("{0}\t", obj.Val); } }
实际上,如果您尝试分配给上面的“obj”,您将收到编译时错误。 但没有什么能阻止你通过“obj”引用来修改MyInt的属性
在字符串的情况下,没有; C#字符串是不可变的(不能更改)。 如果要枚举不同的可变类型的对象,则可以更改这些对象的属性。