【问题标题】:What is the equivalent for C++ const size_t in C#?C# 中 C++ const size_t 的等价物是什么?
【发布时间】:2013-02-09 13:07:36
【问题描述】:

我正在尝试将一些 Ogre 代码转换为 C# 版本,但遇到了问题:

    const size_t nVertices = 8;
    const size_t vbufCount = 3*2*nVertices;

    float vertices[vbufCount] = {
            -100.0,100.0,-100.0,        //0 position
            -sqrt13,sqrt13,-sqrt13,     //0 normal
            //... 
           -sqrt13,-sqrt13,sqrt13,     //7 normal
    };

在C#中基本上不存在const size_t,也不能用const int来声明数组的大小。

我想知道如何声明具有常量值的数组?

【问题讨论】:

  • 你不需要显式写数组的大小,至少在 C++ 中是这样。
  • 数组已经固定了,所以没有必要让它的大小基于一个常量。

标签: c# c++


【解决方案1】:

size_t 是一个 typedef(有点像 #define 宏),它基本上是另一种类型的别名。它的定义取决于 SDK,但通常是 unsigned int

无论如何,在这种情况下它并不重要,因为它们是常量,所以你知道 nVertices 是 8,vbufCount 是 48。你可以在 C# 中这样写:

const int nVertices = 8;
const int vbufCount = 3 * 2 * nVertices;

float[] vertices = new float[vbufCount] {
    -100.0,100.0,-100.0,        //0 position
    -sqrt13,sqrt13,-sqrt13,     //0 normal
    //... 
    -sqrt13,-sqrt13,sqrt13,     //7 normal
    };

【讨论】:

  • 顺便说一句,这不会编译,因为 100.0double 并且它不能隐式转换为 float。您可以使用f 后缀来解决这个问题:100.0f
【解决方案2】:

在C#中基本上不存在const size_t,也不能用const int来声明数组的大小。

这不是因为const int,而是因为数组大小不是 C# 中数组类型的一部分。您可以将代码更改为:

float[] vertices = {
        -100.0f,100.0f,-100.0f,     //0 position
        -sqrt13,sqrt13,-sqrt13,     //0 normal
        //... 
       -sqrt13,-sqrt13,sqrt13,      //7 normal
};

还有其他几种方法可以做同样的事情,包括:

const int nVertices = 8;
const int vbufCount = 3*2*nVertices;

float[] vertices = new float[vbufCount] {
        -100.0f,100.0f,-100.0f,     //0 position
        -sqrt13,sqrt13,-sqrt13,     //0 normal
        //... 
       -sqrt13,-sqrt13,sqrt13,      //7 normal
};

唯一的区别是如果初始化器中的项目数与你指定的数量不匹配,你会得到一个编译时错误。

【讨论】:

    【解决方案3】:
    float[] array = new float[] { 1.2F, 2.3F, 3.4F, 4.5F };
    

    这就是你如何在 C# 中声明 arrays

    【讨论】:

    • 嗯,这是一种方法。你也可以用不同的方式写,包括float[] array = { 1.2F, 2.3F, 3.4F, 4.5F };
    【解决方案4】:

    在 C++ 中,size_t 是至少 16 位的无符号整数类型,它遵循 CPU 的本机整数类型。换句话说, sizeof(size_t) 不是固定的,即使大多数人将其用作“无符号整数”。在 C# 中没有这样的东西。

    C# 中的大小(例如,当使用数组和列表时)通常是 'int' 类型,它是一个 32 位整数。

    在您的情况下,我可能会将数组设为只读并使用“vertices.Length”,例如:

        private readonly float[] vertices = new float[]
        {
            1f,2f,3f,4f,5.2f // etc
        };
    

    或者在这种情况下,我可能会将其定义为二维数组并使用 vertices.GetLength:

        private readonly float[,] vertices = new float[5,5];
    
        // fill in code:
        vertices[0, 0] = 0; 
        // etc
    

    【讨论】:

      【解决方案5】:

      所有这些答案实际上并没有回答什么类型相当于 size_t 的问题。 .NET 中 size_t 的正确等效类型是 UIntPtr。它在 32 位平台上是 32 位,在 64 位平台上是 64 位,并且是无符号的。它是唯一真正等效的类型。

      【讨论】:

        猜你喜欢
        • 2015-07-10
        • 2014-05-08
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        • 1970-01-01
        • 2012-06-29
        相关资源
        最近更新 更多