为什么以下工作?
class A
{
public int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
static void Main(string[] args)
{
}
}
Run Code Online (Sandbox Code Playgroud)
以下不是吗?
class A
{
public const int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
static void Main(string[] args)
{
}
}
Run Code Online (Sandbox Code Playgroud)
它不允许为除string之外的const引用类型分配除null之外的任何其他类型.由于它是一个数组(引用),因此必须将其指定为null(?).如果它是常数并且为空,它将如何初始化?
小智 15
如果我没记错的话,这是C#语言设计的一部分.const保留用于可以在编译时推断其内容的项目,即在程序构建之前(期间)然后运行.C#中的所有数组都是运行时数组(它们的长度是在程序运行时确定的,而不是在此之前确定的)因此它们不能被制作成const字段.我觉得这是C#的限制,但这就是他们决定这样做的方式.
引用类型可以为null的原因是它null是一个常量值,而初始化程序(在运行时生成)则不是.null内置于语言中,因此通过该逻辑,其值始终是已知的(因此可用于编译时引用类型).
编辑:
但是,您应该可以创建一个静态表,它将在任何其他代码使用或需要时进行初始化:
public static int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
^ Static Keyword
Run Code Online (Sandbox Code Playgroud)
您可以像访问它一样访问它(如果它仍然存在class A):
A.i[0, 1]
Run Code Online (Sandbox Code Playgroud)
我希望能帮到你
要了解更多信息,请查看MSDN:http://msdn.microsoft.com/query/dev11.query? appId = Dev11IDEF1& l = EN- US&k = k(CS0134) ; k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5) &RD =真
EDITEDIT:如果你需要将静态表格铆接到代码中,并且在初始化之后永远不让任何人更改它,那么readonly就是为此目的的关键字:
public static readonly int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
^ Static ^Readonly Keywords
Run Code Online (Sandbox Code Playgroud)
请记住,它不会阻止您将内容重新分配到这些插槽中,但它与C#可以提供的一样固定,除了每次创建属性或返回新数组.