When is using the C# ref keyword ever a good idea?

后端 未结 10 890
情歌与酒
情歌与酒 2020-11-29 06:05

The more I see ref used in production code, the more misuse I encounter and the more pain it causes me. I have come to hate this keyword, because from a framework-building s

相关标签:
10条回答
  • 2020-11-29 06:29

    Most of the Interlocked methods use ref parameters for (I’m sure you agree) good reason.

    0 讨论(0)
  • 2020-11-29 06:29

    I try to avoid it on public APIs, but it definitely has uses. Mutable value-types is an important one, especially on things like CF (where mutable structs are more common, due to platform requirements). However, perhaps the most common time I use it is when refactoring parts of a complex algorithm out into a few methods, where a state object is overkill and I need to pass multiple values around:

    i.e.

    var x = .....
    var y = .....
    // some local code...
    var z = DoSomethingSpecific(ref x, ref y); // needs and updates x/y
    // more local code...
    

    etc. Where DoSomethingSpecific is a private method, just moved out to keep method responsibility manageable.

    0 讨论(0)
  • 2020-11-29 06:36

    The Framework Design Guidelines (a book by Krzysztof Cwalina and Brad Abrams) recommend to avoid both ref and out parameters.

    AVOID using out or ref parameters.

    Using out or ref parameters requires experience with pointers, understanding how value types and reference types differ, and handling methods with multiple return values. Also, the difference between out and ref parameters is not widely understood. Framework architects designing for a general audience should not expect users to master working with out or ref parameters.

    The Framework Design Guidelines cite the canonical Swap method as a valid exception:

    void Swap<T>(ref T obj1, ref T obj2)
    {
        T temp = obj1;
        obj1 = obj2;
        obj2 = temp;
    }
    

    but at the same time a comment remarks

    Swap always comes up in these discussions, but I have not written code that actually needed a swap method since college. Unless you've got a very good reason, avoid out and ref altogether.

    0 讨论(0)
  • 2020-11-29 06:38

    How about if one wishes to pass an array to a function which might or might not change its size and do something else to it. Often, one would wrap the array in another object, but if one wishes to handle the array directly passing by reference would seem the most natural approach.

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