2008-11-20 65 views
1

我一直在使用Vector2和XNA,並且我發現調用零向量上的Normalize()成員函數會將其歸爲{NaN,NaN}向量。這一切都很好,但在我的情況下,我寧願它,而只是把它們作爲零向量。如何從C#擴展方法中訪問'this'?

將此代碼添加到我的項目啓用了一個可愛的擴展方法:

using ExtensionMethods; 

namespace ExtensionMethods 
{ 
    public static class MyExtensions 
    { 
     public static Vector2 NormalizeOrZero(this Vector2 v2) 
     { 
      if (v2 != Vector2.Zero) 
       v2.Normalize(); 
      return v2; 
     } 
    } 
} 

不幸的是,這種方法返回標準化矢量,而不是簡單地歸我用它來調用此擴展方法的載體。我想改爲表現爲vector2Instance .Normalize()。

除了使這個空白,我該如何調整這個'v2'被修改? (從本質上講,我需要訪問「這個」對象,或者我需要「V2」通過引用傳遞。)

編輯:

是的,我已經試過這樣:

public static void NormalizeOrZero(this Vector2 v2) 
    { 
     if (v2 != Vector2.Zero) 
      v2.Normalize(); 
    } 

不起作用,v2只是NormalizeOrZero範圍內的一個變量。

回答

3

這不起作用因爲Vector 2 is actually a struct。這意味着它通過值傳遞,你不能修改調用者的副本。我認爲你可以做的最好的是由lomaxxx指定的解決方法。

這說明了爲什麼你應該避免使用結構。有關更多信息,請參閱this question。 Vector2違反了結構應該是不可變的指導原則,但在XNA的背景下這樣做可能是有意義的。

0

我不知道爲什麼你的第二個代碼示例不工作,但如果第一個大量的代碼做你願意,你可以簡單地解決它通過什麼去:

Vector2 v2 = new Vector2() 
v2 = v2.NormalizeOrZero(); 
+0

第二個代碼示例是對結構體的一個副本進行變異,所以當它在某種意義上工作時,它不會執行OP希望它做的事情,並且改變對象調用者的操作。 – Servy 2013-04-03 14:55:41

0

您將需要參數上的refthis修飾符,這似乎不大可能奏效。

1

好吧,如果你真的只是死亡要做到這一點,你可以做這樣的事情:

public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2) 
{ 
    if (v2 != Vector2.Zero) 
     v2.Normalize(); 
} 

你會說它是這樣:

v2.NormalizeOrZero(ref v2); 

這是強大的醜陋,但它會工作,因爲它是值得的。但是在那個時候,你最好先調用靜態方法。