Gri*_*911 3 c# operators comma
我正在分析此stackoverflow问题的接受答案中的代码示例,其中包含以下代码块:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下一行告诉我一个循环:
int remaining = chunkSize, bytesRead;
Run Code Online (Sandbox Code Playgroud)
我的理解是,与许多C++运算符不同,逗号运算符被故意排除在C#规范之外; 但是,上面的代码编译并运行得很好.
我知道你可以声明多个逗号分隔的变量,如下所示:
int i, j, y;
Run Code Online (Sandbox Code Playgroud)
甚至设置它们
int i = 0, j = 1, y = 2;
Run Code Online (Sandbox Code Playgroud)
但是有问题的行出现在while循环中,并且包含一个(希望)已经声明和初始化的变量,chunkSize以及一个在下面的嵌套while循环中设置的变量bytesRead.所以在多变量声明中使用逗号作为分隔符对我来说并没有多大意义.
在上面的C#代码中,逗号运算符/分隔符的机制和行为是什么?此外,规范中是否有定义这些内容的地方?
这是定义两个变量.
int remaining = chunkSize, bytesRead;
Run Code Online (Sandbox Code Playgroud)
相当于
int remaining = chunkSize;
int bytesRead; // uninitialized, gets set to bytesRead = input.Read(buffer,... below
Run Code Online (Sandbox Code Playgroud)
这对我来说有点代码味道,因为同一行中的多个声明难以理解,并且可能给人一种印象,即它之间存在任何连接remaining,bytesRead即使没有.
bytesRead设置为下面一行中的值(input.Read),但有些编译器需要知道bytesRead是一个int.并且C#允许在方法中声明未初始化的变量,只要您在尝试使用它之前初始化它.