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

.NET: String Constants vs Static Readonly Fields

By , 13 Jan 2013
 

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
Architect Sungard Consulting Services
United States United States
Member
Ivan is a hands-on software architect working for SunGard Consulting, 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.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
NewsSystem.String.Empty PinmemberAndrei Rinea14 Jan '13 - 13:38 
Questionreadonly is not really read-only Pinmembertvbusy13 Jan '13 - 22:41 
GeneralMy vote of 3 Pingrouparbinda_dhaka13 Jan '13 - 9:05 

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

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 13 Jan 2013
Article Copyright 2013 by Ivan Krivyakov
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid