在 C# 中设置 int 时,逗号 operator/separator 的机制是什么?

What are the mechanics of the comma operator/separator while setting an int in C#?

我正在分析此 Whosebug 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,以及一个在下面的嵌套 while 循环中设置的变量 bytesRead.所以在多变量声明中使用逗号作为分隔符对我来说真的没有意义。

在上面的 C# 代码中,逗号 operator/separator 的机制和行为是什么?另外,规范中有定义这些东西的地方吗?

这是定义两个变量。

int remaining = chunkSize, bytesRead;

等同于

int remaining = chunkSize;
int bytesRead; // uninitialized, gets set to bytesRead = input.Read(buffer,... below

这对我来说有点代码味,因为同一行中的多个声明很难理解,并且可能给人一种印象,即 remainingbytesRead 之间存在任何联系,即使有不是。

bytesRead 被设置为下面一行中的一个值 (input.Read),但是有些地方编译器需要知道 bytesRead 是一个 int。 C# 允许在方法中声明未初始化的变量,只要您在尝试使用它之前以某种方式对其进行初始化即可。

我还认为在同一行中声明多个变量会造成混淆和代码异味,尽管语言允许其他内容。

为了在 C# 布局约定中支持这一点,link 声明:

Write only one declaration per line.