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,我知道,但我建议他在实际代码中使用更具代表性的名字。