Tôi đang cố gắng đăng bài này, nhưng tôi nghĩ rằng câu trả lời là:
Từ 550 đến 575
với cài đặt mặc định trong Visual Studio 2015
Tôi đã tạo một chương trình nhỏ tạo các for
vòng lặp lồng nhau ...
for (int i0=0; i0<10; i0++)
{
for (int i1=0; i1<10; i1++)
{
...
...
for (int i573=0; i573<10; i573++)
{
for (int i574=0; i574<10; i574++)
{
Console.WriteLine(i574);
}
}
...
...
}
}
Đối với 500 vòng lặp lồng nhau, chương trình vẫn có thể được biên dịch. Với 575 vòng lặp, trình biên dịch giải quyết được:
Cảnh báo AD0001 Analyzer 'Microsoft.CodeAnalysis.CSharp.Diagnostics.SimplifyTypeNames.CSharpSimplifyTypeNamesDiagnosticAnalyzer' đã đưa ra một ngoại lệ loại 'System.InsuffnoughExecutionStackException' với thông báo 'Không đủ ngăn xếp để tiếp tục thực thi chương trình một cách an toàn. Điều này có thể xảy ra do có quá nhiều hàm trên ngăn xếp lệnh gọi hoặc hàm trên ngăn xếp sử dụng quá nhiều không gian ngăn xếp. '.
với thông báo trình biên dịch bên dưới
lỗi CS8078: Một biểu thức quá dài hoặc phức tạp để biên dịch
Tất nhiên, đây là một kết quả hoàn toàn mang tính giả thuyết . Nếu vòng lặp trong cùng nhiều hơn a Console.WriteLine
thì có thể có ít vòng lặp lồng nhau hơn trước khi kích thước ngăn xếp bị vượt quá. Ngoài ra, đây có thể không phải là một giới hạn kỹ thuật nghiêm ngặt, theo nghĩa là có thể có các cài đặt ẩn để tăng kích thước ngăn xếp tối đa cho "Trình phân tích" được đề cập trong thông báo lỗi hoặc (nếu cần) cho tệp thực thi kết quả. Tuy nhiên, phần câu trả lời này được dành cho những người hiểu biết sâu về C #.
Cập nhật
Để trả lời câu hỏi trong phần bình luận :
Tôi sẽ quan tâm để xem câu trả lời này mở rộng để "chứng minh" thực nghiệm cho dù bạn có thể đặt 575 biến cục bộ trên stack nếu họ không được sử dụng trong cho-vòng, và / hoặc cho dù bạn có thể đặt 575 phi lồng cho-vòng trong một chức năng duy nhất
Đối với cả hai trường hợp, câu trả lời là: Có, có thể. Khi điền phương thức với 575 câu lệnh được tạo tự động
int i0=0;
Console.WriteLine(i0);
int i1=0;
Console.WriteLine(i1);
...
int i574=0;
Console.WriteLine(i574);
nó vẫn có thể được biên dịch. Mọi thứ khác sẽ làm tôi ngạc nhiên. Kích thước ngăn xếp được yêu cầu cho các int
biến chỉ là 2,3 KB. Nhưng tôi tò mò, và để kiểm tra các giới hạn xa hơn, tôi đã tăng con số này lên. Cuối cùng, nó không biên dịch, gây ra lỗi
lỗi CS0204: Chỉ có 65534 địa phương, bao gồm cả những người được tạo bởi trình biên dịch, được phép
đó là một điểm thú vị, nhưng đã được quan sát ở nơi khác: Số lượng biến tối đa trong phương pháp
Tương tự, 575 -loops không lồng nhau for
, như trong
for (int i0=0; i0<10; i0++)
{
Console.WriteLine(i0);
}
for (int i1=0; i1<10; i1++)
{
Console.WriteLine(i1);
}
...
for (int i574=0; i574<10; i574++)
{
Console.WriteLine(i574);
}
cũng có thể được biên dịch. Ở đây, tôi cũng đã cố gắng tìm giới hạn và tạo thêm các vòng lặp này. Đặc biệt, tôi không chắc liệu các biến vòng lặp trong trường hợp này có tính cả "local" hay không, bởi vì chúng nằm trong chính chúng { block }
. Tuy nhiên, hơn 65534 là không thể. Cuối cùng, tôi đã thêm một bài kiểm tra bao gồm 40000 vòng lặp của mẫu
for (int i39999 = 0; i39999 < 10; i39999++)
{
int j = 0;
Console.WriteLine(j + i39999);
}
có chứa một biến bổ sung trong vòng lặp, nhưng những biến này dường như cũng được tính là "địa phương" và không thể biên dịch biến này.
Tóm lại: Giới hạn ~ 550 thực sự là do độ sâu lồng nhau của các vòng lặp. Điều này cũng được chỉ ra bởi thông báo lỗi
lỗi CS8078: Một biểu thức quá dài hoặc phức tạp để biên dịch
Các tài liệu của CS1647 lỗi không may (nhưng dễ hiểu) không xác định "đo" độ phức tạp, nhưng chỉ cung cấp những lời khuyên thực tế
Đã xảy ra lỗi tràn ngăn xếp trong trình biên dịch xử lý mã của bạn. Để giải quyết lỗi này, hãy đơn giản hóa mã của bạn.
Để nhấn mạnh điều này một lần nữa: Đối với trường hợp cụ thể của for
-loops lồng nhau sâu sắc , tất cả điều này là khá hàn lâm và giả thuyết . Nhưng việc tìm kiếm trên web cho thông báo lỗi của CS1647 cho thấy một số trường hợp lỗi này xuất hiện đối với mã rất có thể không cố ý phức tạp, nhưng được tạo ra trong các tình huống thực tế.