不确定通过引用传递是否有效

时间:2018-07-24 14:13:17

标签: c# .net micro-optimization

我创建了一个有趣的图书馆GamblersDice。我正在尝试对其进行微优化,但是不确定我是否做对了。我想要的是在创建模具时使用对全局 Random 对象的引用。我认为它不起作用的原因是,测试 GamblersDie(random,int) GamblersDie(ref random,int)几乎需要花费1000万次迭代(测试项目是在回购中)。如果您不想浏览整个仓库,这里是我的构造函数:

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];
        }
    }
}

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

1 个答案:

答案 0 :(得分:2)

变量/参数有什么用?它们具有。它们存储的值的本质是什么?对于值类型(struct),它们存储值本身

但是对于引用类型(class),它们存储引用;他们不存储对象本身,对象位于其他地方。

将这些 复制到C#中传递的默认传递值参数中。复制 reference 与创建其引用的对象的副本并不相同。因此,即使没有ref,您也要在方法内部和外部处理单个 object 。对对象的所有更改显然都可以在外部看到。

仅在以下情况下需要ref:a)您将重新分配参数,并且重新分配应该在外部可见;或者b)您正在对值类型进行突变,并且该变异应该在外部可见。


并且,如果以上内容不够清楚,我将在这里明确声明-Random是引用类型。


埃里克·利珀特(Eric Lippert)的奖金阅读:The Truth About Value Types,您可能还没有准备好,但确实有助于消除一些您可能会逐渐习惯的误解。