- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读 Jon Skeet 的 C# in Depth .
在第 156 页,他有一个示例, list 5.13“使用多个委托(delegate)捕获多个变量实例化”。
List list = new List();
for(int index=0; index < 5; index++;)
{
int counter = index*10;
list.Add(delegate
{
Console.WriteLine(counter);
phản++;
}
);
}
foreach(ThreadStart t in list)
{
t();
}
list[0]();
list[0]();
list[0]();
list[1]();
在此列表后的解释中,他说“在这种情况下,每个委托(delegate)实例都捕获了不同的变量。”
我对此非常了解,因为我知道每次关闭变量时,编译器都会生成 IL,将其封装在一个新类中,该类专门用于捕获该变量(本质上是使其成为引用类型,以便值它指的是不会被当前正在执行的范围的堆栈帧破坏。
但随后他谈到如果我们直接捕获 chỉ số
而不是创建 counter
变量会发生什么——“所有的代表都会共享同一个变量”。
这个我不明白。 chỉ số
Và counter
不在同一个作用域吗?为什么编译器不为每个委托(delegate)创建一个新的 chỉ số
实例?
Để ý:我想我在输入这个问题时就明白了,但我会把这个问题留在这里留待后代。我认为答案是 chỉ số
实际上与 counter
在不同的范围内。 Index 本质上是在 for 循环的“外部”声明的……它每次都是相同的变量。
查看为 vì
循环生成的 IL,它证明变量是在循环外声明的(chiều dài
Và Tôi
是在 vì
循环声明中声明的变量)。
.locals init (
[0] int32 length,
[1] int32 i,
[2] bool CS$4$0000
)
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: stloc.0
IL_0004: ldc.i4.0
IL_0005: stloc.1
IL_0006: br.s IL_001b
// loop start (head: IL_001b)
IL_0008: nop
IL_0009: ldloca.s i
IL_000b: call instance string [mscorlib]System.Int32::ToString()
IL_0010: call void [mscorlib]System.Console::WriteLine(string)
IL_0015: nop
IL_0016: nop
IL_0017: ldloc.1
IL_0018: ldc.i4.1
IL_0019: add
IL_001a: stloc.1
IL_001b: ldloc.1
IL_001c: ldloc.0
IL_001d: clt
IL_001f: stloc.2
IL_0020: ldloc.2
IL_0021: brtrue.s IL_0008
// end loop
我认为这本书在这个主题上可能做得更好的一件事是真正解释了编译器在做什么,因为如果您了解编译器将封闭变量包装在一个新类中,那么所有这些“魔法”都是有意义的。
请纠正我可能有的任何误解或误会。另外,请随时详细说明和/或添加我的解释。
câu trả lời hay nhất
听起来你已经找到了答案——你不会在每次循环中都得到一个新的 chỉ số
实例。如果您考虑允许在循环内修改 chỉ số
值的方式 - 例如。如果你想跳过项目,你可以增加它,在某些情况下将它设置回零,或者你喜欢的任何其他东西 - 应该清楚你只有一个 chỉ số
实例,而不是一个每次迭代都有一个新的。
另一方面,每次迭代都会创建一个新的 counter
- 如果您在该循环的底部对其进行更改,它不会影响 counter
下一次迭代使用的变量。
foreach
循环用于重用它们的循环变量,与 vì
循环的方式相同,这是人们常见的问题 - 请参阅 Is there a reason for C#'s reuse of the variable in a foreach?
埃里克·利珀特 explains他们已经更改了 C# 5 中的 foreach
以每次都获取一个新变量,而且他们将 vì
保持原样。
关于c# - 最后,是什么触发了捕获变量的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20118625/
Có cách nào để chuyển một thể hiện của lớp do người dùng định nghĩa sang một trong các kiểu này theo cách do người dùng xác định bằng cách sử dụng các hàm tạo kiểu tiêu chuẩn (ví dụ: int, set, dict, list, tuple, v.v.) không? Ví dụ lớp Ví dụ:
Tôi biết câu hỏi này có nhiều câu hỏi trong Stackoverflow, nhưng mặc dù có nhiều câu trả lời nhưng những câu trả lời này không giúp ích gì nhiều cho tôi và tôi không tìm thấy câu trả lời. Trong WebAPP của tôi, nó hoạt động tốt nhưng khi tôi chuyển đổi nó sang API thì không thành công (tiêu đề chủ đề
Câu hỏi này đã có câu trả lời: Tại sao toán tử bậc ba bất ngờ truyền số nguyên? (3 câu trả lời) Đã đóng 9 năm trước. Gần đây đã gặp phải bẫy Java
Tôi cố gắng định cấu hình Firebase bằng FirebaseApp.configure() nhưng tôi gặp sự cố sau: *** Chấm dứt ứng dụng do ngoại lệ chưa được phát hiện 'c
Tôi có một lớp thực thể nhân viên tự tham gia có chứa các cột id, tên và ref liên quan đến chính nó. Tôi muốn tạo một phiên bản mới của nó và lưu nó vào cơ sở dữ liệu. Đầu tiên tôi tạo một thể hiện của lớp Nhân viên và đặt tên là người quản lý. Sau đó
Tôi có một biểu mẫu để thêm một căn hộ mới, trong biểu mẫu đó tôi có một danh sách thả xuống để người dùng có thể chọn người chịu trách nhiệm. Rõ ràng khi bạn chọn từ danh sách thả xuống và cố gắng lưu căn hộ, ứng dụng của tôi cho rằng người đó đã bị sửa đổi. Nó báo lỗi sau, cho biết trước tiên tôi nên lưu
Từ trang Visualforce, tôi cần truy xuất URL của phiên bản lực lượng bán hàng của tổ chức chúng tôi chứ không phải URL Visual Force. Ví dụ: tôi cần https://cs1.saleforce.com
Tôi đã tìm thấy một số câu trả lời có thể có cho câu hỏi này, nhưng đây là về việc nâng cấp từ Hibernate 3.4.0GA lên Hibernate 4.1.8. Vì vậy, tính năng này từng hoạt động trong các phiên bản trước và tôi đã tìm hiểu lý do tại sao nó lại hiển thị trong phiên bản mới này
Có vẻ như câu hỏi này đã được hỏi đi hỏi lại nhiều lần mà tôi vẫn chưa tìm được câu trả lời cho vấn đề của mình. Tôi có một mô hình miền dưới đây. Mỗi "Người dùng bảo mật" mới được tạo hoặc cập nhật đều yêu cầu tôi đảm bảo rằng nó có hồ sơ và nếu không có, hãy tạo một hồ sơ mới và gán nó cho nó. Yêu cầu về tập tin cấu hình
Tôi đang gặp sự cố khi gỡ lỗi tại sao JPA không xếp tầng mối quan hệ @ManyToMany của tôi. Tất cả các câu trả lời tôi tìm thấy đều liên quan đến các câu lệnh xếp tầng bị thiếu. Nhưng tôi có chúng và vẫn nhận được: Nguyên nhân bởi: org.hibernate.Transi
API Dịch vụ Play cho biết có một thứ gọi là ID phiên bản. Tuy nhiên, tôi không thể nhập lớp InstanceID sau khi đưa phần sau vào Android Studio biên dịch "com.goo
Tôi đang sử dụng khung Seam. Tôi có 2 thực thể: Yêu cầu lớp công khai @Entity @Table(name = "SRV_REQUEST") Yêu cầu lớp công khai { riêng tư
Câu hỏi này đề cập đến việc xây dựng một Monad thích hợp từ một thể hiện của một đơn nguyên, nhưng chỉ với một số ràng buộc nhất định - chẳng hạn như Set . Bí quyết là gói nó vào một ContT , để trì hoãn các ràng buộc cho đến khi gói/mở gói giá trị của nó. Bây giờ tôi muốn nói về Ap
Tôi đang cố thực hiện truy vấn này: StringBuffer sb = new StringBuffer() sb.append("select p from PointsEntity p " + "where;
Tôi đang cố gắng tìm hiểu xem liệu có thể thay đổi cấu hình chế độ ngủ đông của mình và sử dụng một phiên bản MySQL duy nhất hay không (thay vì nhiều phiên bản MySQL mà tôi hiện có): Tôi có một ứng dụng Java sử dụng chế độ ngủ đông, với 2 lược đồ
Tôi có bố cục trượt tab bao gồm bốn tab, mỗi tab có bố cục và đoạn riêng và trong bố cục Hoạt động chính của tôi, trình xem tham gia thay đổi các tab. Một Chế độ xem (tab) cụ thể trong ứng dụng
Tôi thấy rất nhiều bài đăng cho biết họ đang chạy phiên bản RDS của MySql nhưng không thể kết nối với phiên bản đó, nhưng tôi không chạy RDS. Tôi sử dụng phiên bản EC2 để lưu trữ blog WordPress của mình, được cài đặt bằng Trình cài đặt nền tảng web.
Vì tôi đang chạy ứng dụng (Airflow) trong môi trường ảo python trên phiên bản ec-2 của mình và tôi muốn chạy các lệnh trong môi trường python mặc định trên cùng phiên bản ec2, nên tôi nghĩ sẽ tốt hơn nếu ssh cho riêng tôi ví dụ
Câu hỏi này đã có câu trả lời: Cách sửa đối tượng Hibernate "tham chiếu một phiên bản tạm thời chưa được lưu - lưu tra
Ví dụ: chạy APP1 .. ... chạy APP1 ... chạy APP2 Làm thế nào để nói với Vue trong APP2 rằng tôi cần gọi APP1?
Tôi là một lập trình viên xuất sắc, rất giỏi!