如何在C#中返回引用?

4

我正在使用Vector3D结构。我遇到了这样一种情况,即如果我有一个属性:

Vector3D MyVec {get; set;}

如果我调用MyVec.Normalize();MyVec的值不会被修改。我知道结构体是值类型,getter将浅复制一个新实例并返回它,因此Normalize()方法将修改临时对象而不是MyVec本身。
以下是需要翻译的内容:
  1. 我该如何解决这种情况?Vector3D是结构体而不是类,我无法修改它。
  2. 在C#中我能够返回引用吗?
谢谢。
4个回答

5

分配创建的结构体。

MyVec = MyVec.Normalize();

正如devio指出的那样,如果Normalize方法不返回一个新的结构体(可变结构体是有害的),这里就有你的解决方案:
var myVec = MyVec;
myVec.Normalize();
MyVec = myVec;

1
如果您正在引用此Normalize()方法http://msdn.microsoft.com/en-us/library/system.windows.media.media3d.vector3d.normalize.aspx,那么这将无法工作。 - devio
这样做行不通,因为Normalize()根本不返回结果,它是就地操作的。可变结构体很糟糕,但我们在这里有一个可变结构体,需要想办法解决它 :( - Matthew Scharley

1

在 .Net 中,对结构体的引用会导致不安全的代码。

有两个解决方案:

  • 只允许通过包含该结构属性的类来操作Vector3D结构。

  • 将Vector3D结构封装在一个单独的类中,并使该类通过所有结构方法,如您所需

    public class Vector3DProxy
    {
        Vector3D value;
    
        public Vector3D Value { get ... set ... }
    
        public void Normalize() { value.Normalize(); }
    }
    

0

方法可以接受值类型的引用。

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

Normalize(ref someParameter);

相似的工作和out运算符:唯一的区别在于,使用out时可以不初始化(赋值)pParameter。
编辑:但只有在你控制方法时才能使用,否则只需简单赋值即可。

你的意思是:Normalize(ref someObject.PropertyA)?是的,这样不行。我认为编译器会给出警告(甚至编译错误)。 - VikciaR

0

我认为你只能这样解决这个问题;

MyVec = MyVec.NormalizeVector();


public static class Extension
{
    public static Vector3D NormalizeVector(this Vector3D vec)
    {
        vec.Normalize();
        return vec;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接