برنامه نویسی

مقدمه برنامه نویسی -جهت گیری با C#

برنامه نویسی با هدف (POO) یک الگوی برنامه نویسی به طور گسترده ای برای توسعه سیستم های قوی ، سازمان یافته و قابل استفاده مجدد است. این الگوی به دنبال این است که مدل سازی نرم افزار را با دنیای واقعی به همراه داشته باشد و مفاهیم و رفتارها را از طریق اشیاء نشان دهد.

POO مبتنی بر چهار ستون اساسی است:

  • انتزاع: به شما این امکان را می دهد تا با ویژگی ها و رفتارهای اساسی آنها ، نهادهای دنیای واقعی را نمایندگی کنید و جزئیات غیر ضروری را حذف کنید.

  • محاصره: محافظت از داده ها ، محدود کردن دسترسی مستقیم به ویژگی ها و کنترل تعامل از طریق روش ها.

  • میراث: شما را قادر می سازد کلاس های جدید را بر اساس کلاس های موجود ایجاد کنید ، استفاده مجدد از کد و سازمان سلسله مراتبی را ارتقا دهید.

  • چند شکل: به روش هایی با همین نام اجازه می دهد تا با توجه به متن به روش های مختلف رفتار کنند.

زبانهای برنامه نویسی مانند جاوا ، C#، پایتون و C ++ به شدت با جهت گیری هستند و منابع لازم را برای اجرای کارآمد این مفاهیم ارائه می دهند. پو همچنین نگهداری و مقیاس پذیری سیستم ها را تسهیل می کند و کد را مدولار و انعطاف پذیر تر می کند.

فهرست مطالب

1.1 کلاس

کلاس ساختاری است که خصوصیات (ویژگی ها) و رفتارهای (روش ها) یک شی را تعریف می کند. این به عنوان قالب برای ایجاد اشیاء کار می کند ، مشخص می کند که داده ها و ویژگی ها در دسترس خواهد بود. به عنوان مثال ، کلاس Person ممکن است ویژگی هایی مانند Nameبا Age اشمیه CPF، و روش هایی مانند Walk() اشمیه Talk()بشر

public class Person {
    public string Name;
    public int Age;

    public void Walk() {
        Console.WriteLine(Name + " is walking.");
    }

    public void Talk() {
        Console.WriteLine(Name + " is talking.");
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

1.2 شیء

یک شیء نمونه ای از یک کلاس است ، یعنی این است که تحقق یک کلاس در حافظه است. هر شیء می تواند مقادیر مختلفی برای ویژگی های خود داشته باشد ، اما روشهای مشابهی را که توسط کلاس تعریف شده است به اشتراک می گذارند.

Person person1 = new Person();
person1.Name = "Alice";
person1.Age = 30;

Person person2 = new Person();
person2.Name = "Bob";
person2.Age = 25;

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال ، person1 نماینده شخصی به نام آلیس در 30 سال است. person2 نماینده باب در 25 سال است. هر دو اشیاء مختلف از کلاس هستند Personبشر

1.3 فوری شیء

فوری یک شیء ایجاد نمونه ای از کلاس در حافظه با استفاده از اپراتور است new من c#

مثال:

Person person1 = new Person();

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

1.4 مقایسه بین اشیاء (اپراتور ==)

هنگام مقایسه اشیاء در برنامه نویسی با هدف (POO) ، درک چگونگی اپراتور مهم است == کار می کند

  • عملگر ==: اپراتور == مقایسه کنید که آیا دو شیء در حافظه یکسان هستند. یعنی حتی اگر دو شیء دارای ویژگی هایی با همان مقادیر باشند ، اگر به همان مرجع اشاره نکنند ، برابر نمی شوند. اگر هر دو به یک مکان در حافظه اشاره کنند ، مستقیماً تأیید می شود.

مثال:

using System;
public class Person {
    private int id;

    public Person(int id) => this.id = id;
}

public class Program {
    public static void Main() {
        var person1 = new Person(1);
        var person2 = new Person(1);
        var person3 = person1;

        Console.WriteLine(person1 == person2);  // False
        Console.WriteLine(person1 == person3);  // True
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال ، حتی اگر person1 اشمیه person2 با همان مقدار ایجاد می شوند id، مقایسه برمی گردد false زیرا هر دو در حافظه اشیاء متمایز هستند. پیش از این person1 اشمیه person3 به همان مکان در حافظه اشاره کنید ، بنابراین مقایسه برمی گردد trueبشر

1.5 ویژگی

ویژگی ها در یک کلاس متغیرهایی اعلام می شوند که وضعیت یک شی را ذخیره می کند. مثال:

public class Person {
    public string Name;
    public int Age;
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

1.5.1 اپراتورهای دسترسی (گیرنده و تنظیم کننده)

گیرنده ها و تنظیم کننده ها روش هایی هستند که برای دسترسی و اصلاح ویژگی های خصوصی یک کلاس استفاده می شوند ، با احترام به اصل محاصره.

public class Person {
    private string name;

    public string Name {
        get { return name; }
        set { name = value; }
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

1.5.2 کلمه کلیدی این

کلمه کلیدی this از آن برای اشاره به شیء فعلی کلاس استفاده می شود و از ابهام بین ویژگی ها و پارامترهای روش جلوگیری می کند.

public Person(string name) {
    this.name = name;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

1.6 روش

روشها نشان دهنده رفتارها یا اقداماتی است که یک شی می تواند انجام دهد.

1.6.1 سازندگان و ویرانگر (سازنده و ویرانگر)

  • construtores (سازندگان): اینها روشهای خاصی هستند که برای شروع کلاس استفاده می شوند. نام سازنده باید همان کلاس باشد و هیچ نوع بازگشت ندارد. سازنده به طور خودکار در لحظه فوری شیء فراخوانی می شود.
public class Person {
    private int[] data;

    public Person() {
        data = new int[100];
        Console.WriteLine("Memory allocated.");
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • ویرانگر (ویرانگر/نهایی): این یک روش خاص است که در صورت لزوم یک شیء برای انتشار منابع مورد استفاده قرار می گیرد. در C#، ناوشکن به همان نام کلاس پیش از این نماد است ~بشر ویرانگر به طور خودکار توسط جمع کننده زباله (جمع کننده زباله) فراخوانی می شود.
public class Person {
    private int[] data;

    public Person() {
        data = new int[100];
        Console.WriteLine("Memory allocated.");
    }

    ~Person() {
        data = null;
        Console.WriteLine("Memory deallocated.");
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

1.7 اصلاح کننده دسترسی

آنها دید ، ویژگی ها و روش ها را کنترل می کنند.

1.7.1 عمومی ، خصوصی و محافظت شده (عمومی ، خصوصی ، محافظت شده)

  • عمومی (عمومی): امکان دسترسی بدون محدودیت از هر قسمت از کد را فراهم می کند.
public class Person {
    public string Name;
}

Person person = new Person();
person.Name = "Alice"; // Acesso permitido
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • خصوصی (Privado): دسترسی به خود کلاس را محدود می کند.
public class Person {
    private int age;

    public void SetAge(int value) {
        age = value;
    }

    public int GetAge() {
        return age;
    }
}

Person person = new Person();
person.SetAge(30); // Acesso permitido
person.age = 30; // ERRO: 'age' é privado
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • محافظت شده (محافظت شده): امکان دسترسی به خود کلاس و زیر کلاس ها را فراهم می کند. (این تکنیک از وراثت استفاده می کند ، که بعداً به تفصیل نزدیک می شود.)
public class Person {
    protected string Address;
}

public class Employee : Person {
    public void SetAddress(string address) {
        Address = address; // Acesso permitido na subclasse
    }
}

Employee employee = new Employee();
employee.SetAddress("123 Main St"); // Acesso indireto permitido
employee.Address = "123 Main St"; // ERRO: 'Address' é protegido
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

2. ستون های برنامه نویسی شیء

اکنون که با ابزارها آشنا هستیم ، ستون هایی را که برنامه نویسی شی گرا (POO) را تقویت می کنند ، کشف خواهیم کرد و درک می کنیم که چگونه می توان از آنها در فلسفه و الگوی آنها استفاده کرد.

2.1 کپسوله سازی

محاصره این است که جزئیات داخلی یک کلاس را پنهان کرده و فقط آنچه را که از طریق رابط های تعریف شده به خوبی لازم است ، در معرض دید قرار دهید. این مفهوم از دسترسی مستقیم به ویژگی های یک شی جلوگیری می کند و اجازه می دهد تا داده ها با خیال راحت و کنترل شوند.

مثال:

public class Person {
    private string name;
    private int age;

    public string GetName() {
        return name;
    }

    public void SetName(string newName) {
        if (!string.IsNullOrEmpty(newName)) {
            name = newName;
        }
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال ، ویژگی ها name اشمیه age محافظت می شوند و فقط از طریق روش ها قابل دسترسی یا اصلاح هستند GetName() اشمیه SetName()بشر

2.2 وراثت

وراثت به شما امکان می دهد کلاسهای جدیدی را بر اساس کلاسهای موجود ایجاد کنید ، استفاده مجدد از کد و سازمان سلسله مراتبی را تسهیل کنید.

مثال:

public class Person {
    public string Name;
    public int Age;
}

public class Student : Person {
    public string School;
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در اینجا ، کلاس Student ویژگی های کلاس را به ارث می برد Person و ویژگی را اضافه می کند Schoolبشر

2.2.1 استفاده مجدد از کد و دسترسی به SuperClass مبتنی بر

کلمه کلیدی base به شما امکان می دهد تا به اعضای کلاس پایه در کلاس مشتق دسترسی پیدا کنید و از کد استفاده مجدد استفاده کنید. به جای تکرار منطق یا راه اندازی SuperClass ، ما استفاده می کنیم base برای استناد مستقیم از روش ها یا سازندگان قبلاً تعریف شده. در C#، base از آن برای تماس با روش ها ، سازندگان یا دسترسی به اعضای کلاس والدین (SuperClass) استفاده می شود. این مفهوم ممکن است با توجه به زبان برنامه نویسی متفاوت باشد. به عنوان مثال ، زبانهایی مانند جاوا از کلمه کلیدی استفاده می کنند superدر حالی که در پایتون روش معادل آن است super()بشر صرف نظر از زبان ، پارادایم برنامه نویسی شیء (POO) همیشه راهی برای استفاده مجدد از کد و دسترسی به عملکرد SuperClass فراهم می کند.

مثال در C#:

public class Person {
    public Person(string name) {
        Console.WriteLine("Person: " + name);
    }
}

public class Student : Person {
    public Student(string name) : base(name) {
        Console.WriteLine("Student: " + name);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

2.2.2 کلاسهای انتزاعی

کلاس های انتزاعی به عنوان پایه ای برای کلاس های دیگر عمل می کنند و نمی توانند فوری شوند. آنها وقتی می خواهید یک قرارداد را تعریف کنید (روشهایی که باید توسط زیر کلاس ها اجرا شود) مفید هستند و همچنین رفتارهای مشترک بین آنها را به اشتراک می گذارند.

مثال:

public abstract class Person {
    public string Name { get; set; }

    public void Greet() {
        Console.WriteLine($"Hello, my name is {Name}.");
    }

    public abstract void Introduce();
}

public class Student : Person {
    public override void Introduce() {
        Console.WriteLine("I am a student.");
    }
}

public class Teacher : Person {
    public override void Introduce() {
        Console.WriteLine("I am a teacher.");
    }
}

// Uso:
Student student = new Student { Name = "Alice" };
student.Greet(); // Comportamento comum
student.Introduce(); // Comportamento específico

Teacher teacher = new Teacher { Name = "Mr. Smith" };
teacher.Greet(); // Comportamento comum
teacher.Introduce(); // Comportamento específico
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال ، کلاس انتزاعی Person یک روش مشترک را ارائه می دهد ، Greet()، که می تواند توسط همه زیر کلاس ها استفاده شود. زیر کلاس ها ، به عنوان Student اشمیه Teacher، روش انتزاعی را پیاده سازی کنید Introduce() به روش های خاص

2.2.3 رابط

رابط ها قراردادهایی را تعریف می کنند که کلاس ها باید اجرا کنند. بر خلاف کلاسهای انتزاعی ، رابط ها نمی توانند شامل پیاده سازی روش باشند (به جز در برخی از زبانها که روشهای اجرای استاندارد مانند C# 8.0 و رابط های خلفی را امکان پذیر می کنند). رابط ها هنگامی مفید هستند که می خواهید اطمینان حاصل کنید که کلاس های مختلف از همان مجموعه قوانین پیروی می کنند ، اما رفتار را به اشتراک نمی گذارند.

مثال:

public interface IPerson {
    void Introduce();
}

public class Employee : IPerson {
    public void Introduce() {
        Console.WriteLine("I am an employee.");
    }
}

public class Manager : IPerson {
    public void Introduce() {
        Console.WriteLine("I am a manager.");
    }
}

// Uso:
IPerson employee = new Employee();
employee.Introduce(); // Saída: I am an employee.

IPerson manager = new Manager();
manager.Introduce(); // Saída: I am a manager.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال ، هر دو Employee چقدر Manager رابط کاربری را پیاده سازی کنید IPerson و نسخه های خاص خود را ارائه دهید Introduceبشر این اجازه می دهد تا هنگام دسترسی از طریق رابط ، اشیاء مختلف به طور یکنواخت درمان شوند.

2.3 چندشکلی

پلی مورفیسم به اشیاء کلاسهای مختلف اجازه می دهد تا متفاوت به همان تماس روش پاسخ دهند.

مثال:

public class Person {
    public virtual void Introduce() {
        Console.WriteLine("I am a person.");
    }
}

public class Student : Person {
    public override void Introduce() {
        Console.WriteLine("I am a student.");
    }
}

public class Employee : Person {
    public override void Introduce() {
        Console.WriteLine("I am an employee.");
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

2.3.1 روشهای رونویسی (مهم)

به شما امکان می دهد تا یک روش کلاس پایه را در یک کلاس مشتق تعریف کنید و رفتار خود را تطبیق دهید.

مثال:

public class Person {
    public virtual void Introduce() {
        Console.WriteLine("Hello, I am a person.");
    }
}

public class Student : Person {
    public override void Introduce() {
        Console.WriteLine("Hello, I am a student.");
    }
}

public class Employee : Person {
    public override void Introduce() {
        Console.WriteLine("Hello, I am an employee.");
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

از مثال استفاده کنید:

Person person = new Person();
person.Introduce();  // Saída: Hello, I am a person.

Person student = new Student();
student.Introduce();  // Saída: Hello, I am a student.

Person employee = new Employee();
employee.Introduce();  // Saída: Hello, I am an employee.

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

3. رابطه بین کلاس ها

روابط طبقاتی برای مدل سازی تعامل و وابستگی بین اشیاء در سیستم های شیء اصلی اساسی است. بیایید انواع اصلی روابط را بررسی کنیم: ارتباط ، جمع و وابستگی.

3.1 انجمن یک طرفه

ارتباط یک طرفه زمانی اتفاق می افتد که یک طبقه دیگر را می شناسد ، اما این رابطه متقابل نیست.

مثال:

public class Person {
    public string Name;
}

public class Car {
    public string Model;
    public Person Owner;
}

// Uso
Person person = new Person { Name = "Alice" };
Car car = new Car { Model = "Sedan", Owner = person };

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال ، یک شی Car با یک شی همراه است Person به عنوان صاحب آن

3.2 انجمن دو طرفه

ارتباط دو طرفه زمانی اتفاق می افتد که هر دو کلاس داده ها را از یکدیگر می شناسند و به آنها دسترسی پیدا می کنند و امکان تعامل متقابل را فراهم می کنند.

در انجمن دو طرفه ، هر دو کلاس وجود یکدیگر را می شناسند.

مثال:

public class Person {
    public string Name;
    public Car Car;
}

public class Car {
    public string Model;
    public Person Owner;
}

Person person = new Person() { Name = "Alice" };
Car car = new Car() { Model = "Sedan", Owner = person };
person.Car = car;

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در اینجا ، هر دو Person خود را بدانید Car به عنوان Car خود را بدانید Ownerبشر

3.3 تجمع

تجمع نشان دهنده رابطه ای است که در آن یک طبقه شامل دیگری است ، اما هر دو ممکن است به طور مستقل وجود داشته باشند. کلاس “کل” اشاره ای به کلاس “قسمت” دارد ، اما تخریب شیء “کل” بر وجود شی “قسمت” تأثیر نمی گذارد.

مثال:

public class Person {
    public string Name;
}

public class Department {
    public string Name;
    public List<Person> Employees = new List<Person>();
}

Person person = new Person() { Name = "Alice" };
Department dept = new Department() { Name = "IT" };
dept.Employees.Add(person);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال ، Department شامل لیستی از Person به عنوان کارمند اگر شیء Department از بین می رود ، شیء Person هنوز هم به طور مستقل وجود خواهد داشت.

3.4 ترکیب

این ترکیب نمایانگر یک رابطه “همه” محدودتر است ، جایی که حزب بدون کل نمی تواند وجود داشته باشد. اگر شیء “کل” از بین برود ، تمام قسمت های آن نیز از بین می رود. این رابطه اغلب با اشیاء ایجاد شده و به طور انحصاری توسط “کل” انجام می شود.

مثال:

public class Person {
    public string Name;
}

public class House {
    private List<Person> residents = new List<Person>();

    public House() {
        residents.Add(new Person() { Name = "Alice" });
        residents.Add(new Person() { Name = "Bob" });
    }

    public void ListResidents() {
        foreach (var resident in residents) {
            Console.WriteLine(resident.Name);
        }
    }
}

House house = new House();
house.ListResidents(); // Outputs: Alice, Bob
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال ، اشیاء Person در درون شی ایجاد می شوند Houseبشر اگر شیء House از بین می رود ، اشیاء Person همکاران نیز از بین می روند ، زیرا آنها خارج از متن وجود ندارند Houseبشر

4. مفاهیم مکمل

علاوه بر ستون ها و روابط ، مفاهیم پیشرفته ای وجود دارد که برنامه نویسی با جهت گیری شی (POO) را غنی می کند.

4.1 وراثت چندگانه (از طریق رابط ها)

ج# اجازه نمی دهد که میراث چند طبقه از درگیری و ابهام جلوگیری کند. با این وجود ، اجرای چندین رابط امکان پذیر است و به یک کلاس اجازه می دهد تا قراردادها را از منابع مختلف ترکیب کند.

وراثت چندگانه از طریق رابط ها برای اختصاص مسئولیت های مختلف به یک کلاس مفید است و امکان انعطاف پذیری و مدولار بودن بیشتر در طراحی نرم افزار را فراهم می کند بدون اینکه وابستگی های قوی بین مؤلفه ها ایجاد شود.

مثال: شخصی با دو مسئولیت

در مثال زیر ، کلاس Person دو رابط را پیاده سازی می کند: IWorker اشمیه IStudent، که نمایانگر قراردادها برای مسئولیت های مختلف است.

public interface IWorker {
    void Work();
}

public interface IStudent {
    void Study();
}

public class Person : IWorker, IStudent {
    public void Work() {
        Console.WriteLine("Working...");
    }

    public void Study() {
        Console.WriteLine("Studying...");
    }
}

// Uso:
Person person = new Person();
person.Work(); // Saída: Working...
person.Study(); // Saída: Studying...
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

4.2 روش ها و کلاس های عمومی

روش ها و کلاس های عمومی به شما امکان می دهد ساختارهای کد ایجاد کنید که با هر نوع داده کار می کنند ، استفاده مجدد و انعطاف پذیری انواع را ترویج می کنند. این مفاهیم به طور گسترده در کتابخانه ها و چارچوب ها برای مقابله با انواع مختلف داده ها به طور مساوی مورد استفاده قرار می گیرند و اصل را تشویق می کنند خشک (خود را تکرار نکنید)، زیرا آنها از تکثیر منطق به انواع مختلف جلوگیری می کنند.

نمونه ای از کلاس عمومی

public class Box<T> {
    public T Content;
}

// Uso:
Box<int> intBox = new Box<int>();
intBox.Content = 10;

Box<string> stringBox = new Box<string>();
stringBox.Content = "Hello";

Console.WriteLine(intBox.Content);    // Saída: 10
Console.WriteLine(stringBox.Content); // Saída: Hello
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نمونه ای از روش عمومی

public class Utils {
    public static void Display<T>(T item) {
        Console.WriteLine(item);
    }
}

// Uso:
Utils.Display<int>(42);        // Saída: 42
Utils.Display<string>("Text"); // Saída: Text
Utils.Display<double>(3.14);   // Saída: 3.14
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

با اتخاذ کلاس ها و روش های عمومی ، کد در زمان تدوین مدولار و ایمن تر می شود. این امر به توسعه برنامه های با محوریت شیء قوی تر که با انواع مختلفی از داده ها در سناریوهای مختلف سروکار دارند ، کمک می کند.

4.3 درمان استثنائات POO

درمان استثنائات یک تکنیک اساسی در برنامه نویسی با جهت گیری شی (POO) برای ضبط و مقابله با خطاها در هنگام اجرای برنامه ، جلوگیری از خرابی های غیر منتظره و ارائه یک تجربه کاربر قوی تر است. با این حال ، توجه به این نکته حائز اهمیت است که استثنائات دارای یک است هزینه محاسباتی بالا و نباید به عنوان جریان کنترل عادی مورد استفاده قرار گیرد (همانطور که توسط مستندات مایکروسافت توصیه می شود).

ساختار استثناء

در زبانهایی مانند C#، درمان استثنا با کلمات کلیدی اجرا می شود tryبا catch اشمیه finally:

  • try: یک بلوک کد را تعریف می کند که در آن ممکن است استثنائات رخ دهد.
  • catch: استثنائات خاص یا کلی را که در بلوک رخ می دهد ، ضبط و رفتار می کند tryبشر
  • finally: (اختیاری) صرف نظر از اینکه یک استثنا رخ داده است ، یک کد کد را انجام می دهد. اغلب برای آزاد کردن منابع استفاده می شود.

مثال اساسی

try {
    int result = 10 / 0; // Lança uma exceção DivideByZeroException
} catch (DivideByZeroException ex) {
    Console.WriteLine("Error: " + ex.Message);
} finally {
    Console.WriteLine("Operation finished.");
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مثال پیشرفته با استثنائات مختلف

try {
    string input = null;
    Console.WriteLine(input.Length); // Lança NullReferenceException
} catch (NullReferenceException ex) {
    Console.WriteLine("Null reference error: " + ex.Message);
} catch (Exception ex) {
    Console.WriteLine("General error: " + ex.Message);
} finally {
    Console.WriteLine("Cleanup complete.");
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

هزینه محاسباتی و شیوه های خوب

  1. از استثنائات برای شرایط واقعاً استثنایی استفاده کنید: استثنائات باید مشکلات پیش بینی نشده یا سناریوهای نادر را نشان دهد. از استفاده از آنها به عنوان بخشی از جریان برنامه عادی خودداری کنید.
  2. از استثنائات برای کنترل جریان استفاده نکنید: علاوه بر اختلال در خوانایی کد ، راه اندازی و ضبط استثنائات می تواند به طور مکرر ایجاد کند مصرف منابع بالا و تأثیرات قابل توجهی بر عملکرد.
  3. استثنائات خاص را ضبط کنید: در هر زمان ممکن ، از استثنائات خاص به جای گرفتن استثنائات عمومی استفاده کنید (Exception). بنابراین ، درمان واضح تر و کارآمدتر است.
  4. ویژگی های موجود در بلوک را به درستی درمان کنید finally: آزاد کردن اتصالات ، بسته شدن پرونده ها یا خنثی کردن معاملات به درستی از نشت منابع جلوگیری می کند.

مزایای درمان استثنا

  • استحکام: کاهش احتمال برنامه به طور غیر منتظره از بین می رود.
  • نگهدار: شناسایی و تصحیح خطا را تسهیل می کند.
  • کنترل کردن: به شما امکان می دهد در زمان اجرای به اندازه کافی به انواع مختلف خطاها پاسخ دهید.

درمان استثنائات ، اگرچه ضروری است ، باید با پارسیمونی استفاده شودبشر قانون کلی است در صورت امکان مقابله با سناریو از طریق اعتبار سنجی یا چک های قبلی ، استثنائاتی را راه اندازی نکنیدبشر در زمینه برنامه های کاربردی با کارایی بالا – مانند ASP.NET CORE – سوء استفاده از استثنائات می تواند منجر به هزینه بالا و کاهش مقیاس پذیری شود ، همانطور که در شیوه های خوب توسعه مایکروسافت برجسته شده است.

4.4 بازتاب (بازتاب) – بازرسی و رسیدگی در زمان اجرای

بازتاب (بازتاب) این یک مکانیسم قدرتمند است که اجازه می دهد بازرسی کردنبا ایجاد اشمیه تغییر دادن نمونه های کلاس در زمان اجرای ، و همچنین دسترسی اشمیه فراخواندن اعضای آن (خواص ، روشها ، سازندگان و غیره). از آن به طور گسترده ای در سناریوهایی استفاده می شود که کد باید مانند آن پویا باشد چارچوبهابا کتابخانه های سریال سازی یا ابزارهای تجزیه و تحلیل و تولید کد

نکات مهم

  • انعطاف پذیری: به شما امکان می دهد انواع و اندام ها را در زمان اجرا کشف کنید و راه حل های عمومی یا پلاگین بیشتری ایجاد کنید.
  • با هزینه بالایی: بازتاب می تواند کندتر و پیچیده تر باشد و نیاز به مراقبت با عملکرد دارد.
  • خطر ایمنیدر صورت عدم کنترل مناسب ، دسترسی به جزئیات داخلی می تواند مناطق حساس کد را در معرض دید خود قرار دهد.
  • استفاده محدود: معمولاً ، فقط در صورت ضروری بودن انعطاف پذیری پویا استفاده کنید و جایگزین ساده تری وجود ندارد.

مثال: بازرسی و دستکاری با بازتاب

using System;
using System.Reflection;

public class Person {
    public string Name { get; set; }
    public int Age { get; set; }

    public void Speak() {
        Console.WriteLine($"Hello, my name is {Name}.");
    }
}

class Program {
    static void Main() {
        // Obtendo o tipo da classe Person
        Type type = typeof(Person);
        Console.WriteLine("Class: " + type.Name);

        // Listando propriedades da classe
        foreach (PropertyInfo prop in type.GetProperties()) {
            Console.WriteLine("Property: " + prop.Name);
        }

        // Criando uma instância da classe Person dinamicamente
        object obj = Activator.CreateInstance(type);

        // Definindo valor na propriedade 'Name'
        PropertyInfo nameProp = type.GetProperty("Name");
        nameProp.SetValue(obj, "Alice");
        Console.WriteLine("Name set via Reflection: " + nameProp.GetValue(obj));

        // Invocando o método 'Speak' dinamicamente
        MethodInfo method = type.GetMethod("Speak");
        method.Invoke(obj, null);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

خروج:

Class: Person
Property: Name
Property: Age
Name set via Reflection: Alice
Hello, my name is Alice.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مشاهده

اگرچه بسیار قدرتمند است ، بازتاب فقط در صورت نیاز باید مورد استفاده قرار گیرد زیرا می تواند خوانایی و عملکرد کد شما را مختل کند. در سناریوهای معمولی ، ساده ترین و آماری ترین رویکرد ارجح است.

4.5 اضافه بار اپراتور (اضافه بار اپراتور)

اضافه بار اپراتور به شما امکان می دهد تا رفتار اپراتورها را تعریف کنید تا آنها با انواع تعریف شده توسط کاربر کار کنند. این برای ساختن اشیاء کلاس شخصی برای استفاده در عملیات مشترک مانند مقایسه یا جمع مفید است.

مثال: مقایسه اشیاء Person

public class Person {
    public string Name;
    public int Age;

    public static bool operator ==(Person p1, Person p2) {
        if (ReferenceEquals(p1, null) || ReferenceEquals(p2, null)) {
            return ReferenceEquals(p1, p2);
        }
        return p1.Name == p2.Name && p1.Age == p2.Age;
    }

    public static bool operator !=(Person p1, Person p2) {
        return !(p1 == p2);
    }

    public override bool Equals(object obj) {
        if (obj is Person other) {
            return this == other;
        }
        return false;
    }

    public override int GetHashCode() {
        return HashCode.Combine(Name, Age);
    }
}

// Uso:
Person person1 = new Person { Name = "Alice", Age = 30 };
Person person2 = new Person { Name = "Alice", Age = 30 };
Person person3 = new Person { Name = "Bob", Age = 25 };

Console.WriteLine(person1 == person2); // Saída: True
Console.WriteLine(person1 != person3); // Saída: True
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مشاهده

قبل از ظاهر نوع record در C#، این رایج ترین روش برای ایجاد بود اشیاء ارزشاطمینان از تغییر ناپذیری و برابری بر اساس ارزش خواص.

| اضافه بار اپراتور یک تکنیک قدرتمند است ، اما برای جلوگیری از سردرگمی یا رفتار غیر منتظره باید با احتیاط استفاده شود.

4.6 نمایندگان و رویدادها (اجرای استاندارد Observer)

پیش فرض ناظر (همچنین به عنوان شناخته می شود انتشار/مشترک شدن) راهی برای سازماندهی ارتباط بین اشیاء است به گونه ای که هنگام یک شی ( موضوع یا ناشر) حالت را تغییر دهید یا اطلاعات مهمی داشته باشید ، به طور خودکار سایر اشیاء علاقه مند را مطلع می کند ( ناظران یا مشترکین).

بدون C#، نمایندگان اشمیه وقایع یک روش ساده برای اجرای این الگوی ارائه دهید:

  • نمایندگان اینها انواع است که منابع را به روش ها ذخیره می کنند و به روش هایی مانند پارامترها امکان می دهند و آنها را به صورت پویا اجرا می کنند.
  • وقایع، بر اساس نمایندگان ، این رفتار را محاصره کرده و از مدل انتشار/امضا پیروی کنید ، جایی که چندین نفر ناظران می تواند برای دریافت به روزرسانی از a (مشترک) اعمال شود موضوعبشر

نمونه ای از اجرای استاندارد Observer

using System;

// Delegate que define a "assinatura" do método que receberá a notificação
public delegate void Notify(string message);

// Sujeito (Publisher)
public class Subject {
    // Evento baseado no delegate Notify
    public event Notify OnNotify;

    public void NotifyObservers(string message) {
        Console.WriteLine($"Subject: Notificando observadores com a mensagem '{message}'...");

        // Invoca todos os métodos inscritos
        OnNotify?.Invoke(message);
    }
}

// Observador (Subscriber)
public class Observer {
    private readonly string _name;

    public Observer(string name) {
        _name = name;
    }

    // Método que será chamado quando ocorrer uma notificação
    public void Update(string message) {
        Console.WriteLine($"Observer {_name}: Recebeu a mensagem '{message}'");
    }
}

class Program {
    static void Main() {
        // Criação do Sujeito
        Subject subject = new Subject();

        // Criação dos Observadores
        Observer observerA = new Observer("A");
        Observer observerB = new Observer("B");

        // Inscrição (Subscribe) dos observadores no evento do sujeito
        subject.OnNotify += observerA.Update;
        subject.OnNotify += observerB.Update;

        // Dispara a notificação
        subject.NotifyObservers("Olá, Observadores!");
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

خروج مورد انتظار:

Subject: Notificando observadores com a mensagem 'Olá, Observadores!'...
Observer A: Recebeu a mensagem 'Olá, Observadores!'
Observer B: Recebeu a mensagem 'Olá, Observadores!'
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چگونه کار می کند

  1. نماینده Notify

    قرارداد (امضای روش) را تعریف می کند که ناظران باید به آنها اطلاع داده شوند.

  2. طبقه Subject

    • یک رویداد دارد OnNotify مستقر نیست.
    • روش را ارائه می دهد NotifyObservers این رویداد را برای همه مشترکین آتش می زند.
  3. طبقه Observer

    • یک روش دارد Update سازگار با نماینده ، هنگام اخراج این رویداد فراخوانده می شود.
  4. ثبت نام (+=)
    ناظران در رویداد موضوع ثبت نام می کنند ، و این نشان می دهد که می خواهند به روزرسانی کنند.

مزایای استاندارد Observer

  • جدا سازی: o موضوع نیازی به دانستن جزئیات آن نیست ناظران، فقط نماینده ای که آنها اجرا می کنند.
  • قابلیت گسترش: افزودن جدید را تسهیل می کند ناظران بدون تغییر کد موضوعبشر
  • سازمان: ارتباط بین اشیاء را به وضوح و متمرکز حفظ می کند.

مشاهده

روش های مختلفی برای اجرای الگوی ناظربشر علاوه بر نمایندگان و رویدادها ، می توان از کتابخانه های واکنشی استفاده کرد (مانند پسوندهای واکنشی، rx.net) یا حتی سایر استانداردهای پیام رسان برای انتشار اعلان ها به صورت غیر همزمان یا توزیع شده. ضروری این است که اصل را حفظ کنید: هنگامی که ناشر تغییر می کند ، او او را تحریک می کند مشترکین به روشی شکست خورده


نسخه: 1.3.1

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا