What are Access Modifiers in C#?
In C# there are 5 different types of Access Modifiers.
The public type or member can be accessed by any other code in the same assembly or another assembly that references it.
The type or member can only be accessed by code in the same class or struct.
The type or member can only be accessed by code in the same class or struct, or in a derived class.
The type or member can be accessed by any code in the same assembly, but not from another assembly.
The type or member can be accessed by any code in the same assembly, or by any derived class in another assembly.
What are Access Modifiers used for?
Access Modifiers are used to control the accessibilty of types and members with in the types.
Can you use all access modifiers for all types?
No, Not all access modifiers can be used by all types or members in all contexts, and in some cases the accessibility of a type member is constrained by the accessibility of its containing type.
Can derived classes have greater accessibility than their base types?
No, Derived classes cannot have greater accessibility than their base types. For example the following code is illegal.
internal class InternalBaseClass
public void Print()
Console.WriteLine("I am a Base Class Method");
public class PublicDerivedClass : InternalBaseClass
public static void Main()
Console.WriteLine("I am a Public Derived Class Method");
When you compile the above code an error will be generated stating "Inconsistent accessibility: base class InternalBaseClass is less accessible than class PublicDerivedClass".To make this simple, you cannot have a public class B that derives from an internal class A. If this were allowed, it would have the effect of making A public, because all protected or internal members of A are accessible from the derived class.
Is the following code legal?
private class Test
public static void Main()
No, a compile time error will be generated stating "Namespace elements cannot be explicitly declared as private, protected, or protected internal"
Can you declare struct members as protected?
No, struct members cannot be declared protected. This is because structs do not support inheritance.
Can the accessibility of a type member be greater than the accessibility of its containing type?
No, the accessibility of a type member can never be greater than the accessibility of its containing type. For example, a public method declared in an internal class has only internal accessibility.
Can destructors have access modifiers?
No, destructors cannot have access modifiers.
What does protected internal access modifier mean?
The protected internal access means protected OR internal, not protected AND internal. In simple terms, a protected internal member is accessible from any class in the same assembly, including derived classes. To limit accessibility to only derived classes in the same assembly, declare the class itself internal, and declare its members as protected.
What is the default access modifier for a class,struct and an interface declared directly with a namespace?
Will the following code compile?
public void Save();
No, you cannot specify access modifer for an interface member. Interface members are always public.
Can you specify an access modifier for an enumeration?
Enumeration members are always public, and no access modifiers can be specified.