2010-01-15 72 views
15

documentationC#結構:未分配的本地變量?

Unlike classes, structs can be instantiated without using a new operator.

那麼,爲什麼我收到此錯誤:

Use of unassigned local variable 'x'

當我嘗試這樣做呢?

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

其中Vec2 x是一個struct嗎?

回答

18

那麼,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自己的類型?你有權訪問涉及的領域,或只有屬性?

如果這是你自己的類型,我會強烈敦促你嘗試堅持不變的結構。我知道託管的DirectX有一些可變的結構以儘可能地接近最佳性能,但這是以這種奇怪的情況爲代價的 - 更糟的是,說實話。

我會親自給結構構造以X和Y:

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

啊,他們是屬性。接得好!我會考慮讓X和Y私人化,如果我能擺脫它的話。 – mpen 2010-01-15 04:23:28

+2

+1。好的,喬恩。 – 2010-01-15 04:49:45

+0

我對此很新,肯定會對這個疑問有所迴應:如果我可以像所示那樣直接設置x,那麼使用setter方法有什麼用處?然而,我有同樣的問題,結構我有x設置爲私人公共getter和setter方法來操縱它。我應該如何處理? – darnir 2012-08-15 08:50:38

9

它仍然是未初始化。在使用它之前,你需要初始化它。您可以使用default運營商,如果你不希望創建的結構成員的靜態Vec.Empty值和高興的默認設置:

Vec2 x = default(Vec2); 

米奇小麥:

然而這並不:

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; 
} 

編譯器會阻止您已被初始化呼籲類型propertis所有它的成員之前,即使屬性可能只設置一個值。 Jon Skeet提出的解決方案是有一個初始化構造函數,最好沒有setter。