6

次のものがあるとします。

public class MyElement
{
}

[Serializable]
[StructLayout(LayoutKind.Sequential)]
struct ArrayElement
{
    internal MyElement Element;
}

public class MyClass
{
    internal MyElement ComputeElement(int index)
    {
        // This method does a lengthy computation.
        // The actual return value is not so simple.
        return new MyElement();
    }

    internal MyElement GetChild(ref MyElement element, int index)
    {
        if (element != null)
        {
            return element;
        }

        var elem = ComputeElement(index);
        if (Interlocked.CompareExchange(ref element, elem, null) != null)
        {
            elem = element;
        }

        return elem;
    }
}

public class MyClassA : MyClass
{
    readonly MyElement[] children = new MyElement[10];

    public MyElement GetChild(int index)
    {
        return GetChild(ref children[index], index);
    }
}

public class MyClassB : MyClass
{
    readonly ArrayElement[] children = new ArrayElement[10];

    public MyElement GetChild(int index)
    {
        return GetChild(ref children[index].Element, index);
    }
}

MyClassBoverを使用するとどのような状況で利点がありますMyClassAか?

4

2 に答える 2

3

ArrayElementJIT がより良いコードを生成できるようにするラッパーです。.NET 配列は、すべての点で静的にタイプ セーフではないため、参照ストアのランタイム タイプ チェックがあります。

var array = new Stream[10];
((object[])array)[0] = "somestring"; //runtime exception

ラッパーを使用すると、型チェックは不要になります。

于 2013-09-14T15:14:54.703 に答える