2010-07-11 48 views
2

我有一個類大致設計成這樣:如何使用自定義向量類的數組初始值設定語法?

class Vector3 
{ 
    float X; 
    float Y; 
    float Z; 

    public Vector3(float x, float y, float z) 
    { 
     this.X = x; 
     this.Y = y; 
     this.Z = z; 
    } 
} 

我有其他類將其實現爲屬性,例如:

class Entity 
{ 
    Vector3 Position { get; set; } 
} 

現在設置實體的位置,我使用下面的:

myEntity.Position = new Vector3(6, 0, 9); 

我想通過實現一個類似於數組的初始化V ector3:

myEntity.Position = { 6, 0, 9 }; 

但是,沒有類可以繼承數組。此外,我知道我可以以某種方式設法得到這個微小的黑客:

myEntity.Position = new[] { 6, 0, 9 }; 

但這不是重點。 :)

謝謝!

回答

2

除了在數組中,沒有定義使用數組初始值設定語法的語法。當你暗示,不過,你可以操作(或兩個)添加到您的類型:

public static implicit operator Vector3(int[] value) 
    { 
     if (value == null) return null; 
     if (value.Length == 3) return new Vector3(value[0], value[1], value[2]); 
     throw new System.ArgumentException("value"); 
    } 
    public static implicit operator Vector3(float[] value) 
    { 
     if (value == null) return null; 
     if (value.Length == 3) return new Vector3(value[0], value[1], value[2]); 
     throw new System.ArgumentException("value"); 
    } 

然後你可以使用:

obj.Position = new[] {1,2,3}; 

等。不過,我個人只希望息事寧人,如:

obj.Position = new Vector3(1,2,3); 

其中涉及較少的工作(沒有陣列分配/初始化,沒有操作員調用)。

+0

我說我可以在問題中已經有這個,但這不是我想要的。請仔細閱讀。 ^^ – Lazlo 2010-07-12 16:10:30

+0

@Lazlo - 謝謝,但我*確實仔細閱讀。這並沒有改變這樣一個事實:沒有這樣的黑客,你不能這樣做。 – 2010-07-12 22:12:45

0

有2個選項:

1)使用對象初始化語法:

myEntity.Position = new Vector3(){ X = 6, Y = 0, Z = 9 }; 

2)創建contstructor接受一個數組:

Vector3(float[] array) 
{ 
    // Validate, set X = array[0] etc. 
} 

myEntity.Position = new Vector3(new float[3]{ 6, 0, 9}); 

我不知道,如果要麼比任何東西都容易

myEntity.Position = new Vector3(6, 0, 9); 

你已經有了。

+0

+1用於對象初始化語法。另外,如果你的'Vector3'從一個類改成了一個結構體,那麼這個語法就會調用默認的'Vector3'構造函數。作爲一個值類型,編譯器可以內聯默認的構造函數;如果你每秒創造許多許多'Vector3's,這可能會有所幫助。參見:[Shawn Hargreaves博客:內聯這些向量構造函數](http://blogs.msdn.com/b/shawnhar/archive/2007/01/02/inline-those-vector-constructors。aspx) – 2010-07-11 04:15:45

+0

這些都不會減少用戶輸入的代碼量。 – Lazlo 2010-07-11 04:31:29

+0

@Lazlo正確的,因爲我說你的構造函數可能沒有一些聰明的黑客就可以獲得。 – TJB 2010-07-11 04:49:41

1

請求的整個要點是減少代碼的總量。做{1,2,3}更方便。看起來奇怪的是,C#不允許你重載操作符來做到這一點,或者允許另一種方式來利用數組初始化器來實現自定義引用類型。

相關問題