在枚举中有意义的最大标志数是多少?

时间:2017-01-11 17:42:50

标签: c#

考虑这种类型的枚举,您可以使用按位比较将多个布尔值基本组合到一个数据字段中:

    //sprite 
    var spriteMap = new THREE.TextureLoader().load( 'tag.png' );    
    var spriteMaterial = new THREE.SpriteMaterial( { map: spriteMap, color: 0xffffff } );
    var sprite = new THREE.Sprite( spriteMaterial );
    sprite.scale.set(3, 3, 1)
    sprite.position.set(25, 20, 20)
    scene.add( sprite );
    objects.push(sprite);

    //sprite( text )
        var spritey = makeTextSprite( " spritey ", 
            { fontsize: 24, borderColor: {r:255, g:0, b:0, a:1.0}, backgroundColor: {r:255, g:100, b:100, a:1.0} } );
        spritey.position.set(-85,105,55);
        scene.add( spritey );
        console.log(makeTextSprite);
        objects.push(spritey);

    ///////////////////skip some codes//////////////////////////////////

    function onDocumentMouseUp(event) {
        event.preventDefault();
        var vector = new THREE.Vector3((event.clientX / window.innerWidth) * 2-1, -(event.clientY / window.innerHeight) * 2 + 1, 0.5);
        projector.unprojectVector(vector, camera);
        var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
        var intersects = raycaster.intersectObjects(objects);
        if (intersects.length > 0) {
            window.open(intersects[0].object.userData.URL);
            console.log(intersects.length)
        }
    }

我已阅读https://msdn.microsoft.com/en-us/library/ms229062(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1的MSDN文档,并进行了一些Google搜索,但我仍有一些架构问题。

似乎最多[编辑:8]选项(加上#34;无"),您可以将任何标志组合放入单个存储字节中。这实际上是它在运行时是如何处理的,还是只是陷入了Int32而浪费了剩余的空间?添加第九个选项是否存在效率劣势?如果是这样,在达到下一个效率劣势之前,您还可以添加多少选项?关于其中一个应该有多大,是否有经验法则?我正在考虑将这个用于需要至少6个标志的应用程序,但可以想象它会增加到8-12个标志(但我也对理论限制感兴趣。)

提前致谢!

2 个答案:

答案 0 :(得分:5)

默认情况下,任何枚举都由int支持,这意味着它有32位。这可以容纳多达32个不同的标志,因为每个标志只是在int中设置了一个位。

当少于32个标志时,它仍占用一个int的空间,即4个字节。您可以从列表bytesbyteshortushortintuint中选择其他类型作为基础类型,longulong

因此,如果您只有4个选项,则可以将您的枚举声明为

[Flags]
public enum Options : byte
{
    None    = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8
}

然后只占用一个字节的内存,在剩余的比特用完之前,你最多可以添加8个选项。

关于设计最佳做法,请阅读the best practices page from Microsoft on Enums

答案 1 :(得分:1)

您可以指定所需任何枚举的基础类型 如果你不这样做,它将永远是Int32

此外,byte最多可以容纳8个标记。