Start here. This is the direct spoken answer to practice first.
Why this question matters
Many C# bugs come from saying objects are passed by reference when the language normally passes an object reference by value. The distinction predicts whether reassignment or mutation is visible to the caller.
A variable of a value type contains its value, so assigning it or passing it normally copies that value. A variable of a reference type contains a reference to an object, so the reference is copied and both variables can point to the same object. A method can mutate that shared object through its copied reference, but reassigning the parameter does not replace the caller's variable. C# parameters are pass-by-value by default in both cases; ref, out, and in explicitly change how the variable or storage is passed.