How can you change a variable inside a method and also change it outside

前端 未结 2 1038
挽巷
挽巷 2021-01-25 11:54

I have a variable that I want to change inside a function and reflex the new change in the orginal variable . I am trying to change the original variable value to Scott inside t

2条回答
  •  旧时难觅i
    2021-01-25 12:43

    To start with, I would recommend you to read about references, values and parameters passing. There is a nice summary on this theme by Jon Skeet — Parameter passing in C# and good explanation of reference concept by Eric Lippert — References are not addresses.

    You should know that by default parameters are passed by value in C#, it means parameter will contain a copy of the reference passed as argument, it means assignments will only change parameter itself and won't be observable at the call site.

    That's why

    myname = "Scott";
    

    Only changes value of the method parameter myname and not the outer name variable.

    At the same time, we are able to pass our variable by reference with use of ref, in or out keywords. Although in and out keywords are adding excess guarantees, which are out of theme discussed, so I'll continue with ref.

    You should change both declaration of your method and call site to use it.

    public static void ChangeName(ref string myname)
    {
        myname = "Scott";
    }
    

    And it should be invoked now as

    ChangeName(ref name);
    

    This time there is no copying, so myname parameter stores the same reference as name variable and, moreover parameter and variable are stored at one location, it means changes to myname inside ChangeName method will be visible to invoking code.

    To continue with, I'd like to point you to a separate, but related theme in regards of your question — Expressions and Statements and to link you to a good article about them written by Scott Wlaschin — Expressions vs statements (there is a bit of F# inside, but that's not critical).

    Generally, there is nothing wrong with approach you've selected, but it's imperative, statement based and a bit too low level. You are forced to deal with references and their values, while what you really want is just to get value "Scott" from your method. This will look more straightforward and obvious, if implemented as an expression.

    public static string GetName() => "Scott";
    

    This way code is declarative and thus more simple (and short), it directly illustrates your goals.

提交回复
热议问题