【发布时间】:2018-07-16 17:58:43
【问题描述】:
我正在分析此stackoverflow question 的已接受答案中的代码示例,其中包含以下代码块:
public static void SplitFile(string inputFile, int chunkSize, string path)
{
const int BUFFER_SIZE = 20 * 1024;
byte[] buffer = new byte[BUFFER_SIZE];
using (Stream input = File.OpenRead(inputFile))
{
int index = 0;
while (input.Position < input.Length)
{
using (Stream output = File.Create(path + "\\" + index))
{
int remaining = chunkSize, bytesRead;
while (remaining > 0 && (bytesRead = input.Read(buffer, 0,
Math.Min(remaining, BUFFER_SIZE))) > 0)
{
output.Write(buffer, 0, bytesRead);
remaining -= bytesRead;
}
}
index++;
Thread.Sleep(500); // experimental; perhaps try it
}
}
}
下面一行让我陷入了循环:
int remaining = chunkSize, bytesRead;
据我了解,与许多 C++ 运算符不同,逗号运算符被故意排除在 C# 规范之外;然而,上面的代码编译并运行得很好。
我知道你可以像这样声明多个逗号分隔的变量:
int i, j, y;
甚至设置它们
int i = 0, j = 1, y = 2;
但有问题的行出现在 while 循环中,并且包含一个(希望)已经声明和初始化的变量 chunkSize,以及一个在 bytesRead 下面的嵌套 while 循环中设置的变量。所以在多变量声明中使用逗号作为分隔符对我来说真的没有意义。
在上面的 C# 代码中,逗号运算符/分隔符的机制和行为是什么?另外,规范中有没有定义这些东西的地方?
【问题讨论】:
-
您没有在脑海中正确解析语句。您正确地注意到您可以在声明中使用逗号分隔的变量列表,并且您正确地注意到您可以选择在声明中分配初始值。您还可以混合匹配这两种语法!您可以拥有一个以逗号分隔的声明列表,其中其中一些具有初始化程序,这就是您所拥有的。
-
现在,这是一个有趣的问题:这是什么意思:
var x = 10, y = 123.4;。这是否意味着:int x = 10; double y = 123.4;还是意味着double x = 10, y = 123.4;。看看你能不能弄明白,然后试试看。你说对了吗? -
这与VB中一个著名的设计问题有关,你可以说
Dim Curly, Larry, Moe as Stooge,当然这意味着:Curly和Larry是Variant,Moe是@987654336 @,这很令人困惑。 -
@EricLippert 我真的很想念你在编码方面的精彩冒险!
-
感谢您的客气话。我只是最近没有时间写博客。我希望能重回正轨!