Как вернуть ссылку в C #? - PullRequest
4 голосов
/ 06 мая 2011

Я использую Vector3D структуру.Я сталкиваюсь с ситуацией, когда у меня есть свойство, например:

Vector3D MyVec {get; set;}

Если я вызываю MyVec.Normalize();, значение MyVec не изменяется.Я знаю, что struct это тип значения, и получатель будет копировать новый экземпляр и возвращать его, поэтому метод Normalize() изменит временный объект, а не MyVec.

  1. Как я могу решить эту проблемуситуация?Vector3D это структура, а не класс, и я не могу это изменить.
  2. Могу ли я вернуть ссылку на C #?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 06 мая 2011

Назначить созданную структуру

MyVec = MyVec.Normalize();

Как указало devio, если метод Normalize не возвращает новую структуру (изменяемая структура - зло), вот ваше решение:

var myVec = MyVec;
myVec.Normalize();
MyVec = myVec;
1 голос
/ 06 мая 2011

Ссылка на структуру приведет к небезопасному коду в .Net.

На ум приходят два решения:

  • Разрешить манипулирование структурой Vector3D только черезклассы, содержащие такие свойства структуры.

  • Инкапсулируйте структуру Vector3D в отдельный класс и разрешите этому классу проходить через все методы структуры, как вам требуется

    public class Vector3DProxy
    {
        Vector3D value;
    
        public Vector3D Value { get ... set ... }
    
        public void Normalize() { value.Normalize(); }
    }
    
0 голосов
/ 06 мая 2011

Я думаю, вы можете решить это только так;

MyVec = MyVec.NormalizeVector();


public static class Extension
{
    public static Vector3D NormalizeVector(this Vector3D vec)
    {
        vec.Normalize();
        return vec;
    }
}
0 голосов
/ 06 мая 2011

Метод может принимать ссылку на тип значения.

public void Normalize(ref YourStruct pParameter)
{
//some code change pParameter
}

Normalize(ref someParameter);

Аналогичные операции и оператор out: единственная разница, при использовании pParameter не может быть инициализирован (назначен).

Редактировать: Ноон может использоваться только если у вас есть контроль над методом, иначе просто присвойте значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...