- عبارة عن C# Keywords بتساعدني اني اعمل Indicate the accessibility scope
- أنا جوا ال Namespace بكتب أربع حاجات: Class - Interface (Reference Types) || Struct - Enum (Value Type)
وبرضو جوا الحاجات دي بيبقا فيه حاجات تانية زي فانكشنز او متغيرات وهكذامحتاج أعرف الحاجات دي هتبقا Accessible لحد فين بالظبط سواء جوا الـLibrary بس ولا لو حد استخدم الـLibrary في بروجكت تاني
Access Modifiers
All
Access Modifier | Inside Class | In Same Namespace | Inherited Classs | Another Class |
---|---|---|---|---|
Public | Yes | Yes | Yes | Yes |
Private | Yes | No | No | No |
Protected | Yes | No | Yes | No |
Internal | Yes | Yes | No | No |
Protected Internal | Yes | Yes | Yes | No |
Private Protected | Yes | No | Yes (in same Library) | No |
For every
Inside it | Valid Access Modifiers | |
---|---|---|
Namespace | Class, Struct, Interface, Enum | Internal (Default), Public |
Class | Attributes, Properties, Function, Event | All Access Modifiers (Default → Private) |
Struct | Attributes, Properties, Function, Event | Private (Default), Internal, Public |
Interface | Signature for Property, Signature for Method, Default Implemented Method | Public (Default) |
Enums | Labels |
شرح نظري ومثال لكل Access Modifier:
-
Public:
- يمكن الوصول إليها من أي مكان في البرنامج.
- مثال:
public class MyClass { public int myVar = 5; } class Program { static void Main() { MyClass obj = new MyClass(); Console.WriteLine(obj.myVar); } }
-
Private:
- يمكن الوصول إليها فقط داخل نفس الكلاس.
- الـ Member بيبقا عليه شكل قفل
- مش بيبقا متاح برا الـ Scope اللي انا فيه سواء Class أو Struct
- مثال:
public class MyClass { private int myVar = 5; public void ShowVar() { Console.WriteLine(myVar); // يمكن الوصول إليها داخل نفس الكلاس } } class Program { static void Main() { MyClass obj = new MyClass(); obj.ShowVar(); // obj.myVar = 10; // ERROR } }
-
Protected:
- الوصول مسموح به داخل نفس الكلاس أو Inherited Classes.
- بيبقا عليها نجمة كدا
- أي حاجة من الحاجات اللي فيها الـ Protected مقدرش أستخدمهم غير جوا الـClass ومقدرش أستخدمهم في الـ Struct لأنه مش بيسابورت الوراثة
- بستخدمهم عشان الـ Cs Inheritance
- وان الحاجات الـ Private تتشاف برا ومكررهاش
- بالنسبة للكلاس اللي هي فيها بتبقا Private
- مثال:
public class MyClass { protected int myVar = 5; } public class DerivedClass : MyClass { public void ShowVar() { Console.WriteLine(myVar); } }
- مثال:
-
Internal:
- الوصول مسموح به فقط داخل نفس project/assembly (e.g., a compiled DLL or EXE) ، سواء كان الكلاس في نفس الـNamespace أو كلاس آخر.
- بيبقا عليه علامة قلب
- متقدرش تشاركه برا الـ Project بتاعك بمعنى انك لو عملت Library معينة فدي Project تقدر جواها تستخدم الـ Member لو Internal إنما لو استدعيته جوا Project تاني مش هيرضى
- مثال:
internal class MyClass { internal int myVar = 5; } class Program { static void Main() { MyClass obj = new MyClass(); Console.WriteLine(obj.myVar); // In Same Assembly (Project) } }
-
Protected Internal:
- الوصول مسموح به داخل Assembly أو من خلال Inherited Classes.
- Within the same assembly (like
internal
), OR - From derived classes (like
protected
), even in external assemblies. - بالنسبة للكلاس اللي هي فيها بتبقا Private
- مثال:
public class MyClass { protected internal int myVar = 5; } public class DerivedClass : MyClass { public void ShowVar() { Console.WriteLine(myVar); // Inherited } }
-
Private Protected:
- الوصول مسموح به داخل Assembly و من خلال Inherited Classes.
- Within the same assembly, AND
- From derived classes in that assembly.
- بالنسبة للكلاس اللي هي فيها بتبقا Internal
- مثال:
public class MyClass { private protected int myVar = 5; } public class DerivedClass : MyClass { public void ShowVar() { Console.WriteLine(myVar); // Inherited class + Same Assembly } }
Example
// Library: Common
// Class: TypeA
public class TypeA
{
private protected int X; // Private
/*protected*/ int Y; // Private
internal protected int Z; // Internal
}
// Class: TypeB - in same Library
internal class TypeB : TypeA
{
public TypeB()
{
/*
* X is Private
* Y is Private
* Z is Internal
*/
}
}
// Library: AnotherLib
// Class: TypeB - in another Library
internal class TypeB : TypeA
{
public TypeB()
{
/*
* X is NOT Inherited
* Y is Private
* Z is Private
*/
}
}
Inside Namespace
بنقدر نكتب جوا ال Namespace أربع حاجات: 7. Cs Class 8. Cs Struct stands for structure 9. Cs Interface 10. Cs Enums
معنديش Access Modifiers غير اتنين جوا ال Namespace: 11. Internal (Default) 12. Public
قبل ما تحاول تستخدم أي class أو حاجة موجود في Library تانية لازم إني أضيف ال Library دي للـDependences للبروجكت Right click at project → Build dependencies → Project dependencies Add project reference وبعد كدا أعمل using للـLibrary دي
Internal
- قولنا اننا لو مديناش الحاجة Access Modifier فهو طبيعي هيبقا Internal
- معناها إني هي ليها Access بس جوا ال Library اللي انا فيها ولو حاولت أعملها Access جوا Library أو بروجكت تاني مش هينفع ومش هقدر أوصله
- لو حاولت أوصل ل class مثلًا في project مختلف هيديلي error
- الحل إنك تعملها public عشان تقدر توصلها في أي Project وأي Library مختلفة
Inside Class or Struct
بنقدر نكتب جواهم: 13. Attributes (Fields) → Member Variables 14. Cs Properties (Full Property, Automatic Property, Indexer → Special) 15. Cs Function (Constructor, Getter Setter, Method) 16. Cs Event
متاح 3 Access Modifiers جوا الـ Struct: (نفس بتاع الـ Name Space وهنزود الـ Private) 17. Private (Default) 18. Internal 19. Public
جوا الـ Class متاح كل الستة: 20. Private (Default) 21. Private Protected 22. Protected 23. Internal 24. Internal Protected 25. Public
Default
الـ Default فيهم الإتنين هو Private
Inside Interface
نقدر نكتب جواها: 26. Signature for Property (بحدد شكلها بس هيبقا عامل إزاي)
public int Salary {get; set;}
// In interface called Signature for Property
// In class or Struct called Auto Property
In Class or Struct ⇒Automatic Property
- Signature for Method (مبنكتبش برامتر)
public void MyFun();
- Default Implemented Method (فانكشن كاملة) ⇒ C# 8.0 Feature (.NET Core 3.1)
public void Print()
{
Console.WriteLine("Hello Default Implemented");
}
الـ Method بتتكون من جزئين (Signature - Body): الـ Signature اللي هو اسمها والـ Parameters اللي بتستقبلها وكدا
Default
الـ Default فيها هو Public لأن بكتب فيها signatures فمحتاج أوصل للـ Implementation
Inside Enums
بنكتب جواها Labels