Link to home
Start Free TrialLog in
Avatar of officedog
officedog

asked on

Clarification on 'Internal' access modifier in c#

I have been revising for an upcoming test on .net/c# and would like to clarify something. I like to fully understand things before I 'tick' them off in my head.

So, within .net, we have the following access modifiers;

Public (no problem here)
Private (no problem here)
Protected (no problem)

However, I am a little confused with the 'internal' and then subsequent 'protected internal'

The MSDN explanation of 'internal' is "Access is limited to the current assembly."

Now,my understanding of an assembly is a collection of modules and resources compiled into an 'assembly' be that .exe or .dll

So based on this assumption, how can an internal modifier be limited to an assembly, based on this;

I have an 'assembly' in which i have various files, which contain my custom classes. If I declared an 'internal' value (int) in one of these classes, it will compile. If I then instantiated this class from another assembly (my ui), I can access it.

Now I do see that when you create an 'internal' class, then it is inaccessible from another assembly. So, what about the internal value (int). Am I basically breaking an unwritten rule by declaring my value (int) as internal or am I missing something completely.

Although not tested, I would assume the same is going to come up with protected internal to some degree.

Can anyone clarify this for me.



Avatar of Dmitry G
Dmitry G
Flag of New Zealand image

OK, from my experience.
I use internal modifier mainly for some methods is classes. This means I can access these methods only in the current project (which will be compiled into an assembly). The main reasoning to have these methods only inside the project E.g., I have a project for all my user controls. And, e.g., I have some specific MyTextBox that is used by some other controls, e.g. by MyComboBox. Outside the project I want to use both MyTextBox and MyComboBox. But some methods of the MyTextBox should be used by MyCombo, therefore I mark them as "internal. So, they look like "public" inside the project but not visible outside.
Protected internal is used to deny access to parts of a class' functionality to any descendant classes found in other applications. In other words, if I inherit a class with a protected internal method in another project - I should not see it.

Avatar of shadow77
shadow77

Private is restrictive; it only allows access by members of the class in which the variable or method is declared.

Public is non-restrictive; it allows access from anywhere.

Internal and Protected fall in between.  Internal is like "public, but only withing this assembly", while protected is like "public but only for the declaring class and its sub-classes"

Protected Internal means Protected or Internal, that is "public within this assembly or within this class and its sub-classes".
ASKER CERTIFIED SOLUTION
Avatar of Anurag Thakur
Anurag Thakur
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of officedog

ASKER

Great got it all now thanks. I think the biggest help was this statement from the page that ragi0017 linked.

'protected internal' does not mean protected *and* internal - it means protected *or* internal.  

Thanks all :)

Closed. Points awarded to ragi0017 and anarki_jimbel.