【问题标题】:Why can Array.Length and Array.Count() not be assigned to const values?为什么不能将 Array.Length 和 Array.Count() 分配给 const 值?
【发布时间】:2010-08-10 17:23:58
【问题描述】:

我想遵循一些优秀的 C++ 建议,计算一次数组长度,然后使用一个值,而不必像这样调用函数:

代替:

for( int i = 0; i < arr.length; ++i )

我写

const int size = arr.length; // or arr.Count()
for( int i = 0; i < size; ++i )

在阅读了不同的线程 (Is it costly to do array.length or list.count in a loop) 后,我注意到性能提升没有实际意义,而且这是 C# 而不是 C++。

第二个原因是用一个值来初始化我的数组:

const int size = arr.Length;

int[] primes_ = new int[size];

所以我的问题是这样的:

为什么我还是不能声明呢?它向我吐出错误:

Error 2 The expression being assigned to 'length' must be constant

这很令人困惑,因为我的值是不变的。但是,当我删除const 时,会发出消息。 ...什么?

Length 的初始化为:

public int Length {get;} 来自 MSDN。这尤其令人困惑,因为我的最后一个问题 (Get-Set Accessor functionality differs on existence of get-set keyword) 明确地给了我“不可能只声明 get 和 leave set 不存在”的答案。

我不清楚为什么我可以声明int size = arr.Length,但不能声明const int size = arr.Length。为什么会这样?

【问题讨论】:

  • 这是一堆问题的重复。简单的答案是 C# 中的 const 意味着编译时间常数,而不是像 c++ 中的那样,它意味着分配一次

标签: c# arrays constants


【解决方案1】:

const 关键字要求在编译时知道该值 - .Net 编译器在编译代码时无法确定 arr.length 的值,因此无法将其分配给 const

关于您关于 getter 和 setter 的最后一个问题 - 如果您使用快捷语法,则必须同时声明 only:即private long n { get; private set; }。如果你对本地字段使用完整的、详细的属性声明,你可以只声明一个 get:

private long _n = 0;
private long N { get { return _n; } }

【讨论】:

    【解决方案2】:

    在 C# 中使用 const 定义需要一个可以在编译时评估的初始化程序。

    Look here.

    你可以使用readonly

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 2010-12-03
      • 2014-05-30
      • 1970-01-01
      • 2023-04-02
      • 2012-11-21
      • 2017-07-20
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多