[{"data":1,"prerenderedAt":575},["ShallowReactive",2],{"blog:2010:enums-better-syntax-improved-performance-and-tryparse-in-net-3-5":3,"blogMore-Development":561,"comments-enums-better-syntax-improved-performance-and-tryparse-in-net-3-5":574},{"id":4,"title":5,"body":6,"category":542,"commentCount":543,"date":544,"description":545,"excerpt":546,"extension":547,"filenames":548,"hidden":549,"image":548,"meta":550,"minutes":174,"navigation":551,"path":552,"seo":553,"showCategory":548,"stem":554,"tags":555,"updated":548,"url":558,"wordCount":559,"__hash__":560},"content\u002Fblog\u002F2010\u002Fenums-better-syntax-improved-performance-and-tryparse-in-net-3-5.md","Enums: Better syntax, improved performance and TryParse in NET 3.5",{"type":7,"value":8,"toc":534},"minimark",[9,25,28,51,61,64,72,275,281,408,415,460,464,478,482,524,530],[10,11,12,13,17,18,21,22,24],"p",{},"Recently I needed to map external data into in-memory objects. In such scenarios the ",[14,15,16],"code",{},"TryParse"," methods of Int and String are useful but where is ",[14,19,20],{},"Enum.TryParse","? ",[14,23,16],{}," exists in .NET 4.0 but like a lot of people I’m on .NET 3.5.",[10,26,27],{},"A quick look at Enum left me scratching my head.",[29,30,31,35,42,45],"ul",{},[32,33,34],"li",{},"Why didn’t enums receive the generic love that collections received in .NET 2.0?",[32,36,37,38,41],{},"Why do I have to pass in ",[14,39,40],{},"typeof(MyEnum)"," everywhere?",[32,43,44],{},"Why do I have to the cast results back to MyEnum all the time?",[32,46,47,48,50],{},"Can I write ",[14,49,16],{}," and still make it quick, i.e. without try\u002Fcatch?",[10,52,53,54,57,58,60],{},"I found myself with a small class, ",[14,55,56],{},"Enum\u003CT>"," that solved all these. I was surprised when I put it through some benchmarks that also showed the various methods were significantly faster when processing a lot of documents. Even my ",[14,59,16],{}," was quicker than that in .NET 4.0.",[10,62,63],{},"While there is some small memory overhead with the initial class (about 5KB for the first, a few KB per enum after) the performance benefits came as an additional bonus on top of the nicer syntax.",[65,66,68,69],"h2",{"id":67},"before-with-systemenum","Before with ",[14,70,71],{},"System.Enum",[73,74,79],"pre",{"className":75,"code":76,"language":77,"meta":78,"style":78},"language-csharp shiki shiki-themes everforest-light dracula","var getValues = Enum.GetValues(typeof(MyEnumbers)).OfType();\nvar parse = (MyEnumbers)Enum.Parse(typeof(MyEnumbers), \"Seven\");\nvar isDefined = Enum.IsDefined(typeof(MyEnumbers), 3);\nvar getName = Enum.GetName(typeof(MyEnumbers), MyEnumbers.Eight);\nMyEnumbers tryParse;\nEnum.TryParse\u003CMyEnumbers>(\"Zero\", out tryParse);\n","csharp","",[14,80,81,127,172,203,235,243],{"__ignoreMap":78},[82,83,86,90,94,98,101,105,108,112,114,118,121,124],"span",{"class":84,"line":85},"line",1,[82,87,89],{"class":88},"sXAHl","var",[82,91,93],{"class":92},"s6Vpi"," getValues ",[82,95,97],{"class":96},"s9HRq","=",[82,99,100],{"class":92}," Enum.",[82,102,104],{"class":103},"sS4Kt","GetValues",[82,106,107],{"class":92},"(",[82,109,111],{"class":110},"smiwp","typeof",[82,113,107],{"class":92},[82,115,117],{"class":116},"snuxY","MyEnumbers",[82,119,120],{"class":92},")).",[82,122,123],{"class":103},"OfType",[82,125,126],{"class":92},"();\n",[82,128,130,132,135,137,140,142,145,148,150,152,154,156,159,163,167,169],{"class":84,"line":129},2,[82,131,89],{"class":88},[82,133,134],{"class":92}," parse ",[82,136,97],{"class":96},[82,138,139],{"class":92}," (",[82,141,117],{"class":116},[82,143,144],{"class":92},")Enum.",[82,146,147],{"class":103},"Parse",[82,149,107],{"class":92},[82,151,111],{"class":110},[82,153,107],{"class":92},[82,155,117],{"class":116},[82,157,158],{"class":92},"), ",[82,160,162],{"class":161},"sciFF","\"",[82,164,166],{"class":165},"sJQOs","Seven",[82,168,162],{"class":161},[82,170,171],{"class":92},");\n",[82,173,175,177,180,182,184,187,189,191,193,195,197,201],{"class":84,"line":174},3,[82,176,89],{"class":88},[82,178,179],{"class":92}," isDefined ",[82,181,97],{"class":96},[82,183,100],{"class":92},[82,185,186],{"class":103},"IsDefined",[82,188,107],{"class":92},[82,190,111],{"class":110},[82,192,107],{"class":92},[82,194,117],{"class":116},[82,196,158],{"class":92},[82,198,200],{"class":199},"s3Ipq","3",[82,202,171],{"class":92},[82,204,206,208,211,213,215,218,220,222,224,226,229,233],{"class":84,"line":205},4,[82,207,89],{"class":88},[82,209,210],{"class":92}," getName ",[82,212,97],{"class":96},[82,214,100],{"class":92},[82,216,217],{"class":103},"GetName",[82,219,107],{"class":92},[82,221,111],{"class":110},[82,223,107],{"class":92},[82,225,117],{"class":116},[82,227,228],{"class":92},"), MyEnumbers.",[82,230,232],{"class":231},"sSKRk","Eight",[82,234,171],{"class":92},[82,236,238,240],{"class":84,"line":237},5,[82,239,117],{"class":116},[82,241,242],{"class":92}," tryParse;\n",[82,244,246,249,251,254,256,259,261,264,266,269,272],{"class":84,"line":245},6,[82,247,248],{"class":92},"Enum.",[82,250,16],{"class":103},[82,252,253],{"class":92},"\u003C",[82,255,117],{"class":116},[82,257,258],{"class":92},">(",[82,260,162],{"class":161},[82,262,263],{"class":165},"Zero",[82,265,162],{"class":161},[82,267,268],{"class":92},", ",[82,270,271],{"class":96},"out",[82,273,274],{"class":92}," tryParse);\n",[65,276,278,279],{"id":277},"after-with-enumt","After with ",[14,280,56],{},[73,282,284],{"className":75,"code":283,"language":77,"meta":78,"style":78},"var getValues = Enum\u003CMyEnumbers>.GetValues();\nvar parse = Enum\u003CMyEnumbers>.Parse(\"Seven\");\nvar isDefined = Enum\u003CMyEnumbers>.IsDefined(MyEnumbers.Eight);\nvar getName = Enum\u003CMyEnumbers>.GetName(MyEnumbers.Eight);\nMyEnumbers tryParse;\nEnum\u003CMyEnumbers>.TryParse(\"Zero\", out tryParse);\n",[14,285,286,306,332,355,377,383],{"__ignoreMap":78},[82,287,288,290,292,294,297,299,302,304],{"class":84,"line":85},[82,289,89],{"class":88},[82,291,93],{"class":92},[82,293,97],{"class":96},[82,295,296],{"class":92}," Enum\u003C",[82,298,117],{"class":116},[82,300,301],{"class":92},">.",[82,303,104],{"class":103},[82,305,126],{"class":92},[82,307,308,310,312,314,316,318,320,322,324,326,328,330],{"class":84,"line":129},[82,309,89],{"class":88},[82,311,134],{"class":92},[82,313,97],{"class":96},[82,315,296],{"class":92},[82,317,117],{"class":116},[82,319,301],{"class":92},[82,321,147],{"class":103},[82,323,107],{"class":92},[82,325,162],{"class":161},[82,327,166],{"class":165},[82,329,162],{"class":161},[82,331,171],{"class":92},[82,333,334,336,338,340,342,344,346,348,351,353],{"class":84,"line":174},[82,335,89],{"class":88},[82,337,179],{"class":92},[82,339,97],{"class":96},[82,341,296],{"class":92},[82,343,117],{"class":116},[82,345,301],{"class":92},[82,347,186],{"class":103},[82,349,350],{"class":92},"(MyEnumbers.",[82,352,232],{"class":231},[82,354,171],{"class":92},[82,356,357,359,361,363,365,367,369,371,373,375],{"class":84,"line":205},[82,358,89],{"class":88},[82,360,210],{"class":92},[82,362,97],{"class":96},[82,364,296],{"class":92},[82,366,117],{"class":116},[82,368,301],{"class":92},[82,370,217],{"class":103},[82,372,350],{"class":92},[82,374,232],{"class":231},[82,376,171],{"class":92},[82,378,379,381],{"class":84,"line":237},[82,380,117],{"class":116},[82,382,242],{"class":92},[82,384,385,388,390,392,394,396,398,400,402,404,406],{"class":84,"line":245},[82,386,387],{"class":92},"Enum\u003C",[82,389,117],{"class":116},[82,391,301],{"class":92},[82,393,16],{"class":103},[82,395,107],{"class":92},[82,397,162],{"class":161},[82,399,263],{"class":165},[82,401,162],{"class":161},[82,403,268],{"class":92},[82,405,271],{"class":96},[82,407,274],{"class":92},[10,409,410,411,414],{},"I also added a useful ",[14,412,413],{},"ParseOrNull"," method that lets you either return null or default using the coalesce so you don’t have to mess around with out parameters, e.g.",[73,416,418],{"className":75,"code":417,"language":77,"meta":78,"style":78},"MyEnumbers myValue = Enum\u003CMyEnumbers>.ParseOrNull(\"Nine-teen\") ?? MyEnumbers.Zero;\n",[14,419,420],{"__ignoreMap":78},[82,421,422,424,427,429,431,433,435,437,439,441,444,446,449,452,455,457],{"class":84,"line":85},[82,423,117],{"class":116},[82,425,426],{"class":92}," myValue ",[82,428,97],{"class":96},[82,430,296],{"class":92},[82,432,117],{"class":116},[82,434,301],{"class":92},[82,436,413],{"class":103},[82,438,107],{"class":92},[82,440,162],{"class":161},[82,442,443],{"class":165},"Nine-teen",[82,445,162],{"class":161},[82,447,448],{"class":92},") ",[82,450,451],{"class":96},"??",[82,453,454],{"class":92}," MyEnumbers.",[82,456,263],{"class":231},[82,458,459],{"class":92},";\n",[65,461,463],{"id":462},"the-class","The class",[465,466,467],"blockquote",{},[10,468,469,470],{},"GitHub has the ",[471,472,474,475],"a",{"href":473},"https:\u002F\u002Fgithub.com\u002Fdamieng\u002FDamienGKit\u002Fblob\u002Fmaster\u002FCSharp\u002FDamienG.Library\u002FSystem\u002FEnumT.cs","latest version of ",[14,476,477],{},"EnumT.cs",[65,479,481],{"id":480},"usage-notes","Usage notes",[29,483,484,487,490,497,514,521],{},[32,485,486],{},"This class as-is only works for Enum’s backed by an int (the default) although you could modify the class to use longs etc.",[32,488,489],{},"I doubt very much this class is of much use for flag enums",[32,491,492,493,496],{},"Casting from long can be done using the ",[14,494,495],{},"CastOrNull"," function instead of just putting (T)",[32,498,499,501,502,505,506,509,510,513],{},[14,500,217],{}," is actually much quicker than ",[14,503,504],{},"ToString"," on the Enum… (e.g.",[14,507,508],{}," Enum\u003CMyEnumbers>.GetName(a)"," over ",[14,511,512],{},"a.ToString()",")",[32,515,516,517,520],{},"IsDefined doesn’t take an object like Enum and instead has three overloads which map to the actual types ",[14,518,519],{},"Enum.IsDefined"," can deal with and saves run-time lookup",[32,522,523],{},"Some of the method may not behave exactly like their Enum counterparts in terms of exception messages, nulls etc.",[10,525,526],{},[527,528,529],"em",{},"[)amien",[531,532,533],"style",{},"html pre.shiki code .sXAHl, html code.shiki .sXAHl{--shiki-default:#3A94C5;--shiki-dark:#FF79C6}html pre.shiki code .s6Vpi, html code.shiki .s6Vpi{--shiki-default:#5C6A72;--shiki-dark:#F8F8F2}html pre.shiki code .s9HRq, html code.shiki .s9HRq{--shiki-default:#F57D26;--shiki-dark:#FF79C6}html pre.shiki code .sS4Kt, html code.shiki .sS4Kt{--shiki-default:#8DA101;--shiki-dark:#50FA7B}html pre.shiki code .smiwp, html code.shiki .smiwp{--shiki-default:#F85552;--shiki-dark:#FF79C6}html pre.shiki code .snuxY, html code.shiki .snuxY{--shiki-default:#3A94C5;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sciFF, html code.shiki .sciFF{--shiki-default:#8DA101;--shiki-dark:#E9F284}html pre.shiki code .sJQOs, html code.shiki .sJQOs{--shiki-default:#8DA101;--shiki-dark:#F1FA8C}html pre.shiki code .s3Ipq, html code.shiki .s3Ipq{--shiki-default:#DF69BA;--shiki-dark:#BD93F9}html pre.shiki code .sSKRk, html code.shiki .sSKRk{--shiki-default:#35A77C;--shiki-dark:#F8F8F2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":78,"searchDepth":129,"depth":129,"links":535},[536,538,540,541],{"id":67,"depth":129,"text":537},"Before with System.Enum",{"id":277,"depth":129,"text":539},"After with Enum\u003CT>",{"id":462,"depth":129,"text":463},{"id":480,"depth":129,"text":481},"Development",10,"2010-10-17T21:58:18+00:00","Recently I needed to map external data into in-memory objects. In such scenarios the TryParse methods of Int and String are useful but where is Enum.TryParse? TryParse exists in .NET 4.0 but like a lot of people I’m on .NET 3.5.","[object Object]","md",null,false,{},true,"\u002Fblog\u002F2010\u002Fenums-better-syntax-improved-performance-and-tryparse-in-net-3-5",{"title":5,"description":545},"blog\u002F2010\u002Fenums-better-syntax-improved-performance-and-tryparse-in-net-3-5",[556,557],".NET","C#","\u002Fblog\u002F2010\u002Fenums-better-syntax-improved-performance-and-tryparse-in-net-3-5\u002F",571,"G-Oax3aTB3sG1MbhYPy7WNjFn4tdNqyzoQtUXmszKLE",[562,566,570],{"title":563,"date":564,"url":565},"Transactions in the MongoDB EF Core Provider","2025-10-25","\u002Fblog\u002F2025\u002Fmongodb-explicit-transactions\u002F",{"title":567,"date":568,"url":569},"Queryable Encryption with the MongoDB EF Core Provider","2025-09-22","\u002Fblog\u002F2025\u002Fmongodb-queryable-encryption\u002F",{"title":571,"date":572,"url":573},"Lazy Loading with EF Core Proxies","2025-04-02","\u002Fblog\u002F2025\u002Fef-proxies\u002F",[],1780900526867]