在C#中设置int时,逗号运算符/分隔符的机制是什么?

时间:2018-07-16 17:58:43

标签: c# operators comma

我正在对此stackoverflow question的可接受答案中分析代码示例,其中包含以下代码块:


exports.help = help;

下面的代码让我陷入循环:


gulp.task("help", help);

据我了解,与许多C ++运算符不同,逗号运算符被故意排除在C#规范之外;但是,上面的代码可以编译并运行良好。

我知道您可以像这样声明多个逗号分隔的变量:

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;

但是该行出现在while循环中,并且包含(希望)已经声明并初始化了int i, j, y; 的一个变量,以及包含在int i = 0, j = 1, y = 2; 下的嵌套while循环中设置的一个变量。因此,在多变量声明中使用逗号作为分隔符对我来说真的没有任何意义。

在上面的C#代码中,逗号运算符/分隔符的机制和行为是什么?另外,规范中是否有定义这些东西的地方?

2 个答案:

答案 0 :(得分:6)

这是定义两个变量。

int remaining = chunkSize, bytesRead;

等同于

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

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

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

答案 1 :(得分:1)

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

要在C#布局约定中支持此功能,此link指出:

  

每行只写一个声明。