猿问

不确定按引用传递是否有效

我创建了一个名为GamblersDice 的娱乐库。我正在尝试对其进行微优化,但不确定我是否做得对。我想要的是在创建模具时使用对全局Random对象的引用。我认为它不起作用的原因是测试GamblersDie(random, int)和GamblersDie(ref random, int)花费几乎相同的时间超过 10,000,000 次迭代(测试项目在 repo 中)。如果你不想浏览 repo,这里是我的构造函数:


public class GamblersDie : Die

{

    private Random _rnd;


    public int[] Weight { get; private set; }


    public GamblersDie() : this(new Random()) { }


    public GamblersDie(int size) : this(new Random(), size) { }


    public GamblersDie(params int[] weights) : this(new Random(), weights) { }


    public GamblersDie(Random rnd) : this(ref rnd) { }


    public GamblersDie(Random rnd, int size) : this(ref rnd, size) { }


    public GamblersDie(Random rnd, params int[] weights) : this(ref rnd, weights) { }


    public GamblersDie(ref Random rnd) : this(ref rnd, 6) { }


    public GamblersDie(ref Random rnd, int size) {

        _rnd = rnd;

        Weight = new int[size];


        for (int i = 0; i < Weight.Length; i++)

        {

            Weight[i] = 1;

        }

    }


    public GamblersDie(ref Random rnd, params int[] weights) : this(ref rnd, weights.Length)

    {

        for (int i = 0; i < Weight.Length; i++)

        {

            Weight[i] = weights[i];

        }

    }

}

就像我说的,这只是为了好玩。我想对它进行微优化,只是因为它可能是可能的。我的另一个问题是关于构造函数链接。乍一看它可能令人困惑,我想知道它是否是某种反模式。


慕无忌1623718
浏览 182回答 1
1回答

料青山看我应如是

变量/参数包含什么?他们持有价值观。它们存储的值的性质是什么?对于 Value types(&nbsp;struct),它们存储值本身。但是对于引用类型 (&nbsp;class),它们存储一个引用;它们不存储位于其他地方的对象本身。正是这些被复制-在默认通按值的参数传递在C#。复制引用与创建引用的对象的副本不同。因此,即使没有ref,您也在处理方法内部和外部的单个对象。显然,对象的任何更改都将在外部可见。您只需要refa) 要重新分配参数并且该重新分配应该是外部可见的,或者 b) 您正在改变 Value 类型并且该突变应该是外部可见的。而且,如果上述内容不够清楚,我将在此处明确说明 -Random是引用类型。额外阅读:Eric Lippert 的《关于价值类型的真相》,您可能还没有准备好,但确实有助于消除一些您可能会在此过程中遇到的常见误解。
随时随地看视频慕课网APP
我要回答