Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中返回引用?_C#_C# 4.0 - Fatal编程技术网

如何在C#中返回引用?

如何在C#中返回引用?,c#,c#-4.0,C#,C# 4.0,我使用的是Vector3D结构。我遇到的情况是,如果我拥有以下财产: Vector3D MyVec {get; set;} 如果我调用MyVec.Normalize()未修改MyVec值。我知道struct是值类型,getter将浅层复制一个新实例并返回它,因此Normalize()方法将修改temp对象,而不是MyVec本身 我怎样才能解决这个问题Vector3D不是类结构,我无法修改它 我可以用C#返回引用吗 谢谢。分配创建的结构 MyVec = MyVec.Normalize(); 正

我使用的是
Vector3D
结构。我遇到的情况是,如果我拥有以下财产:

Vector3D MyVec {get; set;}
如果我调用
MyVec.Normalize()未修改
MyVec
值。我知道struct是值类型,getter将浅层复制一个新实例并返回它,因此
Normalize()
方法将修改temp对象,而不是
MyVec
本身

  • 我怎样才能解决这个问题
    Vector3D
    不是类结构,我无法修改它
  • 我可以用C#返回引用吗

  • 谢谢。

    分配创建的结构

    MyVec = MyVec.Normalize();
    
    正如devio指出的,如果Normalize方法不返回新的结构(可变结构是邪恶的),那么下面是您的解决方案:

    var myVec = MyVec;
    myVec.Normalize();
    MyVec = myVec;
    

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

    public void Normalize(ref YourStruct pParameter)
    {
    //some code change pParameter
    }
    
    Normalize(ref someParameter);
    
    类似的工作和输出运算符:唯一的区别是,当使用输出参数时,不能初始化(分配)


    编辑:但它仅在您拥有对方法的控制时可用,否则只需简单赋值。

    对结构的引用将导致.Net中的不安全代码

    我想到了两个解决方案:

    • 仅允许通过包含此类结构属性的类操纵Vector3D结构

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

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

      • 我想你只能这样解决这个问题

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

        你的意思是:规范化(ref someObject.PropertyA)?是的,它不起作用。我认为编译器会给出警告(或事件编译错误)。如果您引用此Normalize()方法,则此方法无效。此方法无效,因为
        Normalize()
        根本不返回结果,它在原地工作。可变结构是邪恶的,但我们这里有一个可变结构,需要解决它,我想:(