دوره آموزشی #C - قسمت هشتم- Access Modifiers
خلاصه : در این پست ، با سازنده های C# و نحوه استفاده از آنها برای مقداردهی اولیه اشیا آشنا خواهید شد.
سازنده متد خاصی است که نام آن با نام کلاس یکی است. سازنده به دلایل زیر خاص است:
به طور معمول، شما از یک سازنده برای مقداردهی اولیه شی جدید با تخصیص مقادیر به پراپرتی های شی استفاده می کنید.
کامپایلر C# هنگام تعریف کلاس به طور ضمنی یک سازنده بدون هیچ پارامتری(parameterless constructor) ایجاد می کند. برای درک این موضوع مثال زیر را در نظر بگیرید :
// Person.cs class Person { }
سی شارپ به طور ضمنی یک سازنده بدون هیچ پارامتری مانند زیر ایجاد می کند:
// Person.cs class Person { public Person() { } }
مثال زیر نشان می دهد که چگونه #C به طور ضمنی سازنده را هنگام ایجاد یک شی جدید فراخوانی می کند:
// Program.cs Person p1 = new();
Output:
Create a new Person object
مثال زیر یک سازنده با سه پارامتر برای کلاس Person تعریف می کند:
// Person.cs class Person { private string firstName; private string lastName; private byte age; public Person(string firstName, string lastName, byte age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } public string GetFullName() { return $"{this.firstName} {this.lastName}" } }
در این مثال سازنده سه آرگومان را می پذیرد و private پراپرتی های firstName، lastName و age را مقداردهی اولیه می کند.
هنگامی که به طور صریح یک سازنده تعریف می کنید، کامپایلر #C دیگر به صورت ضمنی سازنده بدون پارامتر را به کلاس اضافه نمی کند.
بنابراین، برای ایجاد یک شیء جدید Person، باید سه آرگومان مانند زیر را ارسال کنید
// Program.cs var p1 = new Person("John", "Doe", 25);
و یا :
Person p2 = new("John", "Doe", 25);
سی شارپ به شما امکان می دهد چندین سازنده با پارامترهای مختلف برای یک کلاس تعریف کنید. مثلا:
// Person.cs class Person { private string firstName; private string lastName; private byte age; public Person() { } public Person(string firstName, string lastName) { this.firstName = firstName; this.lastName = lastName; } public Person(string firstName, string lastName, byte age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } }
در این مثال، کلاس Person دارای سه سازنده است.
با انجام این کار، می توانید با ارسال هیچ پارامتر، دو پارامتر یا سه پارامتر به سازنده های مربوطه، یک Personobject جدید ایجاد کنید:
// Program.cs var p1 = new Person(); var p2 = new Person("John", "Doe"); var p3 = new Person("John", "Doe", 25);
برای انعطاف پذیری بیشتر برای مقداردهی اولیه یک شی جدید میتوانید یک سازنده را در سازنده دیگری فراخوانی کنید، همانطور که در مثال زیر نشان داده شده است:
// Person.cs class Person { private string firstName; private string lastName; private byte age; public Person() { Console.WriteLine("Initialized the object"); } public Person(string firstName, string lastName) : this() { this.firstName = firstName; this.lastName = lastName; Console.WriteLine("Initialized the first name & last name properties"); } public Person(string firstName, string lastName, byte age) : this(firstName, lastName) { this.age = age; Console.WriteLine("Initialized the age property"); } }
در این مثال، سازنده دوم، سازنده اول را از طریق این کلمه کلیدی this فراخوانی می کند:
public Person(string firstName, string lastName) : this()
هنگامی که یک شی با دو پارامتر ایجاد می کنید، این سازنده سازنده بدون پارامتر را قبل از اجرای بدنه آن فراخوانی می کند. سازنده سوم سازنده دوم را از طریق این کلمه کلیدی با آرگومان های firstName و lastName فراخوانی می کند:
public Person(string firstName, string lastName, byte age) : this(firstName, lastName)
اگر یک شی جدید با سه آرگومان ایجاد کنید، سازنده سوم سازنده دوم را فراخوانی می کند که سازنده اول را فراخوانی می کند. بنابراین، سازنده ها به ترتیب زیر اجرا می شوند:
public Person() public Person(string firstName, string lastName) : this() public Person(string firstName, string lastName, byte age) : this(firstName, lastName)
با انجام این کار، می توانید از منطق سازنده های دیگر هنگام مقداردهی اولیه اشیاء استفاده مجدد کنید.
لازم نیست همه پراپرتی ها دارای پارامترهای سازنده باشند. به عنوان مثال کلاس person می تواند دارای propertyای باشد که توسط هیچ پارامتر سازنده ای تنظیم نشده است، بنابراین EF Core آن را پس از فراخوانی سازنده به روش عادی تنظیم می کند.
توجه داشته باشید EF Core نمی تواند ویژگی های ناوبری (navigation properties) را با استفاده از سازنده تنظیم کند.
بیشتر بخوانید : دوره آموزشی #C - قسمت 10- Property
بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core