January 16, 2005

Code quality, part III: Manually number your enums

When using enumerations, .NET languages automatically assign the numeric values for your enums. For example:

public enum MyColor {
  Red,
  Green,
  Blue
}

This yields an enum with the numeric representation of Red = 0, Green = 1, Blue = 2. All this is fine - the numeric versions don't really matter normally. But one thing you should realize is that external assemblies referring to this enum do not get the symbolic names compiled in, but rather the numeric values. Now, if you have A.DLL defining that enumeration and B.DLL that calls a method in A.DLL (say, "SetColor(MyColor)") with something like ClassFromA.SetColor(MyColor.Blue) doesn't get the name "Blue" embedded into its binary version, but just rather "SetColor(2)".

Now go and change A's enum to have values of { Red, Mauve, Green, Blue }. The enum gets numbered from 0 (Red) to 3 (Blue). Everything works fine within A, but unless B is recompiled from source with references to the new version of A, the SetColor call looks like it actually had the parameter of MyColor.Green when it arrives in A.DLL. This is an extremely nasty way of introducing hard-to-find bugs in your code.

Thus, my recommendation: Always manually number all enumerations that have scope outside the defining compilation unit. An easier approach is to just always add the new values to the end of the enumeration, but it won't allow you to remove values from the enum unless you add more manual numbering. I prefer manual numbering even though you have to be careful to keep the numbers unique, as it allows you to sort the enumeration definition in any way without affecting the actual result. So here's an example:

public enum MyColor {
  Red = 1,
  Green = 2,
  Blue = 3
}

If you wish to have them sorted by name in your definition code, go for it:

public enum MyColor {
  Blue = 3,
  Green = 2,
  Red = 1
}

The enumeration values should be treated as one-time-identifiers - once they're assigned to a value and a DLL version is used for compilation of other libraries, the semantics of an enum value shouldn't be changed. So you shouldn't remove Green and reuse the numeric value 2 later on - it will cause the problem identified above. Leave gaps in the numbering and always use a new value for new items.

Also note that most solutions regarding enum value serialization (saving custom configuration files, calling external services with enum-type params etc.) have the same effects than the external-DLL-scenario. So, even if your enum only had scope inside one executable, you may be surprised when loading a config file from an older version of the software that had enum values stored in it. Be careful out there!

Posted by Jouni Heikniemi at January 16, 2005 08:01 AM
.net
Comments

lOvY2e ctmyznzunxld, [url=http://faiomraswtrp.com/]faiomraswtrp[/url], [link=http://noweevgxfkbl.com/]noweevgxfkbl[/link], http://bscebkfpdvvw.com/

Posted by: phojqikmr at July 2, 2008 04:23 PM

Nicotine
[url=http://communities.vmware.com/people/nicotine]Nicotine[/url]
Norvasc
[url=http://communities.vmware.com/people/norvasc]Norvasc[/url]
Oxycodone
[url=http://communities.vmware.com/people/oxycodone]Oxycodone[/url]
Oxycontin
[url=http://communities.vmware.com/people/oxycontin]Oxycontin[/url]
Paxil
[url=http://communities.vmware.com/people/paxil]Paxil[/url]
Penicillin
[url=http://communities.vmware.com/people/penicillin]Penicillin[/url]
Percocet
[url=http://communities.vmware.com/people/percocet]Percocet[/url]
Phentermine
[url=http://communities.vmware.com/people/phentermine]Phentermine[/url]
Plan+B
[url=http://communities.vmware.com/people/plan B]Plan+B[/url]
Plavix
[url=http://communities.vmware.com/people/plavix]Plavix[/url]
Potassium
[url=http://communities.vmware.com/people/potassium]Potassium[/url]
Prednisone
[url=http://communities.vmware.com/people/prednisone]Prednisone[/url]
Prevacid
[url=http://communities.vmware.com/people/prevacid]Prevacid[/url]
Prilosec
[url=http://communities.vmware.com/people/prilosec]Prilosec[/url]
Propecia
[url=http://communities.vmware.com/people/propecia]Propecia[/url]

Posted by: Nsqycsyo at July 10, 2008 04:09 AM

buy Ativan
[url=http://www.worldcat.org/profiles/ativan]buy Ativan[/url]
buy Augmentin
[url=http://www.worldcat.org/profiles/augmentin]buy Augmentin[/url]
buy Avandia
[url=http://www.worldcat.org/profiles/avandia]buy Avandia[/url]
buy Bactrim
[url=http://www.worldcat.org/profiles/bactrim]buy Bactrim[/url]
buy Benadryl
[url=http://www.worldcat.org/profiles/benadryl]buy Benadryl[/url]
buy Biaxin
[url=http://www.worldcat.org/profiles/biaxin]buy Biaxin[/url]
buy Byetta
[url=http://www.worldcat.org/profiles/byetta]buy Byetta[/url]
buy Botox
[url=http://www.worldcat.org/profiles/botox]buy Botox[/url]
buy Calcium
[url=http://www.worldcat.org/profiles/calcium]buy Calcium[/url]
buy Carisoprodol
[url=http://www.worldcat.org/profiles/carisoprodol]buy Carisoprodol[/url]
buy Celebrex
[url=http://www.worldcat.org/profiles/celebrex]buy Celebrex[/url]
buy Celexa
[url=http://www.worldcat.org/profiles/celexa]buy Celexa[/url]
buy Cephalexin
[url=http://www.worldcat.org/profiles/cephalexin]buy Cephalexin[/url]
buy Chantix
[url=http://www.worldcat.org/profiles/chantix]buy Chantix[/url]
buy Cialis
[url=http://www.worldcat.org/profiles/cialis]buy Cialis[/url]

Posted by: Hqmdrrwh at July 10, 2008 05:03 AM

cheap Nicotine
[url=http://www.worldcat.org/profiles/nicotine]cheap Nicotine[/url]
cheap Norvasc
[url=http://www.worldcat.org/profiles/norvasc]cheap Norvasc[/url]
cheap Oxycodone
[url=http://www.worldcat.org/profiles/oxycodone]cheap Oxycodone[/url]
cheap Oxycontin
[url=http://www.worldcat.org/profiles/oxycontin]cheap Oxycontin[/url]
cheap Paxil
[url=http://www.worldcat.org/profiles/paxil]cheap Paxil[/url]
cheap Penicillin
[url=http://www.worldcat.org/profiles/penicillin]cheap Penicillin[/url]
cheap Percocet
[url=http://www.worldcat.org/profiles/percocet]cheap Percocet[/url]
cheap Phentermine
[url=http://www.worldcat.org/profiles/phentermine]cheap Phentermine[/url]
cheap Plan+B
[url=http://www.worldcat.org/profiles/plan B]cheap Plan+B[/url]
cheap Plavix
[url=http://www.worldcat.org/profiles/plavix]cheap Plavix[/url]
cheap Potassium
[url=http://www.worldcat.org/profiles/potassium]cheap Potassium[/url]
cheap Prednisone
[url=http://www.worldcat.org/profiles/prednisone]cheap Prednisone[/url]
cheap Prevacid
[url=http://www.worldcat.org/profiles/prevacid]cheap Prevacid[/url]
cheap Prilosec
[url=http://www.worldcat.org/profiles/prilosec]cheap Prilosec[/url]
cheap Propecia
[url=http://www.worldcat.org/profiles/propecia]cheap Propecia[/url]

Posted by: Oxwzekmc at July 10, 2008 07:24 AM

online Cipro
[url=http://www.linkedin.com/in/buycipro]online Cipro[/url]
online Ciprofloxacin
[url=http://www.linkedin.com/in/buyciprofloxacin]online Ciprofloxacin[/url]
online Citalopram
[url=http://www.linkedin.com/in/buycitalopram]online Citalopram[/url]
online Clomid
[url=http://www.linkedin.com/in/buyclomid]online Clomid[/url]
online Clonazepam
[url=http://www.linkedin.com/in/buyclonazepam]online Clonazepam[/url]
online Concerta
[url=http://www.linkedin.com/in/buyconcerta]online Concerta[/url]
online Coumadin
[url=http://www.linkedin.com/in/buycoumadin]online Coumadin[/url]
online Crestor
[url=http://www.linkedin.com/in/buycrestor]online Crestor[/url]
online Cymbalta
[url=http://www.linkedin.com/in/buycymbalta]online Cymbalta[/url]
online Diazepam
[url=http://www.linkedin.com/in/buydiazepam]online Diazepam[/url]
online Doxycycline
[url=http://www.linkedin.com/in/buydoxycycline]online Doxycycline[/url]
online Effexor
[url=http://www.linkedin.com/in/buyeffexor]online Effexor[/url]
online Fioricet
[url=http://www.linkedin.com/in/buyfioricet]online Fioricet[/url]
online Folic+Acid
[url=http://www.linkedin.com/in/buyfolicAcid]online Folic+Acid[/url]
online Gabapentin
[url=http://www.linkedin.com/in/buygabapentin]online Gabapentin[/url]

Posted by: Chqkakat at July 10, 2008 10:08 AM

generic Trazodone
[url=http://communities.vmware.com/people/trazodone]generic Trazodone[/url]
generic Ultracet
[url=http://communities.vmware.com/people/ultracet]generic Ultracet[/url]
generic Ultram
[url=http://communities.vmware.com/people/ultram]generic Ultram[/url]
generic Valium
[url=http://communities.vmware.com/people/valium]generic Valium[/url]
generic Valtrex
[url=http://communities.vmware.com/people/valtrex]generic Valtrex[/url]
generic Viagra
[url=http://communities.vmware.com/people/viagra]generic Viagra[/url]
generic Vicodin
[url=http://communities.vmware.com/people/vicodin]generic Vicodin[/url]
generic Voltaren
[url=http://communities.vmware.com/people/voltaren]generic Voltaren[/url]
generic Vioxx
[url=http://communities.vmware.com/people/vioxx]generic Vioxx[/url]
generic Vytorin
[url=http://communities.vmware.com/people/vytorin]generic Vytorin[/url]
generic Wellbutrin
[url=http://communities.vmware.com/people/wellbutrin]generic Wellbutrin[/url]
generic Xanax
[url=http://communities.vmware.com/people/xanax]generic Xanax[/url]
generic Xenical
[url=http://communities.vmware.com/people/xenical]generic Xenical[/url]
generic Yasmin
[url=http://communities.vmware.com/people/yasmin]generic Yasmin[/url]
generic Yaz
[url=http://communities.vmware.com/people/yaz]generic Yaz[/url]

Posted by: Rgjihwxy at July 10, 2008 10:31 PM

Cheap Trazodone
[url=http://www.bebo.com/buytrazodoneonline]Cheap Trazodone[/url]
Cheap Ultracet
[url=http://www.bebo.com/buyultracetonline]Cheap Ultracet[/url]
Cheap Ultram
[url=http://www.bebo.com/buyultramonline]Cheap Ultram[/url]
Cheap Valium
[url=http://www.bebo.com/buyvaliumonline]Cheap Valium[/url]
Cheap Valtrex
[url=http://www.bebo.com/buyvaltrexonline]Cheap Valtrex[/url]
Cheap Viagra
[url=http://www.bebo.com/buyviagraonline]Cheap Viagra[/url]
Cheap Vicodin
[url=http://www.bebo.com/buyvicodinonline]Cheap Vicodin[/url]
Cheap Voltaren
[url=http://www.bebo.com/buyvoltarenonline]Cheap Voltaren[/url]
Cheap Vioxx
[url=http://www.bebo.com/buyvioxxonline]Cheap Vioxx[/url]
Cheap Vytorin
[url=http://www.bebo.com/buyvytorinonline]Cheap Vytorin[/url]
Cheap Wellbutrin
[url=http://www.bebo.com/buywellbutrinonline]Cheap Wellbutrin[/url]
Cheap Xanax
[url=http://www.bebo.com/buyxanaxonline]Cheap Xanax[/url]
Cheap Xenical
[url=http://www.bebo.com/buyxenicalonline]Cheap Xenical[/url]
Cheap Yasmin
[url=http://www.bebo.com/buyyasminonline]Cheap Yasmin[/url]
Cheap Yaz
[url=http://www.bebo.com/buyyazonline]Cheap Yaz[/url]

Posted by: Xsrudykp at July 11, 2008 08:38 AM

Online Vytorin
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426433263]Online Vytorin[/url]
Online Xanax
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426431411]Online Xanax[/url]
Online Zithromax
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426429422]Online Zithromax[/url]
Online Clomid
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426427709]Online Clomid[/url]
Online Genace
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426425891]Online Genace[/url]
Online Methadone
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426424156]Online Methadone[/url]
Online Crestor
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426422528]Online Crestor[/url]
Online Ativan
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426420368]Online Ativan[/url]
Online Zyprexa
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426418693]Online Zyprexa[/url]
Online Wellbutrin
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426416851]Online Wellbutrin[/url]
Online Herceptin
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426414887]Online Herceptin[/url]
Online Valium
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426413338]Online Valium[/url]
Online Naproxen
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426411824]Online Naproxen[/url]
Online Benadryl
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426407509]Online Benadryl[/url]
Online Cipro
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426405996]Online Cipro[/url]

Posted by: Ckdvqckq at July 11, 2008 11:40 AM

Order Trazodone
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426552713]Order Trazodone[/url]
Order Suboxone
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426550964]Order Suboxone[/url]
Order Norvasc
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426549301]Order Norvasc[/url]
Order Morphine
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426547619]Order Morphine[/url]
Order Oxycodone
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426545751]Order Oxycodone[/url]
Order Yaz
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426544029]Order Yaz[/url]
Order Metronidazole
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426542139]Order Metronidazole[/url]
Order Gabapentin
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426540283]Order Gabapentin[/url]
Order Vioxx
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426538655]Order Vioxx[/url]
Order Magnesium
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426536984]Order Magnesium[/url]
Order Celebrex
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426534962]Order Celebrex[/url]
Order Testosterone
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426530604]Order Testosterone[/url]
Order Zetia
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426528713]Order Zetia[/url]
Order Klonopin
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426527058]Order Klonopin[/url]
Order Cymbalta
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426525469]Order Cymbalta[/url]

Posted by: Moukblag at July 11, 2008 08:54 PM

Online Vytorin
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426433263]Online Vytorin[/url]
Online Xanax
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426431411]Online Xanax[/url]
Online Zithromax
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426429422]Online Zithromax[/url]
Online Clomid
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426427709]Online Clomid[/url]
Online Genace
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426425891]Online Genace[/url]
Online Methadone
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426424156]Online Methadone[/url]
Online Crestor
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426422528]Online Crestor[/url]
Online Ativan
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426420368]Online Ativan[/url]
Online Zyprexa
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426418693]Online Zyprexa[/url]
Online Wellbutrin
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426416851]Online Wellbutrin[/url]
Online Herceptin
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426414887]Online Herceptin[/url]
Online Valium
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426413338]Online Valium[/url]
Online Naproxen
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426411824]Online Naproxen[/url]
Online Benadryl
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426407509]Online Benadryl[/url]
Online Cipro
[url=http://www.bebo.com/BlogView.jsp?MemberId=7426233129&BlogId=7426405996]Online Cipro[/url]

Posted by: Cxduplco at July 11, 2008 11:23 PM

Thanks. Very interesting article. | buy tramadol online

Posted by: adam at August 29, 2008 05:39 PM

Hi!, порно фото трансов, [url="http://ruprn.1stfreehosting.com/porno-foto-transov.html"]порно фото трансов[/url], http://ruprn.1stfreehosting.com/porno-foto-transov.html порно фото трансов, >:-DDD,

Posted by: Jpdygwgc at September 19, 2008 01:46 PM

Hex Bolt, Hex Bolt Supplier, Hex Bolt Manufacture, hex, bolt, Windsor Hex Bolt, Hex Bolt, India Hex Bolts, Manufacture Hax Bolt Supplier, Hex Bolt Exporter,Crown Screw, fasteners, screws, Crown Screw and Bolt, Crown, nuts and bolts, bolt bus, banjo bolts, crown bolt
hexboltindia@gmail.com

Posted by: windsor exports at October 21, 2008 08:02 AM

apygcpr, All kinds of farm sex, apygcpr, [url=http://www.mybloglog.com/buzz/community/farmsex/]All kinds of farm sex[/url], apygcpr, Virgin Sex Great, apygcpr, [url=http://www.mybloglog.com/buzz/community/virginsex/]Virgin Sex Great[/url], apygcpr, outdoor sex, apygcpr, [url=http://www.mybloglog.com/buzz/community/outdoorsex/]outdoor sex[/url], apygcpr, Discount drunk sex, apygcpr, [url=http://www.mybloglog.com/buzz/community/drunksex/]Discount drunk sex[/url], apygcpr, ebony sex, apygcpr, [url=http://www.mybloglog.com/buzz/community/ebonysex/]ebony sex[/url], apygcpr, girls having sex, apygcpr, [url=http://www.mybloglog.com/buzz/community/girlshavingsex/]girls having sex[/url], apygcpr, Great sex oasis, apygcpr, [url=http://www.mybloglog.com/buzz/community/sexoasishere/]Great sex oasis[/url], apygcpr, Real disney porn, apygcpr, [url=http://www.mybloglog.com/buzz/community/disneyporn/]Real disney porn[/url], apygcpr, Greatest porn eskimo, apygcpr, [url=http://www.mybloglog.com/buzz/community/porneskimo/]Greatest porn eskimo[/url], apygcpr, Vintage Porn Yeah, apygcpr, [url=http://www.mybloglog.com/buzz/community/vintageporn/]Vintage Porn Yeah[/url] apygcpr

Posted by: Farm Sex Online at November 15, 2008 03:46 AM

http://channel-game.freehostia.de/index21.html Disneychannle Game Com Disney Haunted Mansion Game http://channel-game.freehostia.de/index23.html Disney Princess Birthday Party Games Disneychannelgames Thatsoraven http://channel-game.freehostia.de/index25.html Disney Game Web Site All Disney Games

Posted by: ftxdwfo at December 1, 2008 03:59 AM

http://disney-game.freehostguy.com/index5.html Activitieson Disney Fun Game Line Disney Dinosaur Game http://disney-game.freehostguy.com/index7.html Channel Disney Ever First Game Disney Online Toddler Game http://disney-game.freehostguy.com/index9.html Channel Disney Disney Game Go Disney Stanley Game

Posted by: fnytbp at December 3, 2008 03:58 AM
Post a comment









Remember personal info?