This question is for interest sake. I'm working with a third-party library and came across the following documentation on a CMS.Security.Dummy
class:
DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping entire namespace under .NET 4.0.
Does anybody know, or can anybody speculate why .NET 4 would drop the namespace if the dummy class were removed?
Because .NET 4 is explicitly named in the source code comment, I assume previous C# versions exhibit behaviour that do not require this dummy class. That's purely speculative though.
Screen shot
Decompiled Source Code
#region Assembly CMS.SettingsProvider.dll, v4.0.30319 // ...\solution\wwwroot\Bin\CMS.SettingsProvider.dll #endregion using System; namespace CMS.Security { // Summary: // DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping // entire namespace under .NET 4.0. public class Dummy { // Summary: // DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping // entire namespace under .NET 4.0. public Dummy(); } }
Hepatitis C is a liver infection caused by the hepatitis C virus (HCV). Hepatitis C is spread through contact with blood from an infected person. Today, most people become infected with the hepatitis C virus by sharing needles or other equipment used to prepare and inject drugs.
3. Sometimes, the infection goes away on its own. Acute hepatitis is C is a short-term illness that occurs within the first six months after being exposed to the virus. Like the human papillomavirus (HPV), early acute hepatitis C can clear on its own without treatment; this happens about 25% of the time.
On average it takes about twenty years for significant liver scarring to develop. The symptoms experienced and the damage done to the liver vary dramatically from person to person. Some people will have few, if any, symptoms for many years.
The hepatitis C (HCV) window period is usually 4–10 weeks from the time of exposure. After 6 months , most people will have developed enough antibodies for an HCV test to detect. In rare cases, however, antibodies can take up to 9 months to develop.
A little-appreciated fact is that there is no such thing as a "namespace" from the point of view of the underlying CLR type system. Rather, it's just a convention that we say that a type that contains periods in its name is "a member of a namespace". Logically there is no difference at all between the legal code:
namespace N { class C {} }
and the psuedo-code:
class N.C {}
C# forces you to pretend this pleasant fiction is reality, but it is just a fiction -- from the perspective of the CLR type system, of course. From the perspective of the C# compiler, of course namespaces are "real". They just don't correspond to anything in metadata other than a portion of the name of a type.
In short: if you make an assembly with an "empty" namespace then the "namespace" doesn't exist at all in the compiled binary. A "namespace" only comes into existence when there is a type in the library that has periods in its name.
Now, why you would care about ensuring that an "empty" namespace has some presence in the binary form, I have no idea.
I assume previous C# versions exhibit behaviour that do not require this dummy class
Nope. Every version of C# since 1.0 throws away empty namespaces.
Given that the namespace doesn't contain any members (without that class), I'm not sure there's even the concept of a namespace at that point... nor would I expect it to be useful anyway.
I've just tried to reproduce this with the C# 2 compiler, and I can't see any trace of an empty namespace within the IL.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With