نوع داده anonymouse در MVC

دوشنبه 3 اسفند 1394

در این مقاله قصد داریم راجع به نوع anonymouse صحبت کنیم .تفاوت این کلمه با کلمه کلیدی var شرح داده خواهد شد و نهایتا یک پروژه برای شرح کاربرد نوع داده anonymouse ایجاد خواهیم کرد.

نوع داده anonymouse  در MVC

کلمه anonymouse به معنای ناشناخته است .ولی شاید یک مقداری با کلمه کلیدی Var اشتباه گرفته شود .قبل از توضیح نوع Anonymouse و انجام یک کار عملی با آن ابتدا تفاوت هایی که این دو کلمه با یکدیگر دارند را مورد بررسی قرار می دهیم .نوع Var برای تعریف یک متغیر محلی به کار می رود .این نوع داده باید در همان زمان تعریف مقدار دهی شود .زیرا با نوع داده ایی  که به آن نسبت می دهیم در حین اجرا کامپایلر نوعی را به آن اختصاص می دهد .نوع داده Var اساسا یک نوع داده Anonymouse است .ولی در مورد نوع داده anonymouse باید گفت که به صورت یک کلاس جهت ذخیره اطلاعات استفاده خواهد شد .اما اگر نوع داده var را با کلمه کلیدی New به کار ببریم معادل anonymouse خواهد بود .در هنگام استفاده از لینک نوع داده ناشناس بسیار پرکاربرد است .زیرا با  این نوع داده می توانید به خروجی کوئری هایتان شکل جدید بدهید

در مورد توابع هم نوع داده ناشناخته به نام anonymous method داریم .این نوع توابع توابع inline هستند که بدون نام می باشند .این توابع با کمک مفهوم delegate ساخته می شوند .در نسخه های بعدی .net شکل این توابع به لامبدا تغییر پیدا کرد.در واقع لامبدا ساده شده توابع ناشناخته می باشد.و در هنگام کامپایل برنامه عبارات لامبدا به متدهای بی نام تبدیل خواهند شد .

وقتی یک متغیری تعریف می کنید قسمتی از حافظه Ram برای متغیر کنار گذاشته می شود.با توجه به اینکه نوع داده ایی که تعریف کرده اید چه نوعی باشد متغیر شما در جاهای مختلفی از حافظه ذخیره خواهد شد .که این مکان ها به نام های Stack و heap شناخته می شوند .متغیر از نوع داده اصلی در حافظه stack ذخیره می شود و برای اشیایی که در برنامه تعریف کرده ایم فقط نام آنها در stack ذخیره میشود و در هنگام new کردن شی این کلاس در داخل heap ذخیره می شود .وقتی برنامه تمام شود حافظه Stack پاک می شود ولی حافظه heap توسط garbage collector پاک خواهد شد .

نوع های anonymouse نامی ندارند ولی متدهایی را پیاده سازی می کنند.این نوع های داده به شکل کلاس ساخته خواهند شد .کلمه کلیدی var برای پیاده سازی این نوع داده استفاده می شود .

تعریف نوع داده Anonymouse در mvc جهت کار با linq و sql را در ادامه پیاده سازی خواهیم کرد.

یک پروژه جدید از نوع mvc ایجاد می کنیم .برای ساده تر شدن کار اتصال به پایگاه داده ایجاد نمی کنیم و اشیا خود را در داخل برنامه ساخته و در یک لیستی Add می کنیم و سپس این لیست را به view پاس می دهیم تا اطلاعات آن نمایش داده شود

کلاس هایی که ایجاد می کنیم به صورت زیر هستند .

public class Person
    {
        public Person()
        {
            //salery = new Salery();
            //department = new Department();
        }
        public int PesonId { get; set; }
        public string Name { get; set; }
        public  Department department { get; set; }
        public  Salery salery { get; set; }
    }
    public class Department
    {
        public Department()
        {
            //person = new Person();
        }
        public int DepartmentID { get; set; }
        public string DepName { get; set; }
        public  Person person { get; set; }
    }
    public class Salery
    {
        public Salery()
        {
            //person = new Person();
        }
        public int SaleryID { get; set; }
        public int Amount { get; set; }
        public  Person person { set; get; }
    }

این کلاس ها همان طور که می بینید با یکدیگر ارتباط دارند .ارتباط بین person و کلاس های Department و Salery یک ارتباط یک به یک است .بنابراین یک پراپرتی از جنس هر کدام از این کلاس ها در این کلاس تعریف می کنیم .

اگر شما یک کلاس person ایجاد کنید(برای آشنایی بیشتر به مقاله انواع کلاس ها در سی شارپ مراجعه کنید ) به شما خطای null Reference خواهد داد .برای اینکه در هنگام ساخت شی از نوع person این خطا را دریافت نکنیم در داخل سازنده آن باید پراپرتی از نوع کلاس دیگر را new کنیم .ولی در اینجا ما نیازی به این کار نداشتیم .چون در همان لحظه تعریف شی از نوع person به پراپرتی از نوع salary و department اشیایی از همان نوع را نسبت داده ایم .به نحوه تعریف لیست از نوع کلاس Person که در زیر آمده است دقت کنید .

 var people = new List<Person>(){
                new Person(){
                    PesonId=1,
                    Name="ایمان مدائنی",
                    salery=new Salery(){
                        SaleryID=1,
                    Amount=51200000,
                        },
                        department=new Department(){
                            DepartmentID=1,
                            DepName="مدیریت",
                        }
                                        },
                                        new Person(){
                                            PesonId=1,
                                            Name="زهره شاخصی",
                                                                salery=new Salery(){
                                                SaleryID=2,
                                                Amount=51200000,
                        },
                        department=new Department(){
                            DepartmentID=2,
                            DepName="برنامه نویسی",
                        }
                                        },
                                        new Person(){
                                            PesonId=1,
                                            Name="سجاد باقر زاده",
                                                                salery=new Salery(){
                                                SaleryID=3,
                                                Amount=23600000,
                        },
                        department=new Department(){
                            DepartmentID=3,
                            DepName="برنامه نویس ارشد",
                        }
                                        },
                                        new Person(){
                                            PesonId=4,
                                            Name="سمیه صالحی", 
                                            salery=somsalery,

                        }
                                    };

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

اما در مورد شی چهارم از لیست people به نام سمیه صالحی به طریق دیگری عمل کرده ایم و به پراپرتی های salary , Department آن به جای تعریف از نوع anonymouse یک شی از هر کدام از این کلاس ها ساخته و به پراپرتی مورد نظر نسبت داده ایم .

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

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

شکل کلی کنترلر Home به صورت زیر است .

 public class HomeController : Controller
    {
        // GET: Home
        Salery somsalery = new Salery()
        {
            SaleryID = 4,
            Amount = 6000000,
        };
        Department somDep = new Department()
        {
            DepartmentID = 4,
            DepName = "برنامه نویسی سی شارپ",
        };
        public ActionResult Index()
        {
            var people = new List<Person>(){
                new Person(){
                    PesonId=1,
                    Name="ایمان مدائنی",
                    salery=new Salery(){
                        SaleryID=1,
                    Amount=51200000,
                        },
                        department=new Department(){
                            DepartmentID=1,
                            DepName="مدیریت",
                        }
                                        },
                                        new Person(){
                                            PesonId=1,
                                            Name="زهره شاخصی",
                                                                salery=new Salery(){
                                                SaleryID=2,
                                                Amount=51200000,
                        },
                        department=new Department(){
                            DepartmentID=2,
                            DepName="برنامه نویسی",
                        }
                                        },
                                        new Person(){
                                            PesonId=1,
                                            Name="سجاد باقر زاده",
                                                                salery=new Salery(){
                                                SaleryID=3,
                                                Amount=23600000,
                        },
                        department=new Department(){
                            DepartmentID=3,
                            DepName="برنامه نویس ارشد",
                        }
                                        },
                                        new Person(){
                                            PesonId=4,
                                            Name="سمیه صالحی", 
                                            salery=somsalery,

                        }
                                    };


            return View(people);
        }

بعد از اجرای برنامه شکل زیر را خواهیم دید

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید