考虑以下代码:
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()
答案 0 :(得分:1)
除非
struct
是值类型?
是的,是。
MSDN的第一行:
结构类型是值类型...
与单个变量一样,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 = new Foo()
,将所有成员初始化为默认值。
这与将参数化构造函数添加到"Field ... must be fully assigned before control is returned to the caller"
时出现的struct
错误背后的逻辑相同。
答案 1 :(得分:0)
经过一些测试后,似乎你宣布它的方式,它正在被初始化。
调用new ...
的一个原因是在构造函数中执行代码(如果有的话)。
从MSDN获取此示例,例如:
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做了更有趣的事情,这会更有用。)
答案 2 :(得分:0)
如果希望结构具有特定值,则将其初始化为该值。
如果您希望将结构初始化为其默认值,那么您不需要显式初始化它。但是,如果结构的默认值不明显,那么为了便于阅读可能仍然是最好的。
作为旁注:可变结构非常糟糕;您在示例中提出的整个场景是代码味道。见Why are mutable structs “evil”?
使用不可变的结构可以更安全地实现相同的行为
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);
}
特别要注意的是,从调用者的角度来看,这个函数的行为与问题中的行为完全相同,因为结构的传递方式与基元的传递方式相同{ {1}}。如果" Mod"在StructMod中是因为你希望这个函数能够修改这个值,那么这就是一个很好的具体例子,说明为什么它可以更好地将可变类型作为对象而不是结构。