维护一个对象的最有效的方法——byref返回值

本文关键字:返回值 byref 方法 有效 一个对象 维护 | 更新日期: 2023-09-27 18:07:05

因为在c#中,值类型作为函数的参数是通过value传输的,而对象是通过ref传输的。所以我的问题是:哪个更好(更快/更高性能/占用更少内存)?

给你一个样本:

    public void ChangeObjectByRef(MyObject mo)
    {
        mo.Name = "Test2";
        mo.Values.Add("Value4");
    }
    public MyObject ChangeObjectReturnValue(MyObject mo)
    {
        mo.Name = "Test2";
        mo.Values.Add("Value4");
        return mo;
    }
    public void ChangeMyObject()
    {
        MyObject mo1 = new MyObject()
        {
            ID = 1,
            Name = "Test",
            Values = new List<string>(){
                "Value1", "Value2", "Value3"
            }
        };
        MyObject mo2 = new MyObject()
        {
            ID = 1,
            Name = "Test",
            Values = new List<string>(){
                "Value1", "Value2", "Value3"
            }
        };
        ChangeObjectByRef(mo1);
        mo2 = ChangeObjectReturnValue(mo2);
        Console.WriteLine(mo1.ToString());
        Console.WriteLine(mo2.ToString());
    }
    public class MyObject
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public List<string> Values { get; set; }
        public override string ToString()
        {
            return string.Format("[ID={0}, Name={1}, Values={2}", ID, Name, string.Format("[{0}]", string.Join(", ", Values)));
        }
    }

结果是相同的(明显的)。但是这两种方法有区别吗?

维护一个对象的最有效的方法——byref返回值

您实际上并没有使用值类型,有关值类型的详细信息,请参阅链接。你实际上传递的是一个指向那个对象的指针,而不是对象本身。因此,扩展@juharr在评论中放置的内容,您将失去mo2,因为您正在使用第一个对象的指针重写它。查看实际发生的代码示例


 class Program
    {
        static void Main(string[] args)
        {
            Demo demo = new Demo { A = "ABC" };
            Demo demo2;
            OptionOne(demo);
            Console.WriteLine(demo.A); //Outputs World
            demo2 = OptionTwo(demo);
            Console.WriteLine(demo.A); //Outputs Hello
            Console.WriteLine(demo2.A); //Output Hello
            Console.ReadKey();
        }
        private static void OptionOne(Demo demo)
        {
            demo.A = "World";
        }
        private static Demo OptionTwo(Demo demo)
        {
            demo.A = "Hello";
            return demo;
        }
    }
    public class Demo
    {
        public string A { get; set; }
    }