【问题标题】:Is there a reason for array declaration syntax in C#?C# 中的数组声明语法是否有原因?
【发布时间】:2015-11-01 21:49:38
【问题描述】:

我想知道语法背后的原因是什么?我的意思是这样的:

int[ , ] arrayName = new int[10,10];

如果我们有类似的东西会不会更简单:

int[10,10] arrayName ;

是什么导致软件架构师做出这样的决定?

【问题讨论】:

  • 我想指出这两行代码不会做同样的事情。第一个将在堆栈上创建 arrayName,第二个将在堆上创建它。
  • 数组不存储在堆栈中。
  • 我现在意识到最初的评论是多么愚蠢。我假设“软件架构师”做出这个决定正是因为数组没有存储在堆栈中。

标签: c# arrays syntax architecture software-design


【解决方案1】:

这个

int[ , ] arrayName = new int[10,10];

已经在内存中初始化变量并实例化它。此外,您可以在运行时更改数组的大小,例如

arrayName = new int[20,20]

另一方面

int[10,10] arrayName ;

将只声明数组的变量。 arrayNamethen 仍然是 null

【讨论】:

  • Initializes 是指给它分配内存?初始化时是否填充了一个值,比如 0 ?
  • 是的,仅仅声明数组并不会真正创建它。这是通过 new 关键字完成的
  • 在初始化之前将是 null(通常使用 new 关键字)
【解决方案2】:

这是因为你可以在一个范围内声明变量,并在另一个范围内初始化它(通常在构造函数中)。

类似这样的:

public class Foo
{
    private int[ , ] Bar;  // Bar will be null until initialized

    public Foo(int a, int b)
    {
        Bar = new int[a, b];
    }
}

【讨论】:

    【解决方案3】:
    int[,] arrayName = new int[10,10];
    

    只有左边声明数组,右边初始化它。对于 C# 中的大多数(如果不是全部)变量都是如此。例如

    string test; //declaring
    test = "test"; //initialising
    string test = "test"; //declare and initialise
    

    【讨论】:

      【解决方案4】:

      使用int[10,10] arrayName;,您将致力于数组大小。如果我这样做会发生什么?

      int[10,10] arrayOne;
      int[11,11] arrayTwo;
      
      arrayOne = arrayTwo;
      

      数组对象只是一个指向托管内存块的指针。知道这一点,arrayOne = arrayTwo 在技术上必须是合法的。

      因此,将其称为int[10,10] 实际上是一个谎言。它可能以这种方式开始,但它可以随时重新分配到不同维度的数组中。

      【讨论】:

      • @AndreAndersen - 当然不会,因为我使用的是 OP 建议的替代(不存在的)C# 语法。
      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2011-04-05
      • 2021-12-20
      • 2018-10-26
      • 1970-01-01
      • 2018-09-18
      • 2021-10-17
      相关资源
      最近更新 更多