在 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
这对我来说有点代码味,因为同一行中的多个声明很难理解,并且可能给人一种印象,即 remaining
和 bytesRead
之间存在任何联系,即使有不是。
bytesRead 被设置为下面一行中的一个值 (input.Read),但是有些地方编译器需要知道 bytesRead 是一个 int。 C# 允许在方法中声明未初始化的变量,只要您在尝试使用它之前以某种方式对其进行初始化即可。
我还认为在同一行中声明多个变量会造成混淆和代码异味,尽管语言允许其他内容。
为了在 C# 布局约定中支持这一点,link 声明:
Write only one declaration per line.
我正在分析此 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
这对我来说有点代码味,因为同一行中的多个声明很难理解,并且可能给人一种印象,即 remaining
和 bytesRead
之间存在任何联系,即使有不是。
bytesRead 被设置为下面一行中的一个值 (input.Read),但是有些地方编译器需要知道 bytesRead 是一个 int。 C# 允许在方法中声明未初始化的变量,只要您在尝试使用它之前以某种方式对其进行初始化即可。
我还认为在同一行中声明多个变量会造成混淆和代码异味,尽管语言允许其他内容。
为了在 C# 布局约定中支持这一点,link 声明:
Write only one declaration per line.