ورود

نسخه کامل مشاهده نسخه کامل : اشاره گر تو C#



darya_66_12_12
14-04-2010, 18:59
بچه ها من تو اشاره گرا تو C# چند تا سوال دارم
ممنون ميشم 1نفر بهم جواب ده:31:
اول اينكه اصلا چرا C# يا gava اشاره گر نداره؟؟؟
اينكه اشاره گر نداره باعث كند شدنش نمي شه؟؟؟؟؟؟؟
اهااا
اصلا اگه بخوايم از اشاره گر استفاده كنيم چيكار بايد كنيم؟؟؟؟؟

darya_66_12_12
14-04-2010, 21:30
چراااا هيچكس جوابموو نميده؟:41:

mahdi7s
14-04-2010, 21:41
بچه ها من تو اشاره گرا تو C# چند تا سوال دارم
ممنون ميشم 1نفر بهم جواب ده:31:
اول اينكه اصلا چرا C# يا gava اشاره گر نداره؟؟؟
اينكه اشاره گر نداره باعث كند شدنش نمي شه؟؟؟؟؟؟؟
اهااا
اصلا اگه بخوايم از اشاره گر استفاده كنيم چيكار بايد كنيم؟؟؟؟؟


به علت سختی استفاده از اشاره گر ها و باگ های خطرناک و حذف مدیریت مستقیم حافظه معمولا زبان های جدید خود حافظه رو مدیریت می کنند و در اصل از درون با اشاره گرها کار می کنند به طوری که برنامه نویس را در گیر این مسائل نکنند و اگر شما تبدیل شده یک کد از سی شارپ به سی پی پی (تحت دات نت(مدیریت شده)) را ببینید خواهید دید که تعریف یک متغیر در سی شارپ برابر است با تعریف یک اشاره گر در سی پی پی.
-----------------------------------------------------------------------------------------------------------------------------
JAVA را دقیق نمی دانم ولی در شارپ امکان تعریف اشاره گر وجود دارد ولی من تا الان اگر هم استفاده کردم بعدش فهمیدم راه حل بهتری هم وجود دارد !!!

darya_66_12_12
14-04-2010, 21:50
ميشه بهم بگيد چطور استفاده كرديين؟؟
ممنون ميشم بهم بگيد يا نمونه بزارين

mahdi7s
14-04-2010, 22:16
استفاده از unsafe در برای استفاده و تعریف اشاره گرها در msdn :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

_H2_
15-04-2010, 00:02
سلام

اول اينكه اصلا چرا C# يا gava اشاره گر نداره؟؟؟
تمام زبانهایی که من دیدم اشاره گر داشتند، منتها به روش خودشان!
اصلاً بدون اشاره گر برنامه نویسی معنی ندارد ...
من اطلاعاتی در RAM میرزیم، یک متن یک تصویر و... چطوری باید با آن کار کن؟؟؟
خوب خیلی طبیعی است نقطه ای از RAM را که اطلاعات را ریختم نگه میدارم و آن را به عنوان دستگیره و اشاره گر اطلاعاتم قرار میدهم.

در همه زبان های موجود اشاره گر وجود دارد ولی به روش و سینتکس خودشان ...
ما میگم "سلام" انگلیسی ها میگند "Hello" !!!
شما اشاره گر ++C را میبینید که * دارد!!! یعنی هر زبانی برای اشاره گر * نداشته باشد، اشاره گر ندارد !!!!!!!!!!!!!!!!!!!!!!!!!!!

اصلا پس سینتکس چه میشود؟ سینتکس یعنی همین تفاوت نوشتاری ...
قرار نیست هر زبانی که در عالم است برای اشاره گر از نماد * یا سینتکس ++C استفاده کند!

در VB.Net و C#.Net هر متغییری که از یک class تعریف شود اشاره گری خواهد بود.
مثلاً متغییر x در مثال زیر یک اشاره گر است! حالا * هم ندارد! چه فرقی میکند؟

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

=====

مثال عملی تر ...

الف) لیست پیوندی:
نمیدانم چقدر به اصول برنامه نویسی آشنا هستید؟
یکی از کاربردهای اشاره گر ها ساخت لیست های پیوندی است ...
که در یک لیست پیوندی ذات اشاره گر و خواص ان مشخص میشود.

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

Insert و Delete در لیست پیوندی بسیار سریع است، چون کافی است به محل مورد نظر بروید و اشاره گر گره قبلی را به گره جدید و اشاره موجود در گره جدید را به گره بعدی ست کنید و...

نمونه کد یک گره برای استفاده در لیست پیوندی در ++C

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

نمونه کد لیست پیوندی در #C

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

نمونه کد لیست پیوندی در VB.Net

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

نمونه کاملتری از یک لیست پیوندی در حالت کاملتر با پیاده سازی یک درخت گره ای که برای تاپیک دیگر نوشته بودم:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

به راحتی و در کمترین زمان ممکن و بدون هیچ * ای میتوان کد فوق را به C#.Net یا حتی VB.Net تبدیل کرد.
طوری که دقیق همان کار را انجام دهد.

اگر من میتوانم یک لیست پیوندی را (بدون هیچ * ای!) در #C و VB.Net بنویسم، پس اشاره گر چه شاخ و دمی باید داشته باشد که بگوییم فلان زبان ندارد؟! :31:
وقتی در زبانی به راحتی زبان دیگر میتوان لیست پیوندی ایجاد کرد، پس اشاره گر صریح و واضح وجود دارد.
(همین یک دلیل به تنهایی برای کسی که بفهمد کافی است و بقیه مطالب این پست زیاده گویی است! :31:)

=====

ب) آرایه یه و عناصر ایندکس شده پشت سر هم ...

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

کد ++C

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

کد #C

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خوب این اگر اشاره گر نیست پس چیست؟
فقط ستاره اینجا باید استفاده میشد؟ بدون ستاره قبول نیست؟ :31:
حتماً "سلام" با "Hello" فرق دارد، چون ظاهرشان متفاوت است!!!

=====

ج) مقایسه اشاره گرها
از موارد کاربد دیگر میتوان به مقایسه اشاره گر دو شی به جای خود دو شی اشاره کرد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

همانطور که میبینید ++VC ترجیح میدهد برای مقایسه اشاره گر ستاره ای که دارد را نیاورد، سینتکس #C یک کست فرمالیته به object (فرمالیته یعنی هیچ تبدیلی در واقع رخ نمیدهد و فقط سینتکسی برای کامپایلر است) را ترجیح میدهد و سینتکس VB هم کلمه Is را ترجیح میدهد.

خوب چه فرقی دارد؟ اینها که همه به یک چیز کامپایل میشوند و یک مفهوم دارند و یک کار میکنند ولی با سینتکس خودشان که حق خودشان است از سینتکس خودشان استفاده کنند!
برنامه نویس باید تفاوت و مفهوم مقایسه اشاره گر و مقایسه خود شی را بداند و سینتکس زبانی را هم کار میکند بلد باشد.

=====

د) اشاره گر صریح

IntPtr که دات نت دارد در واقع یک معادل یک اشاره گر خالص *void در ++C است (IntPtr حتی به راحتی تحت unsafe در #C و C++.Net به *void کست میشود) و انواع متدها و دستورات دات نت که اشاره گری خاص برای کاری نیاز دارند IntPtr را به عنوان ورودی میگیرند یا پس میدهند.
حالا حتماً باید این متدها در نوع ورودیشان مینوشتند *void !!!! و حالا که نوشته اند IntPtr دیگر قبول نیست! حتماً چون ستاره ندارد!!!!! :31:

=====

البته یکی از کاربرد اشاره گرها دسترسی مستقیم به نقطه ای خاص از RAM است که این مورد زبان های سطح بالا مشکلاتی دارند و اشاره گرهای استفاده شده در زبانهای سطح بالا به تنهایی این قابلیت ندارند و فقط در اینجا تفاوتی وجود خواهد داشت.
ولی اینجا هم مطالبی وجود دارد ...
1) کاربرد این نوع استفاده از اشاره گر در برنامه واقعی بسیار بسیار کم است چون اصلاً دانستن عدد داخل اشاره گر برای برنامه نویس مهم نیست.
2) اصولاً سیستم عامل به هر کاربر و هر ریسمانی اجازه نمیدهد به هر جای RAM سرک بکشد، کد ++VC و #C و VB و Java و Delphi و... هم ندارد، هر کدی که بخواهد در CPU اجرا شود و پایش را از حد مجوزهایش فراتر بگذارد سریعاً فرمانش بلوکه شده و به خطا خواهد خورد!
3) همانطور که دوستمان mahdi7s در #C هم با فعال سازی unsafe میتوان این کار ها را کرد:
4) دات نت توابعی و کلاس های آماده (مهمترین آنها Marshal) برای کار با IntPtr خودش و این مانورهای خاص در RAM را دارد که با کمک این توابع آماده میتوان به این قابلیت های دیگر اشاره گرها هم تحت اشاره گر عمومی IntPtr دات نت دسترسی پیدا کرد.

دات نت به روش دات نت امکان پذیر است ...

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

=====

شما باید مفاهیم و مبانی مطالب را متوجه شوید نه اینکه صرف سینتکس یک زبان را معیار قرار دهید.
من باید مفهوم کلمه "سلام" را درک کنم، احساس کنم و بفهمم چیست، چه میکند و کجا کاربرد دارد و کی استفاده کنم و در قبالش چه کنم ... شکل ظاهری "سلام" و "Hello" که مورد مهمی نیست، یک سینتکس و قرار داد نوشتاری است.

به جرات میتوانم بگویم کسی که به شما گفته، فلان زبان اشاره گر ندارد، یعنی خودش اصلاً مفهوم و ذات اشاره گر را درک نکرده و نفهمیده است ... فقط سینتکس یک زبانی مثل ++C را دیده و تازه درک هم نکرده اصلاً اشاره گر نباشد چه کار با رایانه میتوان انجام داد؟ چطور بدون اشاره گر میتوان به اشیا دسترسی داشت؟ اصلاً تا وقتی زبانی قابلیت اشاره گر را به برنامه نویس ندهد چطور میخواهد شی گرایی را بدهد؟ و... و... و...

=====

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

مطلب اخر که اگر آقای X با زبان Y جدیدی (زبانهای چند ساله اخیر) کار میکند و نمیتواند کاری را انجام دهد، مطمن باشد و باشید که سواد آقای X نسبت به زبانی که کار میکند، مشکل دارد، نه زبان Y، فرقی هم ندارد آقای X سالها برنامه نویسی تجربی کار کرده باشد یا فوق لیسانس نرم افزار از فلان دانشگاه معتبر باشد.
(این چیزی است که خودم عیناً و بارها در شرکت دیده ام)

=====

شب بخیر و جمیعاً موفق باشید.
:10:

darya_66_12_12
15-04-2010, 00:08
مرسيي مرسي مرسي مرسي از استاداي گرامي ممنوون

Life24
13-09-2013, 21:47
سلام
سوالی پیش آمد لازم شد تاپیک بیاد بالا.
این بحث چی؟ انگار کمی در ماکروسافت بهش اشاره شده. این نماینگر همان اشاره گر در c++ هست؟

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

_H2_
14-09-2013, 00:25
سلام

این بحث چی؟
این جزء همان کدهای unsafe است که دوستمان mahdi7s به آن اشاره کردند و در آخر پست قبلی ام هم اشاراتی به آن داشتیم.
که امکان تخصیص اشاره گر unsafe را به انواع بومی دات نت و پاره ای از struct ها با شرایط خاص میدهد و بدون پشتیبانی Generic و... میدهد.
کلمات کلیدی unsafe و fixed و stackalloc از جمله کلمات کلیدی مرتبط با این موضوع هستند.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

و در کل خیلی مورد استفاده نیست و بهتر است استفاده هم نشود.
با درنظر گرفتن این مطلب که اشاره گر به مفهوم کلی که در پست قبلی ام اشاره کردم خیلی راحت و مطمئن در #C و VB.Net در دسترس است و کاربردهای روزمره و معتبر این حیطه (مانند لیست پیوندی) به راحتی قابل پیاده سازی است، دیگر دلیل زیاد و اصراری بر استفاده از unsafe باقی نمی ماند.
(((
تنها دلیل استفاده از unsafe میتواند در شرایط بسیار بسیار خاص جهت بازدهی بیشتر و یا تبادل داده با برخی API های خاص باشد.
)))