تور لحظه آخری
امروز : پنجشنبه ، 12 مهر 1403    احادیث و روایات:  پیامبر اکرم (ص):دلى كه در آن حكمت نيست، مانند خانه ويران است، پس بياموزيد و تعليم دهيد، بفهميد و ن...
سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون شرکت ها




آمار وبسایت

 تعداد کل بازدیدها : 1820141290




هواشناسی

نرخ طلا سکه و  ارز

قیمت خودرو

فال حافظ

تعبیر خواب

فال انبیاء

متن قرآن



اضافه به علاقمنديها ارسال اين مطلب به دوستان آرشيو تمام مطالب
archive  refresh

راهنمایی برای Trace در C# -


واضح آرشیو وب فارسی:سایت ریسک: راهنمایی برای Trace در C# scooter2005 15 دي 1387, 22:47سلام دوستان کسی اینجا هست بتواند برای بنده این کدها رو به نحو احسن Trace نماید ؟ using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication70 { class high { protected static int c = 0; public high() { c++; } public high (int z) { System.Console.WriteLine("{0} said " i am the {1} from high !", z, c); } } class middle : high { public int ID; public middle () {} public middle (int z) { Low i = new Low (z-4); System.Console.WriteLine("{0} i am tge {1} from middle !", z,c); for (int i=2 ; i<6 ; i++) { high h = new high (); } } } class low :middle { public low (int z) { System.Console.WriteLine("{0} i am tge {1} from low !", z,c); high h = new high (z + 4); } } class program1_2 { static void Main(string[] args) { int [] x = new int[] {90 , 23 , -12 , 13 , 20}; low i = new low(x[2]); middle m = new middle (x[1]); high h = new high(x[0]); } } } scooter2005 15 دي 1387, 22:48البته اینطور که معلومه از تابع main در پایین برنامه شروع می شود پس ممنون اگر از پایین شروع شود .... scooter2005 18 دي 1387, 08:23کسی نیست راهنمایی کنه ؟ the_king 18 دي 1387, 12:02لطفا کدی را که قابل اجرا نیست برای Trace کردن قرار ندهید، کد اشکال داشت و ویرایش گردید : using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class high { protected static int c = 0; public high() { c++; } public high (int z) { System.Console.WriteLine("{0} said I am the {1} from high !", z, c); } } class middle : high { public middle () {} public middle (int z) { low i = new low (z-4); System.Console.WriteLine("{0} I am the {1} from middle !", z,c); for (int j=2 ; j<6 ; j++) { high h = new high (); } } } class low : middle { public low (int z) { System.Console.WriteLine("{0} I am the {1} from low !", z,c); high h = new high (z + 4); } } class program1_2 { static void Main(string[] args) { int [] x = new int[] {90 , 23 , -12 , 13 , 20}; low i = new low(x[2]); middle m = new middle (x[1]); high h = new high(x[0]); System.Console.ReadKey(true); } } } پیش از آنکه تابع main برنامه را بررسی کنیم، بایستی عملکرد کلاس ها را مشخص باشد : کلاس high شامل یک متغیر به نام c است با مقدار اولیه 0 . این متغیر static است، پس برای کلیه شیء هایی که از این کلاس (و کلاس های وارث) ساخته می شود، صرفا یک مقدار مشترک c وجود خواهد داشت : class high { protected static int c = 0; و تابع سازنده آن (همنام کلاس است) که بدون پارامتر ورودی است، صرفا مقدار c را یک واحد افزایش می دهد : public high() { c++; } تابع سازنده دومی هم تعریف شده که یک پارامتر ورودی int دارد و مقدار متغیر ورودی و مقدار متغیر c را در خروجی چاپ می کند : public high (int z) { System.Console.WriteLine("{0} said I am the {1} from high !", z, c); } کلاس middle از کلاس high ارث بری می کند و به عنوان وارث کلاس high، آن متغیر c را بدون کد نویسی خواهد داشت : class middle : high { تابع سازنده بدون پارامتر ورودی کلاس middle هیچ کاری انجام نمی دهد، (دقت کنید که تابع سازنده بدون پارامتری که از کلاس high به ارث رسیده، در همان ابتدای ایجاد شدن شی middle و در هر شرایطی اجرا می شود ) : public middle () {} تابع سازنده ای هم در کلاس middle تعریف شده که یک پارامتر ورودی int دارد (همانند کلاس high) ( دقت کنید که تابع سازنده با پارامتر ورودی که از کلاس high به ارث رسیده اجرا نخواهد شد ولی تابع سازنده بدون پارامتری که از کلاس high به ارث رسیده، در همان ابتدای ایجاد شدن شی middle و در هر شرایطی اجرا می شود ) : public middle (int z) { در داخل این تابع سازنده، از نوع کلاس low (ما هنوز کلاس low را بررسی نکردیم) شیئی تعریف شده : low i = new low (z-4); و همانند کلاس high مقدار متغیر ورودی و متغیر c در خروجی چاپ می شود : System.Console.WriteLine("{0} I am the {1} from middle !", z,c); و از نوع کلاس high (کلاس والد) چندین شیء (4 شیء) تعریف می شود : for (int j=2 ; j<6 ; j++) { high h = new high (); } کلاس low از کلاس middle ارث بری می کند، پس از کلاس high هم ارث بری خواهد کرد : class low : middle { تابع سازنده بدون پارامتری برای low تعریف نشده است، پس همانند تابع سازنده بدون پارامتر middle خواهد بود که کار خاصی نمی کرد (دقت کنید که تابع سازنده بدون پارامتری که از کلاس high به ارث رسیده و سپس تابع سازنده بدون پارامتری که از کلاس middle به ارث رسیده در همان ابتدای ایجاد شدن شی و در شرایطی اجرا می شود) تابع سازنده با یک پارامتر ورودی int برای کلاس low تعریف شده که مقدار متغیر ورودی و متغیر c در خروجی چاپ می کند و سپس از نوع کلاس high یک شیء می سازد (توابع سازنده بدون پارامتری که از کلاس high و middle به ارث رسیده در همان ابتدای ایجاد شدن شی و در شرایطی اجرا می شود) : public low (int z) { System.Console.WriteLine("{0} I am the {1} from low !", z,c); high h = new high (z + 4); } خب، حالا می توانیم بر اساس خروجی هایی که هر کلاس چاپ می کند بررسی شان کنیم : کلاس high : کلاس high اگر بدون پارامتر ورودی ایجاد شود (کلاس سازنده بدون پارامتر ورودی): هیچ خروجی ای نخواهد داشت ولی مقدار c را یک واحد افزایش می دهد. کلاس high اگر با پارامتر ورودی int ایجاد شود : مقدار متغیر ورودی و متغیر c را در یک سطر چاپ می کند (مقدار c تغییری نخواهد کرد). کلاس low : کلاس low اگر بدون پارامتر ورودی ایجاد شود (کلاس سازنده بدون پارامتر ورودی) : هیچ خروجی ای نخواهد داشت ولی مقدار c را یک واحد افزایش می دهد (تابع سازنده high). کلاس low اگر با پارامتر ورودی int ایجاد شود، مراحل زیر را طی می کند : 1) ابتدا مقدار c یک واحد افزایش خواهد یافت (تابع سازنده high) 2) مقدار متغیر ورودی و متغیر c را در یک سطر چاپ می کند. 3) یک شیء از کلاس high خواهد ساخت که مقدار متغیر ورودی اش 4 تا بیشتر است. مراحلی که بعد از ساختن این شیء high طی می شود همانند شرح خروجی کلاس high است که قبلا ذکر شده : 3-1) تابع سازنده کلاس high مقدار متغیر ورودی (4 واحد افزایش یافته) و متغیر c (بدون تغییر) را در یک سطر چاپ می کند (مقدار c در high تغییری نخواهد کرد). کلاس middle : کلاس middle اگر بدون پارامتر ورودی ایجاد شود (کلاس سازنده بدون پارامتر ورودی) : هیچ خروجی ای نخواهد داشت ولی مقدار c را یک واحد افزایش می دهد (تابع سازنده high). کلاس middle اگر با پارامتر ورودی int ایجاد شود مراحل زیر را طی می کند : 1) مقدار c را یک واحد افزایش می دهد (تابع سازنده high) 2) ابتدا یک شیء از کلاس low خواهد ساخت که مقدار متغیر ورودی اش 4 تا کمتر است. مراحلی که بعد از ساختن این شیء low طی می شود همانند شرح خروجی کلاس low است که قبلا ذکر شده : 2-1) ابتدا مقدار c یک واحد افزایش خواهد یافت (تابع سازنده high) 2-2) بعد از آن در شیء low ساخته شده، مقدار متغیر ورودی (4 واحد کاهش یافته) و متغیر c (یک واحد افزایش یافته) را در یک سطر چاپ می کند. 2-3) در ادامه در همان شیء low، یک شیء از کلاس high ایجاد می شود که مقدار متغیر ورودی اش 4 واحد بیشتر است (از مقدار فعلی که در شیء low دارد). مراحلی که بعد از ساختن این شیء high طی می شود همانند شرح خروجی کلاس high است که قبلا ذکر شده : 2-3-1) در تابع سازنده کلاس high مقدار متغیر ورودی (4 واحد افزایش یافته) و متغیر c را در یک سطر چاپ می کند (مقدار c در high تغییری نخواهد کرد). 3) در ادامه شیء middle مقدار متغیر ورودی و متغیر c را در یک سطر چاپ می کند. 4) در یک حلقه چهار شیء از کلاس high ایجاد می کند که بدون پارامتر ورودی فراخوانی می شوند (تابع سازنده بدون پارامتر) همانطور پیش از مراحل اجرای یک شیء high ذکر شده، صرفا مقدار c چهار بار افزایش می یابد ولی خروجی ای نخواهد داشت. حالا می توانیم روند اجرای تابع main را بررسی کنیم : ابتدا یک آرایه int با پنج عضو ایجاد می شود : static void Main(string[] args) { int [] x = new int[] {90 , 23 , -12 , 13 , 20}; یک شیء از کلاس low با پارامتر ورودی 12- ایجاد می شود (اندیس ها از 0 شروع می شوند پس اندیس 2 از آرایه x سومین عنصر آرایه x است) روند ایجاد شدن این شی مطابق مراحلی است که در شرح ایجاد شدن یک شی از کلاس low با پارامتر ورودی ارائه شد، پس دو سطر در خروجی چاپ خواهد شد و مقدار c به 1 خواهد رسید. low i = new low(x[2]); یک شیء از کلاس middle با پارامتر ورودی 23 ایجاد می شود (اندیس ها از 0 شروع می شوند پس اندیس 1 از آرایه x دومین عنصر آرایه x است) روند ایجاد شدن این شی مطابق مراحلی است که در شرح ایجاد شدن یک شی از کلاس middle با پارامتر ورودی ارائه شد، پس سه سطر در خروجی چاپ خواهد شد و مقدار c به 7 خواهد رسید. middle m = new middle (x[1]); یک شیء از کلاس high با پارامتر ورودی 90 ایجاد می شود (اندیس ها از 0 شروع می شوند پس اندیس 0 از آرایه x اولین عنصر آرایه x است) روند ایجاد شدن این شی مطابق مراحلی است که در شرح ایجاد شدن یک شی از کلاس high با پارامتر ورودی ارائه شد، پس یک سطر در خروجی چاپ خواهد شد و مقدار c تغییری نخواهد کرد (در عدد 7 باقی می ماند). high h = new high(x[0]); scooter2005 22 دي 1387, 15:15تشكر و اينكه با توجه به توضيحاتتون بايد بگيم هر وقت پارامتر ورودي نداشتيم در تابع سازنده خروجي چاپ مي شود و هر وقت كه پارامتر ورودي داشتيم خروجي چاپ نميشه ؟ اين نكته رو در مورد هر سه كلاس و تابع سازنده middle ,high ,low ذكر كرديد و به نظرم كمي عجيب اومد . نكته بعدي اينكه وقتي مثلا بگن يه متغير ورودي از نوع رشته name x هم از نوع int تابع سازنده اي بنويسيد كه به ترتيب از نوع رشته و عدد صحيح : رشته ورودي را در فيلد name و عدد را در x ذخيره كند ميشه در مورد اين هم راهنمايي كنيد the_king 22 دي 1387, 18:01تشكر و اينكه با توجه به توضيحاتتون بايد بگيم هر وقت پارامتر ورودي نداشتيم در تابع سازنده خروجي چاپ مي شود و هر وقت كه پارامتر ورودي داشتيم خروجي چاپ نميشه ؟ اين نكته رو در مورد هر سه كلاس و تابع سازنده middle ,high ,low ذكر كرديد و به نظرم كمي عجيب اومد . نكته بعدي اينكه وقتي مثلا بگن يه متغير ورودي از نوع رشته name x هم از نوع int تابع سازنده اي بنويسيد كه به ترتيب از نوع رشته و عدد صحيح : رشته ورودي را در فيلد name و عدد را در x ذخيره كند ميشه در مورد اين هم راهنمايي كنيد بله، همینطوره، چون وقتی پارامتر ورودی نداشته باشید، طبعا تابع سازنده ای اجرا میشه که بدون پارامتر ورودی است، در هر سه کلاس هم اگر توابع سازنده بدون پارامتر ورودی را بررسی کنید، خروجی ای چاپ نمی کنند. کلاس high فقط مقدار متغیر c را یک واحد افزایش می دهد و دو کلاس دیگر هم عملا جز فراخوانی همین روتین (که بطور خودکار انجام می شود و جزو ویژگی های ذاتی ارث بری است) کار دیگری انجام نمی دهند. اینکه دو تابع همنام بتوانند با پارامتر های ورودی و خروجی متفاوتی ایجاد شوند جزو قابلیت های زبان #C است. مثال زیر یک کلاس به نام myclass معرفی می کند که دو متغیر x و name و سه تابع سازنده جداگانه دارد. تابع print این کلاس مقادیر دو متغیر را در خروجی چاپ می کند. برای نمونه سه شیء a و b و c با پارامتر ورودی از نوع متفاوتی ایجاد می شوند : using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { class myclass { int x; string name; public myclass(int i) { x = i; } public myclass(string s) { name = s; } public myclass(int i, string s) { x = i; name = s; } public void print() { Console.WriteLine ("x = {0}, Name = "{1}"" ,x, name); } } static void Main(string[] args) { myclass a = new myclass(12); myclass b = new myclass("book"); myclass c = new myclass(76, "magic"); a.print(); b.print(); c.print(); Console.ReadKey(true); } } } scooter2005 22 دي 1387, 19:20در برنامه اول تابع main خیلی خوب توضیح دادید که جواب هر اندیس به چه صورت هست ولی در پایان اشاره داشتید که روند ایجاد شدن این شی مطابق مراحلی است که در شرح ایجاد شدن یک شی از کلاس high با پارامتر ورودی ارائه شد، پس یک سطر در خروجی چاپ خواهد شد و مقدار c تغییری نخواهد کرد (در عدد 7 باقی می ماند). این عدد 7 رو توضیح می دهید . scooter2005 22 دي 1387, 19:32در مورد استاتیک بودن تابع هم اگر عنایت کنید و توضیح بدید ممنون میشم . "پس برای کلیه شیء هایی که از این کلاس (و کلاس های وارث) ساخته می شود، صرفا یک مقدار مشترک c وجود خواهد داشت :" the_king 22 دي 1387, 21:13در مورد استاتیک بودن تابع هم اگر عنایت کنید و توضیح بدید ممنون میشم . "پس برای کلیه شیء هایی که از این کلاس (و کلاس های وارث) ساخته می شود، صرفا یک مقدار مشترک c وجود خواهد داشت :" متغیر های static یک کلاس، موقعیت مشخصی از حافظه رو اشغال می کنند و با ایجاد شیء جدید از کلاس، نمونه های جدیدی از آن متغیر ها را ایجاد نمی کند و همچنان از همان نمونه اولیه استفاده می شود، همانند یک متغیر سراسری برنامه. اگر مقدار c در یک شیء از کلاس high یا middle یا low برابر 7 باشد، در بقیه شیء ها هم همان 7 است، چه از کلاس high باشد و چه از کلاس middle و چه از کلاس low. به همین دلیل فرضا اگر یک شیء از کلاس ساخته شود و مقدار متغیر static اش را به عددی تغییر دهد، آن مقدار در تمامی سایر اشیائی که از آن کلاس ایجاد شده همان مقدار مشخص خواهد بود. در برنامه اول تابع main خیلی خوب توضیح دادید که جواب هر اندیس به چه صورت هست ولی در پایان اشاره داشتید که روند ایجاد شدن این شی مطابق مراحلی است که در شرح ایجاد شدن یک شی از کلاس high با پارامتر ورودی ارائه شد، پس یک سطر در خروجی چاپ خواهد شد و مقدار c تغییری نخواهد کرد (در عدد 7 باقی می ماند). این عدد 7 رو توضیح می دهید . اگر ما شیء ای از کلاس high را بدون پارامتر ورودی بسازیم، مقدار متغیر c یک واحد افزایش می یابد و اگر شیء را با پارامتر ورودی بسازیم تغییری در مقدار متغیر c رخ نمی دهد. هر بار که یک شیء از کلاسهای middle و low ساخته میشه، به دلیل اینکه وارث کلاس high هستند، تابع سازنده بدون پارامتر high بطور خودکار فراخوانی میشه. توی اون تابع سازنده هم مقدار متغیر c یک واحد افزایش پیدا می کنه. پس در نتیجه اگر هیچکار خاصی هم در تابع سازنده کلاسهای low و middle هم انجام ندهیم، این یک واحد افزایش c سر جایش هست. علاوه بر اون در هنگام ایجاد یک شیء از کلاس middle با پارامتر ورودی، یک شیء از کلاس low ساخته میشه (1 واحد افزایش دیگه) و چهار شیء از کلاس high (چهار واحد افزایش دیگه)، پس اگر یک شیء از کلاس middle را با پارامتر ورودی بسازید متغیر c بجای 1 واحد افزایش، 6 واحد افزایش خواهد داشت. دقت کنید که اگر یک شیء از کلاس middle را بدون پارامتر ورودی بسازید این عملیات های اضافه اجرا نمی شوند و متغیر c فقط همان 1 واحد افزایشی را خواهد داشت که از کلاس high به ارث برده. ایجاد یک شیء از کلاس low همواره یک واحد افزایش خواهد داشت، چون با وجود اینکه در تابع سازنده با پارامتر اش یک شی از کلاس high ساخته می شود، این ایجاد شیء با پارامتر ورودی است (z + 4) و تاثیری در مقدار c نخواهد داشت. حالا کافیست ایجاد شدن اشیائی که در تابع main رخ می دهند را بررسی کنیم : در ابتدا مقدار اولیه c صفر است. یک شیء از کلاس low می سازیم و مقدار c یک واحد افزایش می یابد (1). low i = new low(x[2]); یک شیء از کلاس middle می سازیم و مقدار c شش واحد زیاد می شود (1 + 6) middle m = new middle (x[1]); پس فعلا مقدار c برابر 7 است. یک شیء از کلاس high می سازیم که چون با پارامتر ورودی است، تاثیری روی مقدار c ندارد. high h = new high(x[0]); این همان مساله ای بود که گفتم در عدد 7 باقی می ماند و تغییری نمی کند. scooter2005 23 دي 1387, 00:45و از نوع کلاس high (کلاس والد) چندین شیء (4 شیء) تعریف می شود : کد: for (int j=2 ; j<6 ; j++) { high h = new high (); } در ابتدا c برابر با 0 هست و بعد يك واحد اضافه و يك مي شود تا اينجا كاملا مشخص هست حالا بعدش چطوري در اين جا 4 شي تعريف ميشه و در مراحل بعدي 6 واحد توليد ميشه كه با يك ما جمع ميشه the_king 23 دي 1387, 01:15در ابتدا c برابر با 0 هست و بعد يك واحد اضافه و يك مي شود تا اينجا كاملا مشخص هست حالا بعدش چطوري در اين جا 4 شي تعريف ميشه و در مراحل بعدي 6 واحد توليد ميشه كه با يك ما جمع ميشه مقدار c در حالت فعلی 1 است. کد زیر را در نظر بگیرید : middle m = new middle (x[1]); این کد یک شی از کلاس middle می سازد در حالی که کلاس middle خود از کلاس high ارث بری کرده است، به همین دلیل ساخته شدن هر شیء از کلاس middle ساخته شدن یک شیء از کلاس high هم هست. این ساخته شدن شیء high ذاتی و خودکار است و پارامتر ورودی ای ندارد، به همین دلیل روتین سازنده بدون پارامتر کلاس high در همان ابتدای کار فراخوانی شده است : public high() { c++; } پس فعلا یک واحد افزایش مقدار c انجام شده است و مقدار c از 1 به 2 تغییر کرده است. حالا می رسیم به نحوه ایجاد شی در کلاس middle، چون ایجاد شیء با پارامتر ورودی انجام شده ([1]x)، تابع سازنده با پارامتر ورودی فراخوانی می شود : public middle (int z) { low i = new low (z-4); System.Console.WriteLine("{0} I am the {1} from middle !", z,c); for (int j=2 ; j<6 ; j++) { high h = new high (); } } حالا این تابع را سطر به سطر بررسی می کنیم. ابتدا یک شیء جدید از کلاس low ساخته می شود، خود کلاس low وارث کلاس high است و یک واحد افزایش c را در پی دارد (پس مقدار c از 2 به 3 تغییر می کند) : low i = new low (z-4); سطر بعدی چاپ پیغام است که تاثیری روی مقدار c ندارد : System.Console.WriteLine("{0} I am the {1} from middle !", z,c); سطر بعدی یک حلقه for است که مقدار متغیر j را از 2 آغاز می کند و تا زمانی ادامه می باید که مقدار j از 6 کوچکتر باشد، یعنی برای اعداد 2، 3، 4 و 5 حلقه تکرار می شود و وقتی به 6 می رسد از حلقه خارج می شود. تعداد تکرار اجرای کدهای درون این حلقه برابر است با 4 بار (با شماره های 2، 3، 4، 5) : for (int j=2 ; j<6 ; j++) { در داخل حلقه شیء ای از کلاس high ایجاد می شود، که یک واحد افزایش مقدار c را در پی دارد : high h = new high (); } چون تعداد تکرار کد بالا 4 بار است (چون حلقه 4 بار تکرار می شود)، پس در مجموع در طی اجرای حلقه 4 واحد به مقدار c افزوده می شود. (مقدار c از 3 به 7 تغییر می کند).




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

[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 220]

bt

اضافه شدن مطلب/حذف مطلب







-


گوناگون

پربازدیدترینها
طراحی وب>


صفحه اول | تمام مطالب | RSS | ارتباط با ما
1390© تمامی حقوق این سایت متعلق به سایت واضح می باشد.
این سایت در ستاد ساماندهی وزارت فرهنگ و ارشاد اسلامی ثبت شده است و پیرو قوانین جمهوری اسلامی ایران می باشد. لطفا در صورت برخورد با مطالب و صفحات خلاف قوانین در سایت آن را به ما اطلاع دهید
پایگاه خبری واضح کاری از شرکت طراحی سایت اینتن