代码之家  ›  专栏  ›  技术社区  ›  mpen

C结构:未赋值局部变量?

  •  18
  • mpen  · 技术社区  · 15 年前

    documentation :

    与类不同,结构可以在不使用新运算符的情况下实例化。

    所以为什么我会得到这个错误:

    使用未分配的局部变量“x”

    当我试着这么做的时候?

            Vec2 x;
            x.X = det * (a22 * b.X - a12 * b.Y);
            x.Y = det * (a11 * b.Y - a21 * b.X);
    

    在哪里? Vec2 x 是一个结构吗?

    2 回复  |  直到 15 年前
        1
  •  21
  •   Jon Skeet    15 年前

    是x和y属性(而不是字段)?如果是这样,那就是问题所在。直到所有的领域 x 是绝对指定的,不能调用任何方法或属性。

    例如:

    public struct Foo
    {
        public int x;
        public int X { get { return x; } set { x = value; } }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Foo a;
            a.x = 10; // Valid
    
            Foo b;
            b.X = 10; // Invalid
        }
    }
    

    Vec2 你自己的类型?您是否可以访问相关字段,或者只访问属性?

    如果是你自己的类型,我会的 强烈地 敦促你尝试坚持不变的结构。我知道managed directx有一些可变的结构,可以尽可能接近最佳性能,但这是以这种奇怪的情况为代价的——更糟糕的是,说实话。

    我会亲自给结构一个取x和y的构造函数:

     Vec2 x = new Vec2(det * (a22 * b.X - a12 * b.Y),
                       det * (a11 * b.Y - a21 * b.X));
    
        2
  •  9
  •   Igor Zevaka    15 年前

    它仍然未初始化。您需要在使用它之前初始化它。你可以使用 default 如果不想创建静态 Vec.Empty 值并满意结构成员的默认值:

    Vec2 x = default(Vec2);
    

    Mitch Wheat:

    然而,这并不意味着:

    public struct Vec2
    {
        int x;
        int y;
    
       public float X { get { return x; } set { x = value; } }
       public float Y { get { return y; } set { y = value; } }
    
    }
    static void Main(string[] args)
    {
        Vec2 x;
    
        x.X = 1;
        x.Y = 2; 
    }
    

    编译器防止您在初始化所有成员之前调用类型的属性,即使属性可能只是设置了其中一个值。解决方案,如jon skeet所提议的,是有一个初始化的构造函数,最好没有setter。