为什么我们应该在将结构传递给函数之前初始化它?

时间:2014-03-26 03:37:34

标签: 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()

3 个答案:

答案 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,然后xy0

CoOrds c;

或者,您可以执行此操作,然后xy从值开始。

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中是因为你希望这个函数能够修改这个值,那么这就是一个很好的具体例子,说明为什么它可以更好地将可变类型作为对象而不是结构。