C# Frequently Asked Questions

The C# team posts answers to common questions

How do I create a constant that is an array?

Strictly speaking you can't, since const can only be applied to a field or local whose value is known at compile time.

In both the lines below, the right-hand is not a constant expression (not in C#).

const int [] constIntArray = newint [] {2, 3, 4};
 // error CS0133: The expression being assigned to 'constIntArray' must be constant
const int [] constIntArrayAnother = {2, 3, 4};
 // error CS0623: Array initializers can only be used in a variable or field
 //               initializer. Try using a new expression instead. 

However, there are some workarounds, depending on what it is you want to achieve.

If want a proper .NET array (System.Array) that cannot be reassigned, then static readonly will do for you.

static readonly int [] constIntArray = new int[] {1, 2, 3};

The constIntArray field will be initialized before it its first use.

If, on the other hand, you really need a const set of values (say as an argument to an attribute constructor), then - if you can limit yourself to integral types - an enum would serve you well.

For example:

[Flags]
public enum Role
{
	Administrator = 1,
	BackupOperator = 2,
	// etc. 
}

public class RoleAttribute : Attribute
{
	public RoleAttribute()
	{
		CreateRole = DefaultRole;
	}

	public RoleAttribute(Role role)
	{
		CreateRole = role;
	}

	public Role CreateRole
	{
		get { return this.createRole; }
		set { this.createRole = value; }
	}

	private Role createRole = 0;
	public const Role DefaultRole = Role.Administrator
	 | Role.BackupOperator;
}

[RoleAttribute(RoleAttribute.DefaultRole)]
public class DatabaseAccount
{
	//.............. 
}

RoleAttribute, instead of taking an array, would only take a single argument of flags (appropriately or-ed). If the underlying type of the Role enum is long or ulong, that gives you 64 different Roles.

[Author: SantoshZ]

Published Friday, December 03, 2004 9:33 AM by CSharpFAQ

Comments

 

Matthew W. Jackson said:

In practice, static readonly arrays are pretty useless.

Sure, you cannot reassign the array itself, but you can replace individual values. The "readonly" just makes you think it cannot be changed, which is bad because you end up with mistakes like System.IO.Path.InvalidPathChars.

Since some malicious code may change an InvalidPathChars entry, it is useless for validation.
December 3, 2004 10:08 AM
 

JC# said:

PERFECT!
December 23, 2004 12:46 AM
 

FAQ C# said:

January 5, 2005 5:32 PM
 

FAQ C# (par Yannick Lejeune) said:

August 23, 2005 5:14 AM
 

FAQ C# (par Yannick Lejeune) said:

August 23, 2005 5:17 AM
Anonymous comments are disabled

© 2008 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker