Store a reference to an object

前端 未结 4 1328
庸人自扰
庸人自扰 2021-01-04 13:59

A bit of a weird question but I was wondering anyone could help...

In C++, I could do something like this

class MyOtherClass
{
     private:
                 


        
相关标签:
4条回答
  • 2021-01-04 14:43

    You're mixing things up. In C#, assignment statements such as

        logger = _logger;
    

    copy references, not objects. After this statement executes, there is still (at most) only one MyLogger - it's now referred to by two object variables.

    0 讨论(0)
  • 2021-01-04 14:44

    If the type is a reference type (which is the case for classes), then you will copy the reference, not the object itself.

    In opposition to reference type, you have value types. Values types are basically basic types : int, double, etc,

    In your case, that means that you will work with the same objects, whether you access it from the class, or from the outer calling method. It's because you are targeting the referenced object.

    0 讨论(0)
  • 2021-01-04 14:48

    adding comment for future me as sometime I also forget, also for someone new in c# want to visualize "c++ pointer" vs "c# object reference" vs "C# object reference By Ref". Notice how Passing By Ref(Last method call) and assigning new obj, changes original object.

    using System;
    
    public class Emp
    {
        public int TimeSpentInCompany {get; set;}
    }
    
    public class Program
    {
        public static void Main()
        {
            
            Emp t1 = new Emp{TimeSpentInCompany = 5};
            Console.WriteLine("original obj before method call-->" + t1.TimeSpentInCompany);
            
            // Test is one by one
            
            // var res = PassObject_SimpleUpdateMemberAndPrint(t1);
            // var res = PassObject_SimpleUpdateObjectAndPrint(t1);
            // var res = PassObjectByRef_SimpleUpdateMemberAndPrint(ref t1);
            var res = PassObjectByRef_SimpleUpdateObjectAndPrint(ref t1);
            
            Console.WriteLine("original obj after method call-->" + t1.TimeSpentInCompany);
            Console.WriteLine("obj from method response-->" + res.TimeSpentInCompany);
        }
        
        static Emp PassObject_SimpleUpdateMemberAndPrint(Emp data)
        {
            /*
                original obj before method call-->5
                in method before modification obj member--> 5
                in method AFTER modification obj member--> 9
                original obj after method call-->9
                obj from method response-->9
            */      
            Console.WriteLine("in method before modification obj member--> "+ data.TimeSpentInCompany);
            data.TimeSpentInCompany += 4;
            Console.WriteLine("in method AFTER modification obj member--> "+ data.TimeSpentInCompany);
            return data;
        }   
        
        static Emp PassObject_SimpleUpdateObjectAndPrint(Emp data)
        {
            /*
                original obj before method call-->5
                in method before assigning new obj --> 5
                in method AFTER assigning new obj --> 9
                original obj after method call-->5
                obj from method response-->9
            */
            Console.WriteLine("in method before assigning new obj --> "+ data.TimeSpentInCompany);
            data = new Emp{TimeSpentInCompany = 9};
            Console.WriteLine("in method AFTER assigning new obj --> "+ data.TimeSpentInCompany);
            return data;
        }
        
        static Emp PassObjectByRef_SimpleUpdateMemberAndPrint(ref Emp data)
        {
            /*
                original obj before method call-->5
                in method before modification obj member--> 5
                in method AFTER modification obj member--> 9
                original obj after method call-->9
                obj from method response-->9
            */      
            Console.WriteLine("in method before modification obj member--> "+ data.TimeSpentInCompany);
            data.TimeSpentInCompany += 4;
            Console.WriteLine("in method AFTER modification obj member--> "+ data.TimeSpentInCompany);
            return data;
        }   
        
        static Emp PassObjectByRef_SimpleUpdateObjectAndPrint(ref Emp data)
        {
            /*
                original obj before method call-->5
                in method before assigning new obj --> 5
                in method AFTER assigning new obj --> 9
                original obj after method call-->9
                obj from method response-->9
            */
            Console.WriteLine("in method before assigning new obj --> "+ data.TimeSpentInCompany);
            data = new Emp{TimeSpentInCompany = 9};
            Console.WriteLine("in method AFTER assigning new obj --> "+ data.TimeSpentInCompany);
            return data;
        }
    }
    
    0 讨论(0)
  • 2021-01-04 15:02

    It's actually a lot simpler in C#.

    Basically, you can do this:

    MyLogger logger = new MyLogger();
    MyOtherClass myOtherClass = new MyOtherClass(logger);
    MyClass myClass = new MyClass(logger);
    

    In C#, the classes are basically kept around as references (really just pointers under the hood). In this snippet, you are passing the reference to logger to the constructors of both objects. That reference is the same, so each instance has the same MyLogger instance.

    In this particular instance, you pretty much just need to remove the pointer syntax =D

    0 讨论(0)
提交回复
热议问题