C# Interview Questions on Access Modifiers
What are Access Modifiers in C#?
In C# there are 5 different types of Access Modifiers.
Public
The public type or member can be accessed by any other code in the same assembly or another assembly that references it.
Private
The type or member can only be accessed by code in the same class or struct.
Protected
The type or member can only be accessed by code in the same class or struct, or in a derived class.
Internal
The type or member can be accessed by any code in the same assembly, but not from another assembly.
Protected Internal
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.
using System;
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?
using System;
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?
internal
Will the following code compile?
using System;
interface IExampleInterface
{
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.
Subscribe to:
Post Comments (Atom)
Can the accessibility of a type member be greater than the accessibility of its containing type?
ReplyDeleteI don't think this answer is 100% accurate.
One could define a class:
internal class ClassA : IClassA
{
public bool MethodA()
{
return true;
}
}
public interface IClassA
{
bool MethodA();
}
Then a third class could return a ClassA as it's IClassA interface. The MethodA() is visible because of the interface.
Re. Though it doesn't give any error and MethodA is visible because of the interface. But It doesn't make sense when we talk along assemblies. Although the method is public, but it won't be accessible to the another assembly as its container type i.e class is internal and won't be accessible in the another assembly.
DeleteI am not good in explaining things, but hope you get my point
difference between public/private/protected/internal/protected internal with abstract class(may be any class like static , virtual , sealed) in c#. please give me a suitable example.
ReplyDeleteNice Article, If there is tutorial as well , it would be really great
ReplyDelete