PDA

View Full Version : سوال: نقش constructor کلاس در MVC



Maryam_1368
سه شنبه 29 تیر 1395, 08:45 صبح
با عرض سلام و خسته نباشید.
لطفا به این لینک (http://www.c-sharpcorner.com/UploadFile/b696c4/creating-image-gallery-in-mvc-5-application631/) مراجعه کنید
این لینک آموزش ساختن گالری تصویر رو داره
حالا اگه دقت کنید در قطعه کد اول اومده یه کلاس ساخته با نام ImageGallery
و در داخل اون سازنده کلاس رو ایجاد کرده. و داخل سازنده کد زیر رو قرار داده


ImageList = newList<string>();


میخواستم بدونم دلیل این کار چیه؟ مزیتی داره؟ اگه نذاریم به مشکل میخوریم؟
البته خودش این توضیح رو داده Here you create a constructor to initialize the ImageList List of the string object.

پیشاپیش تشکر از دوستان

mze666
سه شنبه 29 تیر 1395, 09:55 صبح
سلام
اگر این Constructor وجود نداشته باشه و شما یه نمونه از ImageGallery ایجاد کنید و بخواید به ImageList آیتمی اضافه کنید با خطای Null Reference Exception مواجه میشید. با این Constructor و ایجاد یک لیست خالی در آن این خطا برطرف میشه...

var imageGallery = new ImageGallery{
ID = 1,
Name = "..."
ImagePath = "..."
};


imageGallery.ImageList.Add(new ImageList { ... }); // Error

مهران موسوی
چهارشنبه 30 تیر 1395, 00:39 صبح
به بیان دیگر شما در سازنده کلاس میتونید از اشیاء داخل کلاس نمونه سازی کنید تا در متدها نیاز به نمونه سازی دوباره از اشیاء نباشه و این کار فقط یکبار انجام بشه.

نمونه سازی استاتیک هم گزینه دیگریست که یک مثال رو با هم پیش میریم تا واضح تر باشه براتون

فرض کنید کلاس زیر رو داریم که فیلدهای اون استاتیک هستن :


class ScopeMonitor
{
static string urlFragment = "foo/bar";
static string firstPart= "http://www.example.com/";
static List<string> UrlList;
}



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


ScopeMonitor.UrlList.Add("my item");



بله واضحه که شما Null Reference دریافت میکنید !

راه حل چیست در نمونه های استاتیک ؟

بله Static constructor راه حل شماست

حال کلاس رو به شکل زیر تغییر بدید و ازاین مفهوم جدید که باهاش آشنا شدید لذت ببرید


class ScopeMonitor
{
static string urlFragment = "foo/bar";
static string firstPart= "http://www.example.com/";
static List<string> UrlList;

static ScopeMonitor()
{
UrlList= new List<string>();
}
}

Maryam_1368
چهارشنبه 30 تیر 1395, 08:58 صبح
ضمن تشکر از دوستان عزیز

به بیان دیگر شما در سازنده کلاس میتونید از اشیاء داخل کلاس نمونه سازی کنید تا در متدها نیاز به نمونه سازی دوباره از اشیاء نباشه و این کار فقط یکبار انجام بشه.
یه سوال..الان شما گفتین از اشیاء داخل کلاس..این جمله خیلی مهمه و برام سوال پیش اومده..ما زمانی که از یک کلاس نمونه میسازیم آیا متغیر و پراپرتی های یک کلاس جزء اشیا محسوب نمیشن؟
در مثال شما یک لیست وجود داره که فکر میکنم فقط اون لیست جزء اشیا محسوب میشه و نیاز به نمونه سازی داخل داره..حرفم درسته ایا؟

مهران موسوی
چهارشنبه 30 تیر 1395, 09:14 صبح
هر موجودیتی درون یک کلاس عضوی از کلاس هست میتونه access modifiers های مختلفی داشته باشه. از جمله پاپرتی ها . متد ها ، و و و ...

هر موجودیتی که از Object ارث بری کرده باشه و خودش یک شیء باشه باید اون رو نمونه سازی کنید. جز متدها که هنگام نمونه سازی کلاس شما در حافظه قرار میگیرند و قابل استفاده خواهند بود

خیلی ساده بگم که Value Types ها متغیر های معمولی هستند که نیاز به نمونه سازی ندارند که شامل :



All numeric data types
Boolean, Char, and Date
All structures, even if their members are reference types
Enumerations, since their underlying type is always SByte, Short, Integer, Long, Byte, UShort, UInteger, or ULong


Reference Types ها نیاز دارند تا ازشون نمونه سازی کنید که شامل :



String
All arrays, even if their elements are value types
Class types, such as Form
Delegates


میشوند.

شاد باشید

میتوانید من را در linked-in دنبال کنید. اینجا (http://linkedin.com/in/mehran-mousavi)