2008-11-20 6 views
1

Я работаю с Vector2 и XNA, и я пришел к выводу, что вызов функции Normalize() для нулевого вектора нормализует ее к вектору {NaN, NaN}. Это все хорошо и хорошо, но в моем случае я предпочел бы вместо этого просто оставить их как Zero Vectors.Как мне получить доступ к этому 'изнутри метода расширения C#?

Добавление этого кода в мой проект включен милый метод расширения:

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' будет передаваться по ссылке.)

Edit:

И да, я попытался это:

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

Вам понадобится как модификатор ref, так и модификатор this, который вряд ли будет работать.

1

Ну, если вы на самом деле просто умирает, чтобы сделать это, вы могли бы сделать что-то вроде этого:

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

Вы назвали бы это так:

v2.NormalizeOrZero(ref v2); 

Это могучее некрасиво , но он будет работать, для чего он стоит. Но в этот момент вы можете также вызвать статический метод в первую очередь.