Click here to Skip to main content
Click here to Skip to main content

.NET: String Constants vs Static Readonly Fields

, 13 Jan 2013
Rate this:
Please Sign up or sign in to vote.
If there is even a remote possibility that your “constant” value might change in the next version, make it a readonly field.

Numerous books and articles explain the difference between

public const string Foo = "foo"; and
public static readonly string Foo = "foo";

The former is treated as true constant that never ever changes, and it may be baked verbatim into the code of any caller:

const string CarthageFate = "Carthago delenda est";

The latter is treated as a field that might actually change between assembly versions, program invocations, or even in different app domains. You can actually do things like

public static readonly string InitTime = DateTime.Now.ToString();

So, I read about all that, but I never tested it. Until now that is. Since this fact was material for my current project, I wrote a little test that I offer for you enjoyment: StringConstant.zip.

We have two versions of a DefiningLib library defining some constants and readonly fields, and a UsingApp that uses it.

public const string VersionConst = "v1";
public static readonly string VersionField = "v1";
public static readonly string InitTime = DateTime.Now.ToString();

Version 1 is compiled by the standard “Debug” configuration and produces the following output:

DefiningLib version: 1.0.0.0
Init time: 1/11/2013 9:51:38 AM
VersionConst: v1
Versionfield: v1

Then we compile version 2 of the defining lib by switching to “Debug.v2″ solution configuration. Version 2 looks like this:

public const string VersionConst = "v2";
public static readonly string VersionField = "v2";
public static readonly string InitTime = DateTime.Now.ToString();

Only DefiningLib changes, UsingApp stays the same. We then manually copy DefiningLib.dll from DefiningLib\bin\Debug.v2 folder to UsingApp\bin\Debug and invoke UsingApp.exe. The output is as follows:

DefiningLib version: 2.0.0.0
Init time: 1/11/2013 9:54:06 AM
VersionConst: v1
Versionfield: v2

Voila, the theory is indeed right. The constant was baked in into UsingApp.exe and stayed “v1″. The field reference was updated to “v2″ as expected.

Lesson learned: if there is even a remote possibility that your “constant” value might change in the next version, make it a readonly field.

License

This article, along with any associated source code and files, is licensed under The Apache License, Version 2.0

About the Author

Ivan Krivyakov
Technical Lead Thomson Reuters
United States United States
Ivan is a hands-on software architect/technical lead working for Thomson Reuters in the New York City area. At present I am mostly building complex multi-threaded WPF application for the financial sector, but I am also interested in cloud computing, web development, mobile development, etc.
 
Please visit my web site: www.ikriv.com.

Comments and Discussions

 
NewsSystem.String.Empty PinmemberAndrei Rinea14-Jan-13 13:38 
Questionreadonly is not really read-only Pinmembertvbusy13-Jan-13 22:41 
AnswerRe: readonly is not really read-only PinmemberPaulo Morgado14-Jan-13 9:24 
GeneralMy vote of 3 Pingrouparbinda_dhaka13-Jan-13 9:05 
GeneralRe: My vote of 3 PinmemberIvan Krivyakov13-Jan-13 9:12 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140718.1 | Last Updated 13 Jan 2013
Article Copyright 2013 by Ivan Krivyakov
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid