ความยาวสูงสุดของสตริงในเครื่องของฉันคือ1073741791
คุณเห็นไหมว่าสตริงไม่ได้ถูก จำกัด ด้วยจำนวนเต็มตามที่เชื่อกันโดยทั่วไป
ข้อ จำกัด ของหน่วยความจำนอกเหนือ Strings ต้องมีอักขระไม่เกิน 2 30 ( 1,073,741,824 ) ตัวเนื่องจากมีการกำหนดขีด จำกัด 2GB โดย Microsoft CLR (Common Language Runtime) มากกว่า 33 คอมพิวเตอร์ของฉันอนุญาต
ตอนนี้คุณสามารถลองด้วยตัวเองได้ที่นี่
สร้างแอปคอนโซล C # ใหม่ใน Visual Studio จากนั้นคัดลอก / วางวิธีหลักที่นี่:
static void Main(string[] args)
{
Console.WriteLine("String test, by Nicholas John Joseph Taylor");
Console.WriteLine("\nTheoretically, C# should support a string of int.MaxValue, but we run out of memory before then.");
Console.WriteLine("\nThis is a quickish test to narrow down results to find the max supported length of a string.");
Console.WriteLine("\nThe test starts ...now:\n");
int Length = 0;
string s = "";
int Increment = 1000000000; // We know that s string with the length of 1000000000 causes an out of memory exception.
LoopPoint:
// Make a string appendage the length of the value of Increment
StringBuilder StringAppendage = new StringBuilder();
for (int CharacterPosition = 0; CharacterPosition < Increment; CharacterPosition++)
{
StringAppendage.Append("0");
}
// Repeatedly append string appendage until an out of memory exception is thrown.
try
{
if (Increment > 0)
while (Length < int.MaxValue)
{
Length += Increment;
s += StringAppendage.ToString(); // Append string appendage the length of the value of Increment
Console.WriteLine("s.Length = " + s.Length + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm"));
}
}
catch (OutOfMemoryException ex) // Note: Any other exception will crash the program.
{
Console.WriteLine("\n" + ex.Message + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm") + ".");
Length -= Increment;
Increment /= 10;
Console.WriteLine("After decimation, the value of Increment is " + Increment + ".");
}
catch (Exception ex2)
{
Console.WriteLine("\n" + ex2.Message + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm") + ".");
Console.WriteLine("Press a key to continue...");
Console.ReadKey();
}
if (Increment > 0)
{
goto LoopPoint;
}
Console.WriteLine("Test complete.");
Console.WriteLine("\nThe max length of a string is " + s.Length + ".");
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
ผลลัพธ์ของฉันมีดังนี้:
การทดสอบสตริงโดยนิโคลัสจอห์นโจเซฟเทย์เลอร์
ในทางทฤษฎี C # ควรสนับสนุนสตริงของ int.MaxValue แต่เรามีหน่วยความจำไม่เพียงพอก่อนหน้านั้น
นี่คือการทดสอบแบบด่วนเพื่อ จำกัด ผลลัพธ์ให้แคบลงเพื่อค้นหาความยาวสูงสุดที่สนับสนุนของสตริง
การทดสอบเริ่มแล้ว ... ตอนนี้:
s.Length = 1000000000 เวลา 08/05/2019 12:06
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:06 หลังจากการทำลายล้างค่าของการเพิ่มคือ 100000000
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:06 หลังจากการทำลายล้างค่าของการเพิ่มขึ้นคือ 10,000,000 s.Length = 1010000000 ที่ 08/05/2019 12:06 s.Length = 1020000000 ที่ 08/05/2019 12:06 s.Length = 1030000000 เวลา 08/05/2019 12 : 06 s.Length = 1040000000 เวลา 08/05/2019 12:06 s.Length = 1050000000 เวลา 08/05/2019 12:06 s.Length = 1060000000 เวลา 08/05/2019 12:06 s.Length = 1070000000 เวลา 08/05/2019 12:06
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:06 หลังจากการทำลายล้างค่าของการเพิ่มขึ้นคือ 1000000 s.Length = 1071000000 ที่ 08/05/2019 12:06 s.Length = 1072000000 ที่ 08/05/2019 12:06 s.Length = 1073000000 ที่ 08/05/2019 12 : 06
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:06 หลังจากการทำลายล้างค่าของการเพิ่มขึ้นคือ 100000 s.Length = 1073100000 ที่ 08/05/2019 12:06 s.Length = 1073200000 ที่ 08/05/2019 12:06 s.Length = 1073300000 เวลา 08/05/2019 12 : 06 s.Length = 1073400000 เวลา 08/05/2019 12:06 s.Length = 1073500000 เวลา 08/05/2019 12:06 s.Length = 1073600000 เวลา 08/05/2019 12:06 s.Length = 1073700000 เวลา 08/05/2019 12:06
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:06 หลังจากการทำลายล้างค่าของการเพิ่มคือ 10,000 s.Length = 1073710000 ที่ 08/05/2019 12:06 s.Length = 1073720000 ที่ 08/05/2019 12:06 s.Length = 1073730000 ที่ 08/05/2019 12 : 06 s.Length = 1073740000 เวลา 08/05/2019 12:06
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:06 หลังจากการทำลายล้างค่าของการเพิ่มคือ 1,000 s.Length = 1073741000 ที่ 08/05/2019 12:06
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:06 หลังจากการทำลายล้างค่าของการเพิ่มขึ้นคือ 100 s.Length = 1073741100 ที่ 08/05/2019 12:06 s.Length = 1073741200 ที่ 08/05/2019 12:06 s.Length = 1073741300 เวลา 08/05/2019 12 : 07 s.Length = 1073741400 เวลา 08/05/2019 12:07 s.Length = 1073741500 เวลา 08/05/2019 12:07 s.Length = 1073741600 เวลา 08/05/2019 12:07 s.Length = 1073741700 เวลา 08/05/2019 12:07 น
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:07 น. หลังจากการทำลายล้างค่าของการเพิ่มขึ้นคือ 10 s.Length = 1073741710 ที่ 08/05/2019 12:07 s.Length = 1073741720 ที่ 08/05/2019 12:07 s.Length = 1073741730 เวลา 08/05/2019 12 : 07 s.Length = 1073741740 at 08/05/2019 12:07 s.Length = 1073741750 ที่ 08/05/2019 12:07 s.Length = 1073741760 ที่ 08/05/2019 12:07 s.Length = 1073741770 ที่ 08/05/2019 12:07 s.Length = 1073741780 at 08/05/2019 12:07 s.Length = 1073741790 เวลา 08/05/2019 12:07
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:07 น. หลังจากการทำลายล้างค่าของการเพิ่มคือ 1 s.Length = 1073741791 ที่ 08/05/2019 12:07
ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกส่งออกไป เมื่อ 08/05/2019 12:07 น. หลังจากการทำลายล้างค่าของการเพิ่มคือ 0 การทดสอบเสร็จสมบูรณ์
ความยาวสูงสุดของสตริงคือ 1073741791
กดปุ่มใดก็ได้เพื่อดำเนินการต่อ
ความยาวสูงสุดของสตริงบนเครื่องของฉันคือ 1073741791
ฉันขอบคุณมากหากผู้คนสามารถโพสต์ผลลัพธ์ของพวกเขาเป็นความคิดเห็นด้านล่าง
มันจะน่าสนใจที่จะเรียนรู้ว่าผู้คนได้รับผลลัพธ์ที่เหมือนหรือต่างกัน