C# 当文档建议我不应该';你不能吗?

C# 当文档建议我不应该';你不能吗?,c#,.net,.net-core,console,console.readline,C#,.net,.net Core,Console,Console.readline,控制台的读取线说: 默认情况下,该方法从256个字符的输入缓冲区读取输入。因为这包括Environment.NewLine字符,所以该方法可以读取最多包含254个字符的行。要读取较长的行,请调用OpenStandardInput(Int32)方法 然而,我能读的不仅仅是那么多的字,我看得很好。运行一个简单的程序,如: string s = Console.ReadLine(); Console.WriteLine(s); Console.WriteLine(s.Length); Console

控制台的读取线说:

默认情况下,该方法从256个字符的输入缓冲区读取输入。因为这包括Environment.NewLine字符,所以该方法可以读取最多包含254个字符的行。要读取较长的行,请调用OpenStandardInput(Int32)方法

然而,我能读的不仅仅是那么多的字,我看得很好。运行一个简单的程序,如:

string s = Console.ReadLine();
Console.WriteLine(s);
Console.WriteLine(s.Length);

Console.ReadKey();
输入如下:

aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjj
返回长度为500的相同输入

可运行的示例

那么这些文档是否过时了,或者这里是否有“默认”键


更新: Jeremy发现了一个定义为4096的限制

我已经验证了一个.NET核心应用程序将只读取stdin中的前4094个字符(不包括换行符)

在我的例子中,我实际上有一个.NET Core 3.1进程,它启动一个.NET Framework 4.6进程,重定向其StandardOut和StandardIn。我已经验证了.NET Framework进程可以通过
Console.ReadLine()
成功读取10亿个字符,其中.NET Core 3.1进程通过
fwProcess.StandardInput.WriteLine(Serialize())发送框架进程内容

当.NET框架进程替换为.NET核心进程时,这种方法也有效

因此,在重定向stdout/stdin时,256个字符的限制似乎不适用,但如果有人能找到解释这一点的最终证据/文档,我将不胜感激。如果仍然有一个限制(不包括OutOfMemory的情况),但它是11亿个字符,我想知道。我还想知道这是否取决于平台(我使用的是Windows 10)

如果有帮助,这就是我正在运行的代码

控制台AP1:

ProcessStartInfo processInfo = new ProcessStartInfo {
    CreateNoWindow = true,
    FileName = "ConsoleApp2.exe",
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardInput = true
};

StringBuilder s = new StringBuilder();
var proc = Process.Start(processInfo);

int n = 1_000_000_000;
for (int i = 0; i < n; i++)
    s.Append("a");

proc.StandardInput.WriteLine(s.ToString());
string s = proc.StandardOutput.ReadLine();
Console.WriteLine(s.Length == n); // logs True

Console.ReadKey();
转述自:

默认的cmd控制台模式是“ENABLE_LINE_INPUT”,这意味着 当代码对stdin发出::ReadFile调用时,::ReadFile不会 返回调用方,直到遇到回车符。但是 对ReadFile的调用只传递了一个有限大小的缓冲区。 这意味着cmd会查看提供给它的缓冲区大小 根据行的长度来确定。。。 如果行较长,它将无法存储所有数据 进入缓冲区

中打开控制台时使用的默认缓冲区大小现在是4096()

该文档是开源的,如果您希望提交问题或请求,请参阅

重定向StandardOut/StandardIn时,此限制不适用。发件人:

限制是您传入的内存量


具体来说,我使用的是运行.NETCore3.1的win10。在控制台中,有一个私有属性_maxCharsPerBuffer=16384。不确定这是否因平台而异,Microsoft可能会在文档中声明“最小”大小?@T.S.嗯,我的问题与那个不同。我不是问是否有一个最大长度。我在问为什么我没有这个极限documented@T.S.嗯,我想问题的主体与标题有点不同。我想这和我的关系比我想象的要大很多关于github的问题?谢谢,这很有帮助。我更新了我的问题,注意到在两个网络进程之间发送数据似乎没有这个限制。我可以从.NET FW进程中成功读取数万个字符。如果FW中有不同的限制,我会搜索。(重定向stdin/stdout)正如我在回答中所引用的,这种行为取决于从交互式控制台读取。这就是行为的起源。我认为应该更改.net的
控制台.ReadLine
,以隐藏此操作系统实现细节,并继续阅读,直到找到实际的新行。
string s = Console.ReadLine();
Console.WriteLine(s);