C# pass by value/ref?

前端 未结 4 1686
借酒劲吻你
借酒劲吻你 2020-12-05 04:58

Common question but I could use an \"english\" explanation.

Is it like Java where

Cat myCat

actually is a pointer to Cat

相关标签:
4条回答
  • 2020-12-05 05:35

    Remember that a pointer is not exactly the same as a reference, but you can just about think of it that way if you want.

    I swear I saw another SO question on this not 10 minutes ago, but I can't find the link now. In the other question I saw, they were talking about passing arguments by ref vs by value, and it came down to this:

    By default in .Net, you don't pass objects by reference. You pass references to objects by value.

    The difference is subtle but important, especially if, for example, you want to assign to your passed object in the method.

    0 讨论(0)
  • 2020-12-05 05:40

    If you delacred Cat as

    class Cat {...}
    

    then it is.

    If you delcared Cat as

    struct Cat {...}
    

    then your variable "is" the structure itself.

    This is the difference between reference types and value types in .Net.

    0 讨论(0)
  • 2020-12-05 05:42

    As @rstevens answered, if it is a class, myCat is a reference. But if you pass myCat to a method call, then the reference itself is passed by value - i.e. the parameter itself will reference the same object, but it's a completely new reference, so if you assign it to null, or create a new object, the old myCat reference will still point to the original object.

    SomeMethod(myCat);
    
    void SomeMethod(Cat cat)
    {
        cat.Miau(); //will make the original myCat object to miau
        cat = null; //only cat is set to null, myCat still points to the original object
    }
    

    Jon Skeet has a good article about it.

    0 讨论(0)
  • 2020-12-05 05:44

    Yes, it's about pointers but not really... The thing that messed me up originally is that it isn't really about about protecting your variable from changes within the method. If you change the object within the method, those changes are visible to the external methods regardless of whether it is passed in "ref" or not.

    The difference (as I understand it) is whether the variable you send in has its reference updated coming back out if you change the object that variable references. So given this method

    public void DoSomething(ref CoolShades glasses)
    {
        glasses.Vendor = "Ray Ban";
        glasses = new CoolShades();
    }
    

    the variable you passed in as a parameter now contains a reference to the new CoolShades rather than whatever object it referenced before. The original parameter object's Vendor property will be changed to "Ray Ban" regardless of whether you passed the parameter ref or not.

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