2
سطوح دسترسی (Access Modifiers) در سیشارپ مشخص میکنند که اعضای یک کلاس (مانند متغیرها و متدها) از کجا و چگونه قابل دسترسی هستند. در سیشارپ، پنج سطح دسترسی اصلی وجود دارد:
1- public:
اعضایی که با این سطح دسترسی تعریف میشوند، از همه جا قابل دسترسی هستند.
public class MyClass
{
public int MyProperty { }
}
2- private:
اعضایی که با این سطح دسترسی تعریف میشوند، فقط در داخل همان کلاس قابل دسترسی هستند.
public class MyClass
{
private int myField;
}
3- protected:
اعضایی که با این سطح دسترسی تعریف میشوند، فقط در داخل همان کلاس و کلاسهای مشتق شده از آن قابل دسترسی هستند.
public class MyClass
{
protected int myField;
}
4- internal:
اعضایی که با این سطح دسترسی تعریف میشوند، فقط در داخل همان اسمبلی (پروژه) قابل دسترسی هستند.
internal class MyClass
{
internal int MyProperty { }
}
5- protected internal:
اعضایی که با این سطح دسترسی تعریف میشوند، در داخل همان اسمبلی و همچنین در کلاسهای مشتق شده از آن قابل دسترسی هستند.
public class MyClass
{
protected internal int MyProperty { }
}
این سطوح دسترسی به شما کمک میکنند تا کنترل بیشتری بر روی نحوه دسترسی به اعضای کلاسها و امنیت دادهها داشته باشید.
آیا نیاز به توضیحات بیشتری در مورد هر یک از این سطوح دسترسی دارید؟ یا سوال دیگری در مورد سیشارپ دارید؟ خوشحال میشوم کمک کنم!
3
در سیشارپ، تفاوتهای مهمی بین اعضای static و نمونهسازی (instance) وجود دارد
1- دسترسی: اعضای static بدون نیاز به نمونهسازی قابل دسترسی هستند، در حالی که اعضای نمونه فقط از طریق یک شیء قابل دسترسی هستند.
2- حافظه: اعضای static تنها یک بار در حافظه بارگذاری میشوند و بین تمام نمونههای کلاس مشترک هستند. اما هر نمونه از کلاس، نسخهای جداگانه از اعضای نمونه دارد.
3- سازندهها: کلاسهای static نمیتوانند سازندههای نمونه داشته باشند، اما میتوانند سازندههای static داشته باشند که فقط یک بار اجرا میشوند.
4
نمونهسازی (Instantiation) در سیشارپ به فرآیند ایجاد یک شیء از روی یک کلاس گفته میشود. این فرآیند باعث میشود یک نمونه بر اساس ساختار کلاس مورد نظر در بخش Heap از حافظه ساخته شود و سپس آدرس آن نمونه در متغیری از جنس کلاس مورد نظر در Stack قرار گیرد.
برای نمونهسازی از یک کلاس، از کلمه کلیدی new استفاده میشود. در اینجا یک مثال ساده آورده شده است:
class Car
{
public string CarName;
public int CarSpeed;
public string CarModel;
}
و در کلاس Program
class Program
{
static void Main(string[] args)
{
Car car1 = new Car();
car1.CarName = "pride";
car1.CarSpeed = 100;
car1.CarModel = "1400";
Car car2 = new Car(); // car1 و car2
// جدا هستند و هیچ ربطی باهم ندارند
car2.CarName = "pykan";
car2.CarSpeed = 220;
car2.CarModel = "1388";
Console.WriteLine(car1.CarName + " " + car1.CarSpeed + " " + car1.CarModel);
Console.WriteLine(car2.CarName + " " + car2.CarSpeed + " " + car2.CarModel);
Console.ReadKey();
}
}
6
کلمه کلیدی this در سیشارپ به شیء جاری اشاره دارد و معمولاً برای تمایز بین اعضای کلاس و پارامترهای متد یا سازنده استفاده میشود.
فراخوانی سازنده دیگر از داخل یک سازنده میتوانید از this برای فراخوانی یک سازنده دیگر از داخل یک سازنده استفاده کنید
class Person
{
public string name;
public string family;
public string website;
public Person(string name, string family, string website)
{
this.name = name;
this.family = family;
this.website = website;
}
}
و در کلاس Program
class Program
{
static void Main(string[] args)
{
Person p1 = new Person("ali", "panahi", "www.google.com");
Person p2 = new Person("reza", "mohammadi", "www.yahoo.com");
Console.WriteLine($"name: {p1.name} family: {p1.family} website: {p1.website}");
Console.WriteLine($"name: {p2.name} family: {p2.family} website: {p2.website}");
Console.ReadKey();
}
7
یک برنامه حلقه که از کاربر بپرسیم چند تا پرسنل داریم و هر پرسنل اسم و فامیل و وب سایت پرسیده شود
class Person
{
public string name;
public string family;
public string website;
public Person(string name, string family, string website)
{
this.name = name;
this.family = family;
this.website = website;
}
}
و در کلاس Program
static void Main(string[] args)
{
Console.WriteLine("Please Enter Personal Number :");
int number = Convert.ToInt32(Console.ReadLine());
Person[] people = new Person[number];
for (int i = 0; i < number; i++)
{
Console.WriteLine($"Please Enter Person[{(i + 1)}] Name :");
string name = Console.ReadLine();
Console.WriteLine($"Please Enter Person[{(i + 1)}] Family :");
string family = Console.ReadLine();
Console.WriteLine($"Please Enter Person[{(i + 1)}] Web Site :");
string website = Console.ReadLine();
Person p = new Person(name, family, website);
people[i] = p;
}
Console.ForegroundColor = ConsoleColor.Green;
foreach (Person person in people)
{
Console.WriteLine($"Name : {person.name} Family : {person.family} WebSite : {person.website}");
}
Console.ResetColor();
Console.ReadKey();
}
8
در سیشارپ، سازندههای static و public هر کدام نقشها و ویژگیهای خاص خود را دارند.
class Program
{
static void Main(string[] args)
{
ali a1 = new ali();
ali a2 = new ali();
ali a3 = new ali();
ali a4 = new ali();
Console.ReadKey();
}
}
class ali
{
public ali()
{
Console.WriteLine("public Constructors.... ");
}
static ali()
{
Console.WriteLine("static Constructors.... ");
}
}
9
در اینجا تفاوتها و کاربردهای هر یک را بررسی میکنیم
تعریف: سازندههای public برای مقداردهی اولیه اعضای نمونه (instance) کلاس استفاده میشوند و میتوانند پارامتر بپذیرند.
سازندههای public
فراخوانی: این سازندهها هنگام ایجاد یک شیء جدید از کلاس فراخوانی میشوند.
سازندههای static
تعریف: سازندههای static برای مقداردهی اولیه اعضای static کلاس استفاده میشوند و نمیتوانند پارامتر بپذیرند.
فراخوانی: این سازندهها تنها یک بار و قبل از دسترسی به هر عضو static کلاس، به صورت خودکار توسط CLR (Common Language Runtime) فراخوانی میشوند.
تفاوتهای کلیدی
1- فراخوانی: سازندههای public هنگام ایجاد یک شیء جدید فراخوانی میشوند، در حالی که سازندههای static تنها یک بار و به صورت خودکار توسط CLR فراخوانی میشوند.
2- پارامترها: سازندههای public میتوانند پارامتر بپذیرند، اما سازندههای static نمیتوانند.
3- هدف: سازندههای public برای مقداردهی اولیه اعضای نمونه استفاده میشوند، در حالی که سازندههای static برای مقداردهی اولیه اعضایstatic کلاس استفاده میشوند.
10
ارثبری (Inheritance) یکی از اصول مهم برنامهنویسی شیءگرا (OOP) است که به شما اجازه میدهد تا یک کلاس جدید از یک کلاس موجود ایجاد کنید. در سیشارپ، این کار با استفاده از نماد : انجام میشود. کلاس جدید که به آن کلاس مشتق (Derived Class) گفته میشود، میتواند تمام ویژگیها و متدهای کلاس پایه (Base Class) را به ارث ببرد.
11
یک مثال
class parent
{
public static int Sum(int a, int b)
{
return a + b;
}
public static int minus(int a, int b)
{
return a - b;
}
}
class child : parent
{
public static int multiple(int a, int b)
{
return a * b;
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(child.Sum(10, 8));
Console.WriteLine(child.minus(10, 8));
Console.WriteLine(child.multiple(10, 8));
Console.ReadKey();
}
}
}
12
کپسولهسازی (Encapsulation) در سیشارپ یکی از اصول مهم برنامهنویسی شیءگرا است که به معنای محصور کردن دادهها و متدها در یک کلاس و جلوگیری از دسترسی مستقیم به جزئیات پیادهسازی آنها میباشد. این کار با استفاده از مشخصههای دسترسی (Access Modifiers) مانند private، public، protected و internal انجام میشود.
مثال ساده از کپسولهسازی:
using System;
namespace EncapsulationExample
{
class Person
{
// متغیرهای خصوصی
private string name;
private int age;
// متدهای عمومی برای دسترسی به متغیرهای خصوصی
public void SetName(string newName)
{
name = newName;
}
public string GetName()
{
return name;
}
public void SetAge(int newAge)
{
if (newAge > 0)
{
age = newAge;
}
}
public int GetAge()
{
return age;
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.SetName("Ali");
person.SetAge(25);
Console.WriteLine("Name: " + person.GetName());
Console.WriteLine("Age: " + person.GetAge());
}
}
}
در این مثال، متغیرهای name و age به صورت خصوصی (private) تعریف شدهاند و فقط از طریق متدهای عمومی (public) قابل دسترسی هستند. این روش به ما کمک میکند تا کنترل بیشتری بر روی دادهها داشته باشیم و از تغییرات ناخواسته جلوگیری کنیم.
13
کپسولهسازی (Encapsulation) در سیشارپ به معنای محصور کردن دادهها و متدها در یک کلاس و جلوگیری از دسترسی مستقیم به جزئیات پیادهسازی آنها است. برای این کار از متدهای get و set استفاده میشود که به ما اجازه میدهند تا به صورت کنترلشده به متغیرهای خصوصی دسترسی داشته باشیم.
مثال از کپسولهسازی با استفاده از get و set:
using System;
namespace EncapsulationExample
{
class Person
{
// متغیر خصوصی
private string name;
// متدهای get و set برای دسترسی به متغیر خصوصی
public string Name
{
get { return name; }
//زمان فراخوانی
set { name = value; }
// زمان مقدار دهی
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Ali"; // استفاده از set
Console.WriteLine("Name: " + person.Name); // استفاده از get
}
}
}
در این مثال، متغیر name به صورت خصوصی (private) تعریف شده است و فقط از طریق متدهای get و set قابل دسترسی است. این روش به ما کمک میکند تا کنترل بیشتری بر روی دادهها داشته باشیم و از تغییرات ناخواسته جلوگیری کنیم.