C# 为什么我们要在将结构传递给函数之前初始化它?
考虑以下代码:C# 为什么我们要在将结构传递给函数之前初始化它?,c#,C#,考虑以下代码: MyStruct j; j.I = 3; Console.WriteLine(j.I); 现在看看这个方法: public static void StructMod(MyStruct ms) { ms.I += 100; Console.WriteLine(ms.I); } 当我们将MyStruct传递给该方法时,是否应该在传递它之前初始化它?即: MyStruct j=new MyStruct() 除非struct是值类型 是的,
MyStruct j;
j.I = 3;
Console.WriteLine(j.I);
现在看看这个方法:
public static void StructMod(MyStruct ms)
{
ms.I += 100;
Console.WriteLine(ms.I);
}
当我们将MyStruct
传递给该方法时,是否应该在传递它之前初始化它?即:
MyStruct j=new MyStruct()
除非struct
是值类型
是的,是的。
第一行来自:
结构类型是值类型
与单个变量一样,结构必须完全初始化才能使用。考虑:
struct Foo
{
public int Bar;
public int Pop;
}
class Program
{
static void Main(string[] args) {
Foo f;
f.Bar = 3;
test(f); // ERROR: Use of unassigned local variable 'f'
}
static void test(Foo f) {
Console.WriteLine("{0}", f.Bar);
}
}
这里的解决方案是初始化.Bar
,或者简单地调用Foo
构造函数f=newfoo()
,将所有成员初始化为其默认值
这与
“字段后面的逻辑相同……在将控件返回给调用方之前必须完全赋值”
在向struct
s添加参数化构造函数时出现的错误。经过一点测试后,似乎无论以哪种方式声明它,它都在初始化
调用new…
的一个原因是在构造函数中执行代码(如果有的话)
例如,从以下位置获取此示例:
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
您可以这样做,然后使用c
,但是x
和y
将是0
CoOrds c;
或者,您可以这样做,然后从值开始执行x
和y
CoOrds c = new CoOrds(5,3);
(如果ctor做了一些更有趣的事情,这将更有用。)如果希望结构具有特定的值,则将其初始化为该值 如果希望将结构初始化为其默认值,则不需要显式初始化它。但是,如果结构的默认值不明显,出于可读性考虑,最好还是这样做 作为旁注:可变结构非常糟糕;您在示例中提出的整个场景都是代码气味。看 使用这样的不可变结构可以更安全地实现相同的行为
struct MyStruct
{
public readonly int I;
public MyStruct(int i_initial)
{
I = i_initial;
}
}
MyStruct j = new MyStruct(3);
public static void StructMod(MyStruct ms)
{
Console.WriteLine(ms.I + 100);
}
特别要注意的是,从调用方的角度来看,该函数的行为将与问题中的行为完全相同,因为结构按值传递的方式与
int
等基本体相同。如果StructMod中的“Mod”是因为您希望此函数修改值,那么这就是一个很好的具体示例,说明为什么可变类型通常是对象而不是结构更好。不是您所问的,而是j
、j.I
和ms.I
到底是什么?这些是我见过的最可怕的变量名。@l19对于这样一个独立的小示例,我对它们没有问题。他们不是模棱两可的,这个例子很容易理解。@Jonathon Reinhart,我知道,但我建议他在实际代码中使用更具代表性的名字。