PDA

View Full Version : سوال: تفاوت ها، ویژگی ها، و کاربردهای C و #C



++Hichkas
یک شنبه 16 تیر 1387, 15:29 عصر
سلام دوستان
من دانشجوی کامپیوتر هستم و تا حدی با پاسکال و ++c آشنایی دارم . تصمیم داشتم برنامه نویسی با c را شروع کنم که یکی از اساتیدم توصیه کرد که #c را یاد بگیرم( البته c را نیز به توصیه ی یکی دیگر از اساتیدم ) و الان کاملا گیج شده ام :گیج: و نمی دانم که کدام را شروع به یاد گیری کنم . هرچند هر دو از یک خانواده هستند .می خواستم تفاوت آن دو را بدانم و این که بهتر است از کدام شروع به یاد گیری کنم و برای هر کدام چه منبعی را توصیه می کنید . مچکرم :لبخندساده:

mehdad.koulab
یک شنبه 16 تیر 1387, 20:37 عصر
سلام دوست عزیز
معمولا برای شروع برنامه نویسی زبان c رو باید یاد گرفت چون یه زبان همه فن حریفه هر کاری بخوای تو c میتونی بکنی ولی اگه پیشنهاد بخوای من میگم اول c رو یاد بگیر بعد برو سراغ #c که زبان بسیار عالی برای برنامه نویسی است.

pars.engineer
یک شنبه 16 تیر 1387, 21:03 عصر
سلام،
در مورد توصيه هاي اساتيدتان بايد بگويم كه هر دو نظر، درست است.
البته بايد اين را بگويم كه زبانهاي C و #‍‍C متعلق به دو برهه ي زمانيه متفاوتند و #C حدودا 20 سال پس از زبان برنامه نويسي C متولد شده است.
پس در مورد نوشتن برنامه هاي كاربردي و به روز حتما #C بيشتر به درد شما خواهد خورد. اما نكته اي كه بسيار مهم و شايان ذكر است اين است كه برنامه سازي فقط كد نويسي نيست(در واقع همانطور كه مي دانيد عنوان درسي كه در دانشگاه تدريس مي گردد برنامه سازي مي باشد كه برنامه نويسي زير مجموعه اي از آن است) و تسلط به الگوريتم هاي بهينه ( براي مثال در مرتب سازي استفاده از روشهاي Buble sort, Heap Sort, Selection Sort, Tree Sort, Quick Sort و ..) و همچنين تسلط به ساختار هاي مختلف داده ها مانند آرايه ها ، اشاره گرها، استراكچرها، صف، پشته و ليست پيوندي و آشنايي با برنامه نويسي Object Orient باعث مي شود شما با هر زباني كه كار كنيد جزو برنامه نويسان خوب (البته نه حرفه اي ) به حساب بياييد.
به عنوان سخن آخر اگر خواهان اين هستيد كه برنامه نويسي حرفه اي شويد ، پيشنهاد مي كنم كه از زبان ++C و نه ‍C (به دليل آشنايي با شي گرايي چون اصول كار #C بر شي گرايي و #C يك زبان خالص شي گراست) شروع نماييد، به عنوان مرجع هم كتاب آقاي جعفر نژاد قمي را پيشنهاد مي كنم.
و پس از تسلط نسبي به #C روي آوريد.
براي #C نيز كتاب برادلي جونز و براي # Visual C نيز كتاب آقاي محمد هاشميان را پيشنهاد ميكنم كه نسخه ي PDF آن در سايت موجود مي باشد.

Nima_NF
یک شنبه 16 تیر 1387, 23:01 عصر
اگر ++C را می دانید پس C را نیز می دانید. چرا که بیشترین و بزرگترین تفاوت ++C با C اضافه شدن قابلیت شئی گرایی و کتابخانه هایی مانند STL هست، که در توسعه نرم افزار های کاربردی بین این دو بهتر هست با ++C به جای C ادامه دهید.

متاسفانه 99.99% از اساتید دانشگاه در کار با زبان ++C/C فقط آشنایی با برنامه نویسی تحت کنسول (غیر رابط کاربری) دارند و یا برای کار با میکروکنترلر با آن آشنا هستند.
چیزی که در دانشگاه به شما یاد می دهند و یا توصیه می کنند همان برنامه نویسی کنسولی هست که فقط یک شروع بیش نیست و بدون برنامه نویسی GUI ( بدون رابط کاربری گرافیکی) عملا کمترین کاربرد را در توسعه نرم افزارهای امروزی دارد.
(به عنوان دانشجو کامپیوتر حداقل باید برنامه نویسی ++C کنسولی را بدانید که در تمامی کتاب ها از جمله ساختمان داده ها و الگوریتم ها از زبان شبهه C استفاده می کنند.)


...هرچند هر دو از یک خانواده هستند ...خیر، شاید در ظاهر شبیه باشند، اما در باطن و نحوه کار کردن 180 درجه با هم متفاوتند.

++C مشخصات زیر را دارد (در مقایسه با #C) :

- کاربرد وسیع در سراسر دنیا ، کارآیی بسیار بالا ، عدم نیاز به .Net و عدم محدودیت در محصولات مایکروسافت مانند ویندوز، امکان برنامه نویسی Native برای سایر سیستم عامل ها مانند لینوکس ، کاربرد وسیع در طراحی بازی های کامپیوتری / نرم افزارهای گرافیکی / سیستمی / نرم افزارهای تجاری در سطح متوسط و بزرگ

- بسیار مشکل تر، زمانبرتر ، امروزه با توجه به حضور #C و برنامه نویسی دات نت در همه جا توسعه با ++C توصیه نمی شود، دارای کاربران بسیار کمتر در کشور ما (!)


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

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

در هر حال با توجه به کاربرد وسیع هر دو زبان، سعی کنید هر دو زبان را یاد بگیرید.

مرجع ++C :
برای برنامه نویسی کنسولی (http://barnamenevis.org/forum/showthread.php?t=101753)

بعد از آن برای برنامه نویسی با رابط کاربری گرافیکی (http://barnamenevis.org/forum/showthread.php?t=86565)


مرجع #C :
کتاب 1600 صفحه ای Visual C# 2005: How to Program, Second Edition که نسخه فارسی آن نیز موجود هست.

موفق باشید

sahmah65
دوشنبه 17 تیر 1387, 05:58 صبح
اگر به سراغ #C بروید وارد دنیای .NET شده اید و این یعنی محصور در محصولات مایکروسافتی خواهید شد.


نه! اصلاً این طوری نیست پس پروژه ی mono چیه ؟ کدهای C# به راحتی در محیط لینوکس و سرویس دهنده های آپاچی اجرا میشن.

Nima_NF
دوشنبه 17 تیر 1387, 14:26 عصر
نه! اصلاً این طوری نیست پس پروژه ی mono چیه ؟ کدهای C# به راحتی در محیط لینوکس و سرویس دهنده های آپاچی اجرا میشن.

به جای پاسخ دادن به این موضوع از شما چند سوال در مورد پروژه mono میکنم:

- آخرین نسخه پیاده سازی شده .Net توسط mono چه نسخه ای هست و الآن آخرین نسخه .Net مایکروسافت چه هست ؟

- با پرداخت 12000 دلار برای یک مدت محدود می توانید برای پروژه های تجاری mono از پشتیبانی بهره مند شوید، چند نفر قادر هستند چنین پولی را برای نرم افزار تجاری خودشان بپردازند؟

مطمئنا خودتان جواب سوالات فوق را می دانید، در این فروم هم قبلا بارها بحث شده است.

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

++Hichkas
دوشنبه 17 تیر 1387, 21:29 عصر
خیلی ممنون از تمامی کسانی که من رو راهنمایی کردن

sahmah65
دوشنبه 17 تیر 1387, 22:44 عصر
از نظر من درگیر شدن با این شیوه برنامه نویسی در لینوکس که یک عده ای آمدند و به شکل غیر استاندارد، بدون ارتباط با سازنده اصلی آن و بدون دریافت مجوز یا لیسانس ، یک پروژه ای را پیاده سازی کرده اند، اصلا قابل قبول نیست و این کار باعث می شود برنامه نویسی در داخل کشورمان از وضع ناهنجار کنونی خودش هم بدتر شود و کیفیت نه چندان خوب کنونی نرم افزارها در کشور به حداقل خود برسد.

چی غیر استاندارده ؟ احتمالاً شما از اون دسته هایی هستید که فکر می کنید کد سی شارپ
به صورت شبیه سازی شده در اون محیط ها پیاده میشه که در این صورت باید عرض کنم که اصلاً اینطوری نیست.وباید بیشتر تحقیق کنید.

در مورد پیشرفت mono هم باید عرض کنم که که اونقدر جلو رفتند که چند ماه بعد از این که
مایکروسافت SilverLight رو عرضه کرد اون ها هم moonLight رو عرضه کردند .

mehdi.mousavi
سه شنبه 18 تیر 1387, 00:11 صبح
سلام دوستان
من دانشجوی کامپیوتر هستم و تا حدی با پاسکال و ++c آشنایی دارم . تصمیم داشتم برنامه نویسی با c را شروع کنم که یکی از اساتیدم توصیه کرد که #c را یاد بگیرم( البته c را نیز به توصیه ی یکی دیگر از اساتیدم ) و الان کاملا گیج شده ام :گیج: و نمی دانم که کدام را شروع به یاد گیری کنم . هرچند هر دو از یک خانواده هستند .می خواستم تفاوت آن دو را بدانم و این که بهتر است از کدام شروع به یاد گیری کنم و برای هر کدام چه منبعی را توصیه می کنید . مچکرم :لبخندساده:

سلام.
اگر با CPP آشنایی دارید، پس حتما باید C رو هم بلد باشید. اگر برخی از استثنا ها رو کنار بذاریم، میتونیم بگیم CPP در واقع Superset زبان C هستش به این معنی که کلیه امکانات موجود در C در CPP نیز دردسترسه. CPP علاوه بر امکانات ساده جدیدی، امکانات مهمی رو که در C هم وجود نداره به اون اضافه می کنه... در واقع می خوام بگم اول C رو یاد بگیرید، اگر می خواهید CPP رو یاد بگیرید.

بازار کار C/CPP نسبت به زبانهای .NET در کشور ما بسیار بسیار کمتره، اما کارهایی که توسط C/CPP انجام میشه عموما hi-tech هستن و مطلقا قابل مقایسه با کارهایی که در محیط .NET انجام میشن، نیست. در برخی از موارد هم تلفیقی از هر دو رو شاهد هستیم، جاییکه NT-Service ها، Driver ها و ... بزبان CPP نوشته میشن و Front-End سیستمها در محیط .NET.

در محیط Native سیستم runtime مراقب کد شما نیست، در صورتیکه در محیط Managed همواره کسی هستش که مراقب باشه شما از Index های یک آرایه تجاوز نکنید، Memory Leak بوجود نیارید (که البته کنترل این مساله در شرایط Circular Referencing حتی در محیط Managed هم در حال حاضر میسر نیست) و ... در کل از نظر سادگی اگر بخواهیم بررسی کنیم، C# بسیار بسیار ساده تر از CPP هست.

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

بخاطر عدم دانش فنی هستش که امروزه برنامه نویسان C# عموما جای override کردن متود OnLoad در فرم، با یه Double Click رخداد Load رو میگیرن و ... اونها نمیدونن vtable چی هستش، یا حتی event ها چطور پیاده سازی شدن. از چنین مسائل ساده ای بگیرید تا مسائل Hi-Tech.

یادگرفتن CPP به تنهایی چیز زیادی بهتون نمیده. بعد از اینکه با کارکرد سیستم عامل آشنا شدین، اونوقت باید بسته به نیازتون یکی از فریمورکهای ATL، STL، WTL، MFC یا چند تا ازاینا رو یاد بگیرین تا بتونید در کنار CPP ازشون استفاده کنید.

اما در C# اوضاع متفاوته. به نظر من C# مثل یه باتلاق زیبا و وسوسه بر انگیز میمونه، که خیلی راحت هر کسی رو که پاشو بذاره توش، به درون خودش میبلعه. وسوه برانگیزه برای اینکه ساده هستش، شما رو میبلعه چون بدون داشتن اطلاعات فنی هم می تونید باهاش برنامه بنویسید! شاید خیلی ها مخالف این حرف تند من باشن، اما واقعیت همینه... بسیاری از اونهایی که با C# برنامه نویسی رو آغاز کردن، نمیدونن یه Preemptive System چیه، اما همین سوال رو از کسانی بپرسید که با Win16/Win32 کارکردن...

در نهایت، در پاسخ به سوال شما باید بازهم تاکید کنم که ابتدا به زیر و بم چگونگی کارکرد سیستم عامل مورد نظرتون که میخواهید براش کد بنویسید آشنا بشید.

Nima_NF
سه شنبه 18 تیر 1387, 00:45 صبح
چی غیر استاندارده ؟ احتمالاً شما از اون دسته هایی هستید که فکر می کنید کد سی شارپ
به صورت شبیه سازی شده در اون محیط ها پیاده میشه که در این صورت باید عرض کنم که اصلاً اینطوری نیست.وباید بیشتر تحقیق کنید.CLI و زبان #C هر دو ISO هستند (مانند ++C ) که هر کسی می تواند استاندارد های آن را دریافت کند و برای سیستم خودش آن را پیاده سازی کند.

اما از آنجایی که #C وابسته به کتابخانه های .Net هست و کتابخانه های .Net مایکروسافت نیز رایگان نیست و ISO هم نیست، لذا افراد باید مبالغ میلیارد دلاری پرداخت کنند تا به طور رسمی اجازه پیاده سازی .Net برای سایر سیستم ها داده شود.

novel هم برای اینکه پولی پرداخت نکند گروهی تشکیل داد و به پیاده سازی های زیر تحت عنوان mono پرداختند:
1) پیاده سازی استاندارد #C و CLI
2) پیاده سازی غیر استاندارد کتابخانه های کلاس .Net Framework

فقط به عنوان یک مشاور توصیه می کنم که باید در هنگام استفاده از mono تمام موارد را در نظر گرفت و در هر پروژه ای نباید از آن استفاده کرد، که می توانید نپذیرید.

در هر حال کسی افراد را از استفاده mono منع نکرده و همچنان هر کسی می تواند تمامی نرم افزار های خود را بدون توجه به موارد فنی بر مبنای آن پیاده سازی کند! (همانطور که تاکنون در بسیاری از موارد در کشور به این شکل عمل می شد)

موفق باشید

deopen
سه شنبه 18 تیر 1387, 12:31 عصر
بحث جالبی بود اتفاقا من هم در حال یادگیریه زبان Cpp هستم دارم کتاب cpp how to program رو از هاروی دیتل و پاول دیتل میخونم .تو فکر اینم که بعد از cpp چیو باید یاد بگیرم من دانش آموز سال دوم هنرستانم رشتم کامپیوتر وای نمی دونید چه قد سطح هم کلاسیام پایینه این جمله رو که Nima_NF گفت 1000 بار معلم برنامه نویسیم به من گفت! ("قبلاز هر چیز باید هدف خود را از برنامه نویسی مشخص کنید، یعنی چه نرم افزار هایی...تا بتوان دقیق تر توصیه انجام داد") من می خوام نرم افزارهای سیستمی و امنیتی رو بنویسم ! همه خیلی گیجم می کنن خیلی! :-(

++Hichkas
سه شنبه 18 تیر 1387, 21:32 عصر
من از یکی از استادیم پرسیدم و اوووووووه چه مخالفتی با #c کرد . که در کل می سه گفت اون گفت که اصلا زبان برنامه نویسی مناسبی نیست ، برنامه نویس رو تنبل بار میاره ، امنیت کافی رو هم که اصلا نداره و ................

emad_67
شنبه 22 تیر 1387, 10:42 صبح
بخاطر عدم دانش فنی هستش که امروزه برنامه نویسان C# عموما جای override کردن متود OnLoad در فرم، با یه Double Click رخداد Load رو میگیرن و ... اونها نمیدونن vtable چی هستش، یا حتی event ها چطور پیاده سازی شدن. از چنین مسائل ساده ای بگیرید تا مسائل Hi-Tech.

سلام، آقا منم یکی از این بی سوادام که هنوز دابل کلیک می کنم :لبخند:
میشه در این مورد بیشتر توضیح بدی؟
وقتی روی فرم دابل کلیک می کنیم به رویداد کلیک اون تابع مورد نظر اختصاص پیدا می کنه، مثلا با کلیک همچین چیزی توسط سیستم انجام میشه، درسته؟


this.Load += new EventHandler(Form1_Load);
حالا اگه ما بیایم و متد onLoad رو override کنیم چه فرقی میکنه؟
البته سطح پایین بگو چون من هیچی C# حالیم نیست.
ممنون

mehdi.mousavi
شنبه 22 تیر 1387, 13:16 عصر
سلام، آقا منم یکی از این بی سوادام که هنوز دابل کلیک می کنم :لبخند:
میشه در این مورد بیشتر توضیح بدی؟
وقتی روی فرم دابل کلیک می کنیم به رویداد کلیک اون تابع مورد نظر اختصاص پیدا می کنه، مثلا با کلیک همچین چیزی توسط سیستم انجام میشه، درسته؟


this.Load += new EventHandler(Form1_Load);
حالا اگه ما بیایم و متد onLoad رو override کنیم چه فرقی میکنه؟
البته سطح پایین بگو چون من هیچی C# حالیم نیست.
ممنون


سلام.
event ها در واقع کاربرد Connection Point ها رو در COM دارن. همونطوری که اونجا یه Component میتونست وقایع مورد نظر خودش رو از طریق Outgoing Interface ها به اطلاع دنیای بیرون برسونه، اینجا هم هدف این هستش که کاربر کلاس شما، در صورت نیاز، از event لود فرم مطلع بشه. اما وقتی شما درون یک فرم هستین، Override کردن متود مورد نظرتون ارجج هستش، تا گوش دادن به event های کلاس خودتون. چرا؟ چون سرعت بالاتری داره و دیگه نیاز به اجرای مکانیزمهای Register کردن یه event نیست! گذشته از این، این واقعه در کلاس فرم شما داره رخ میده، پس چرا باید برای اطلاع از این رویداد مثل یه کاربر خارجی اقدام به شنود event کنید؟ وقتی vtable های کلاستون ساخته شده، و همه چیز طبق مستندات Object Oriented داره پیش میره، بهترین انتخاب OVERRIDE کردن متود هست.

واسه همین هستش که وقتی میخواهید روی کلاسی event ای تعریف کنید، safe-practices میگه باید یک متود protected virtual واسه اون event بنویسید، و داخل اون متود event مورد نظر رو call کنید. تا کلاس مشتق شده بتونه event رو با override کردن متود شما بگیره، و کلاس بیرونی با مکانیزمهای eventing ای که از اونها یاد شده از رویداد مورد نظر مطلع بشه.

اما با این حال بسیاری از کدهای نوشته شده در C# از این قاعده پیروی نمیکنن، و در نتیجه وقتی کسی میخواد از چنین کلاسهایی derive بشه، امکان override کردن متود مورد نظر خودش رو نداره.

پاورقی: از شجاعتتون خوشم اومد. مطمئنا دیگه از الان شما جزء اون افراد نیستین.

emad_67
شنبه 22 تیر 1387, 16:59 عصر
خیلی خیلی ممنون از توضیحات خوبت.
یه سوال دیگه برام پیش اومد.
شما در یه قسمتی گفتی که:

واسه همین هستش که وقتی میخواهید روی کلاسی event ای تعریف کنید، safe-practices میگه باید یک متود protected virtual واسه اون event بنویسید، و داخل اون متود event مورد نظر رو call کنید. تا کلاس مشتق شده بتونه event رو با override کردن متود شما بگیره، و کلاس بیرونی با مکانیزمهای eventing ای که از اونها یاد شده از رویداد مورد نظر مطلع بشه.میشه در این مورد یه مثل با کد بزنی؟
من درست منظور شما رو از اینکه گفتین "تا کلاس مشتق شده بتونه event رو با override کردن متود شما بگیره" رو درست نفهمیدم. مثلا اگه من یه event توی یک کلاس به صورت protected تعریف کنم، خوب قاعدتا با مشتق کردن یه کلاس از این کلاس به event تعریف شده اون هم دسترسی دارم، پس تعریف یه متد protected virtual و override اون در کلاس مشتق شده برای چیه؟
البته این مشکل من از اینجاست که هنوز درست نفهمیدم که وقتی متد onLoad رو oevrride می کنیم چه فرایندی رخ میده که این متد هنگام لود فرم فراخوانی میشه.
ممنون میشم اگه بیشتر در این مورد توضیح بدید.
با تشکر

mehdi.mousavi
شنبه 22 تیر 1387, 17:41 عصر
خیلی خیلی ممنون از توضیحات خوبت.
یه سوال دیگه برام پیش اومد.
شما در یه قسمتی گفتی که:
میشه در این مورد یه مثل با کد بزنی؟
من درست منظور شما رو از اینکه گفتین "تا کلاس مشتق شده بتونه event رو با override کردن متود شما بگیره" رو درست نفهمیدم. مثلا اگه من یه event توی یک کلاس به صورت protected تعریف کنم، خوب قاعدتا با مشتق کردن یه کلاس از این کلاس به event تعریف شده اون هم دسترسی دارم، پس تعریف یه متد protected virtual و override اون در کلاس مشتق شده برای چیه؟
البته این مشکل من از اینجاست که هنوز درست نفهمیدم که وقتی متد onLoad رو oevrride می کنیم چه فرایندی رخ میده که این متد هنگام لود فرم فراخوانی میشه.
ممنون میشم اگه بیشتر در این مورد توضیح بدید.
با تشکر


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



public class MyEntity
{
public event EventHandler Changed = null;
protected event EventHandler Whatever = null; //This has got a special use!

private Int32 a = 0;

public Int32 A
{
get { return this.a; }
set
{
if (this.a == value)
return;

this.a = value;
OnChanged(this, EventArgs.Empty);
}
}

protected virtual void OnChanged(Object sender, EventArgs e)
{
if (Changed != null)
Changed(sender, e);
}
}

public class MyDerivedEntity: MyEntity
{
protected override void OnChanged(object sender, EventArgs e)
{
//Do whatever suits you... This conforms to object oriented guidelines!
base.OnChanged(sender, e);
}
}

public class User
{
public void Run()
{
MyEntity me = new MyEntity();
//We (as the event subscriber) do not have access to me.Whatever event, so what?

//On the other hand, we the Changed event could be easily subscribed...
me.Changed += new EventHandler(delegate(Object sender, EventArgs e) { });
}
}


همونطوریکه میبینید، یه protected event (طبق پیشنهاد شما) ایجاد کردم، اما در کلاس Run که همون Subscriber من هستش، اجازه دسترسی به این event رو بدلیل protected بودن ندارم. این بدین معنی هستش که اینجا نیازی به تعریف Whatever بصورت event نبوده! چون وقتی Subscriber ای public نداشته باشم، event بودن Whatever هم بی معنیه. (protected تعریف کردن یه event البته استفاده خاصی داره، و اونهم به منظور کنترل Subscriber ها بهنگام Subscribe/Unsubscribe هستش که از حوصله بخث خارجه).

در عوض، یه event دیگه دارم به اسم Changed که اولا Public هستش، (در نتیجه Subscriber من که همون متود Run کلاس User هستش میتونه subscribe بشه واسش)، ثانیا متودی دارم به اسم OnChanged.

کلاس User ام چون Subscriber هستش و از بیرون دوست داره مطلع بشه از Changed event باید Subscribe بشه. اما کلاس MyDerivedEntity که اونم دوست داره از این مساله مطلع بشه، دیگه نیازی به Subscribe شدن واسه گرفتن event نداره، چرا؟ چون از MyEntity داره Derive میشه، و در نتیجه خطائص اونو به ارث میبره.

حالا تو کلاس فرم هم همین اتفاق داره میفته. چون کلاس شما از کلاس فرم مشتق شده، دیگه نیازی به مکانیزم Subscription برای اطلاع از Load Event ندارین. کافی هستش OnLoad رو override کنید و bingo!

اما کسی که از کلاس فرم شما داره استفاده میکنه (مثل یه فرم دیگه) اگه خواست از این مساله مطلع بشه، باید به مکانیزم Subscription رو بیاره، چون اون یه کاربر بیرونی محسوب میشه و دسترسیهایی رو که شما در کلاس دارین (مثل vtable و ...) اون نداره.

emad_67
شنبه 22 تیر 1387, 21:31 عصر
ممنون دوست عزیز
خیلی لطف کردی
بلاخره متوجه شدم.

linux
یک شنبه 23 تیر 1387, 09:57 صبح
بحث جالبی بود اتفاقا من هم در حال یادگیریه زبان Cpp هستم دارم کتاب cpp how to program رو از هاروی دیتل و پاول دیتل میخونم .تو فکر اینم که بعد از cpp چیو باید یاد بگیرم من دانش آموز سال دوم هنرستانم رشتم کامپیوتر وای نمی دونید چه قد سطح هم کلاسیام پایینه این جمله رو که Nima_NF گفت 1000 بار معلم برنامه نویسیم به من گفت! ("قبلاز هر چیز باید هدف خود را از برنامه نویسی مشخص کنید، یعنی چه نرم افزار هایی...تا بتوان دقیق تر توصیه انجام داد") من می خوام نرم افزارهای سیستمی و امنیتی رو بنویسم ! همه خیلی گیجم می کنن خیلی! :-(

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

linux
یک شنبه 23 تیر 1387, 10:11 صبح
من از یکی از استادیم پرسیدم و اوووووووه چه مخالفتی با #c کرد . که در کل می سه گفت اون گفت که اصلا زبان برنامه نویسی مناسبی نیست ، برنامه نویس رو تنبل بار میاره ، امنیت کافی رو هم که اصلا نداره و ................

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

Salar Ashgi
یک شنبه 23 تیر 1387, 16:44 عصر
سلام دوست عزیز !!!

اگه شما برنامه نویسی رو از نظر باز شدن ذهن و تفکر کردن رو مساله میخواهید پیشنهاد من(و استادان

ما) ++C است که کاملا شما را برای الگوریتم نویسی و حل مساله آماده میکند !!! و من خودم شخصا (تقریبا همه) به این اعتقاد ندارم که مبنای سی پلاس پلاس ، یاد گرفتن سی هستش ، چرا که
سی پلاس پلاس علاوه بر داشتن ویژگی های کامل سی چیزهایی خیلی بیشتر از آن دارد که همان
شی گرا بودنش چیز کمی نیست !!! ولی اگه میخواهید بیشتر به دیدگاه کاربردی و نوشتن برنامه های ویژوالی روی بیاورید پیشنهاد 100% من فقط C#‎ است چراکه با بهره گیری از فناوری NET FrameWork حاوی تمام ابزارهای لازم(دارای حدودا 2500 کلاس) برای نوشتن برنامه های ویندوزی در اختیار کاربر قرار میدهد !!!

Nima_NF
یک شنبه 23 تیر 1387, 17:57 عصر
ولی اگه میخواهید بیشتر به دیدگاه کاربردی و نوشتن برنامه های ویژوالی روی بیاورید پیشنهاد 100% من فقط #C است چراکه با بهره گیری از فناوری NET FrameWork حاوی تمام ابزارهای لازم(دارای حدودا 2500 کلاس) برای نوشتن برنامه های ویندوزی در اختیار کاربر قرار میدهد !!!
چون دانشجوی سال اول هستید این نکته را ذکر می کنم که ++C را با زبانی مختص برنامه های تحت کنسول اشتباه نگیرید.

شما از طریق MFC و Win32 با ++C همه آن امکانات و کلاس ها را نه تنها در اختیار دارید بلکه بسیار بیشتر از آن هم برایتان موجود هست و حتی اگر هم خواستید می توانید برنامه های native نوشته شده از طریق ++C خود را با قابلیت های NET FrameWork ترکیب کنید (با C++/CLI) و از کلاس های آن بهره ببرید.

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

Nima_NF
دوشنبه 24 تیر 1387, 02:20 صبح
چندتا پست قبل تر شما یکی از بهتر دلایل برای استفاده از C# را عنوان کردید.
کلا بحث بر سر پول و درآمد هست،مثل : هیچ گربه برای رضای خدا موش نمیگیره
پشت سر هر کاری منافع مادی (یا شاید منافع معنوی) قرار دارد.
این نیاز بازار هست که....
درست هست که باید مسائل مالی را در نظر گرفت، اما چقدر خوب هست که با تحقیق عمیق تر به این نتیجه رسید.
متاسفانه اکثر افرادی که برنامه نویس ++C در سطح کاربردی نیستند چنین تفکری در ذهن دارند که کاملا اشتباه هست و فکر می کنند برنامه نویسان ++C بی کار می مانند، چیزی که هنوز حرف اول را در دنیا می زند.

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

در حال حاضر اگر دوستان به آگهی های استخدامی برنامه نویسی داخل کشور مراجعه کنند، می بینند که همچنان در کنار #C دنبال برنامه نویسان ++C می گردند (از شرکت ها و موسسات معتبر بزرگ مانند بانک ها گرفته تا شرکت های کوچک نرم افزاری که در همین چند ماه اخیر، آگهی چند شرکت نیز برای من ارسال شد که در آن ها ذکر شده بود اگر فرد مسلطی را می شناسید معرفی کنید که متاسفانه وجود نداشت!).

این یعنی وجود یک شغل، که در آمد خوبی هم دارد و اما کجاست برنامه نویس مسلط آن ؟

سال ها قبل که همه مردم دنیا برنامه های خود را با ++C می نوشتند مردم ما آن ها را با Visual basic و Delphi می نوشتند و الآن هم که زبانی راحت تر از آن ها یعنی #C آمده بدتر از قبل همه بدون استثنا به سراغ آن رفته اند.
هنوز بسیاری از شرکت های برنامه نویسی سراسر دنیا (حتی کوچک و نوپا) برای توسعه نرم افزار های جدید خود از ++C استفاده می کنند، یعنی آن ها پول زیادی دارند که از #C استفاده نمی کنند؟
خیر ضعف های متعددی وجود دارد که این راه را پیش رویشان قرار می دهد و همه را وادار به استفاده از #C نمی کند.

درست هست که گفتم سریع تر بودن در توسعه یک مزیت هست، اما نباید همه کارهای برنامه نویسی را فدای این سرعت توسعه کرد و نباید در ازای این سرعت، محصول ضعیفی عرضه کرد، مثل برخی از تولیدات سریع و اما ضعیف و بی کیفیت که در چین صورت می گیرد.

linux
دوشنبه 24 تیر 1387, 08:20 صبح
درست هست که باید مسائل مالی را در نظر گرفت، اما چقدر خوب هست که با تحقیق عمیق تر به این نتیجه رسید.
متاسفانه اکثر افرادی که برنامه نویس ++C در سطح کاربردی نیستند چنین تفکری در ذهن دارند که کاملا اشتباه هست و فکر می کنند برنامه نویسان ++C بی کار می مانند، چیزی که هنوز حرف اول را در دنیا می زند.

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

در حال حاضر اگر دوستان به آگهی های استخدامی برنامه نویسی داخل کشور مراجعه کنند، می بینند که همچنان در کنار #C دنبال برنامه نویسان ++C می گردند (از شرکت ها و موسسات معتبر بزرگ مانند بانک ها گرفته تا شرکت های کوچک نرم افزاری که در همین چند ماه اخیر، آگهی چند شرکت نیز برای من ارسال شد که در آن ها ذکر شده بود اگر فرد مسلطی را می شناسید معرفی کنید که متاسفانه وجود نداشت!).

این یعنی وجود یک شغل، که در آمد خوبی هم دارد و اما کجاست برنامه نویس مسلط آن ؟

سال ها قبل که همه مردم دنیا برنامه های خود را با ++C می نوشتند مردم ما آن ها را با Visual basic و Delphi می نوشتند و الآن هم که زبانی راحت تر از آن ها یعنی #C آمده بدتر از قبل همه بدون استثنا به سراغ آن رفته اند.
هنوز بسیاری از شرکت های برنامه نویسی سراسر دنیا (حتی کوچک و نوپا) برای توسعه نرم افزار های جدید خود از ++C استفاده می کنند، یعنی آن ها پول زیادی دارند که از #C استفاده نمی کنند؟
خیر ضعف های متعددی وجود دارد که این راه را پیش رویشان قرار می دهد و همه را وادار به استفاده از #C نمی کند.

درست هست که گفتم سریع تر بودن در توسعه یک مزیت هست، اما نباید همه کارهای برنامه نویسی را فدای این سرعت توسعه کرد و نباید در ازای این سرعت، محصول ضعیفی عرضه کرد، مثل برخی از تولیدات سریع و اما ضعیف و بی کیفیت که در چین صورت می گیرد.
برای یک برنامه نویس حرفه ای و مسلط به c,c++ همیشه خدا کار هست.
در کشور ما 95 درصد برنامه ها ، برنامه هایی هستند که با دیتابیس کار می کنند و اگر ما با کیفیت چینی ها هم کار کنیم راضی کننده است.

++Hichkas
سه شنبه 25 تیر 1387, 01:12 صبح
سلام دوستان:لبخندساده:
من هم یک دانشجوی سال اولی هستم ، و به خاطر همین هم هستش (البته به من نخندید) که از بعضی از مواردی که از اونها صحبت می کنید چیزی نمی فهمم ،من دانشجوی پیام نور هستم ، نمی دونم که در مورد این دانشگاه چه جوری فکر می کنید ، ولی می گم که بدونید که درس خوندن توی یه همچین دانشگاهی خیلی سخته و برای همین هم هستش که سعی ما بر این که خودمون پیشرفت کنیم ،برای اینکه کلاس کمتری برای ما تشکیل می شه ، ولی من از این موضوع اصلا ناراحت نیستم . اساتید خلاصه ی مطالب را می گویند آن هم چه خلاصه گویی هایی ، تازه با این همه خلاصه کردن ها هنوز وقت کم می اورند . :عصبانی:
مثلا همین ترم که گذشت اصلا شی گرایی درس داده نشد . و ما باید خودمون می خوندیم ، البته من نمی دونم تا چه حدی از امتحانات پیام نور اطلاع دارید .من برای همین هستش که باید در تابستان تلاشی مضاعف داشته باشم . ولی هنوز هدفی رو برای برنامه نویسی تعییین نکردم و به راهنمایی زیادی احتیاج دارم .:خجالت:

A.S.Roma
سه شنبه 25 تیر 1387, 20:42 عصر
سلام

خوب شد من این تاپیک رو دیدم !!!
من تقریبا در پایان مراحل برنامه نویسی کنسولی ++C هستم . و ظاهرا به غلط تصورم بر این بود که ++C محدود به برنامه نویسی کنسولی و ... است و ...

از اساتید اهل فن ( آقا نیما مدیر محترم بخش و... ) لطفا متریالی( کتاب و ... )که برنامه نویسی غیر کنسولی ++C را دنبال می کنند را به من معرفی کنید. در مورد پلت فرم های MFC , Win32 و ... لطفا بیشتر توضیح دهید.

خیلی از لطفتان ممنونم !

Nima_NF
چهارشنبه 26 تیر 1387, 00:35 صبح
و ظاهرا به غلط تصورم بر این بود که ++C محدود به برنامه نویسی کنسولی و ... است و ... اکثر نرم افزارهای تجاری خارجی که در کامپیوتر خود از آن ها استفاده می کنید با این زبان نوشته شده اند.



لطفا متریالی( کتاب و ... )که برنامه نویسی غیر کنسولی ++C را دنبال می کنند را به من معرفی کنید. در مورد پلت فرم های MFC , Win32 و ... لطفا بیشتر توضیح دهید.

در مقاله زیر کلیه روش های مرسوم به طور کامل توضیح داده شده است که می توانید مطالعه کنید: (از برنامه نویسی ویندوز با Win32 و MFC گرفته تا تولکیت های GUI مانند +Qt ، Wxwidgets ، GTK و... برای نوشتن برنامه برای تمامی سیستم عامل ها با زبان ++C/C)
برنامه نویسی ++C/C از نوع Native یا managed ؟ (http://barnamenevis.org/forum/showthread.php?t=94381)

در انتهای آن نیز لینک معرفی نرم افزار های نوشته شده با ++C آورده شده است.

لیست کتاب ها در لینک زیر معرفی شده است:
لیست کتاب های برتر (http://barnamenevis.org/forum/showthread.php?t=86565)

برخی از وب سایت های جامع و آموزشی برتر برای MFC ، Win32 و VCL نیز در پست اول لینک زیر معرفی شده است و در ادامه آن آموزش های ابتدایی win32 :
برنامه نویسی گرافیک در C و ++C (http://barnamenevis.org/forum/showthread.php?t=103584)

MSJazayeri
شنبه 29 تیر 1387, 16:30 عصر
من خودم تا حالا با n تا زبان برنامه نویسی کار کردم و نظرم اینه که ++C بهترین زبان برنامه نویسی برای پیاده سازی الگوریتم هاست.