بچه ها من تو اشاره گرا تو C# چند تا سوال دارم
ممنون ميشم 1نفر بهم جواب ده:31:
اول اينكه اصلا چرا C# يا gava اشاره گر نداره؟؟؟
اينكه اشاره گر نداره باعث كند شدنش نمي شه؟؟؟؟؟؟؟
اهااا
اصلا اگه بخوايم از اشاره گر استفاده كنيم چيكار بايد كنيم؟؟؟؟؟
Printable View
بچه ها من تو اشاره گرا تو C# چند تا سوال دارم
ممنون ميشم 1نفر بهم جواب ده:31:
اول اينكه اصلا چرا C# يا gava اشاره گر نداره؟؟؟
اينكه اشاره گر نداره باعث كند شدنش نمي شه؟؟؟؟؟؟؟
اهااا
اصلا اگه بخوايم از اشاره گر استفاده كنيم چيكار بايد كنيم؟؟؟؟؟
چراااا هيچكس جوابموو نميده؟:41:
نقل قول:
به علت سختی استفاده از اشاره گر ها و باگ های خطرناک و حذف مدیریت مستقیم حافظه معمولا زبان های جدید خود حافظه رو مدیریت می کنند و در اصل از درون با اشاره گرها کار می کنند به طوری که برنامه نویس را در گیر این مسائل نکنند و اگر شما تبدیل شده یک کد از سی شارپ به سی پی پی (تحت دات نت(مدیریت شده)) را ببینید خواهید دید که تعریف یک متغیر در سی شارپ برابر است با تعریف یک اشاره گر در سی پی پی.
-----------------------------------------------------------------------------------------------------------------------------
JAVA را دقیق نمی دانم ولی در شارپ امکان تعریف اشاره گر وجود دارد ولی من تا الان اگر هم استفاده کردم بعدش فهمیدم راه حل بهتری هم وجود دارد !!!
ميشه بهم بگيد چطور استفاده كرديين؟؟
ممنون ميشم بهم بگيد يا نمونه بزارين
استفاده از unsafe در برای استفاده و تعریف اشاره گرها در msdn :
کد:http://blogs.msdn.com/ericgu/archive/2007/06/20/lost-column-2-unsafe-image-processing.aspx
سلام
تمام زبانهایی که من دیدم اشاره گر داشتند، منتها به روش خودشان!نقل قول:
اول اينكه اصلا چرا C# يا gava اشاره گر نداره؟؟؟
اصلاً بدون اشاره گر برنامه نویسی معنی ندارد ...
من اطلاعاتی در RAM میرزیم، یک متن یک تصویر و... چطوری باید با آن کار کن؟؟؟
خوب خیلی طبیعی است نقطه ای از RAM را که اطلاعات را ریختم نگه میدارم و آن را به عنوان دستگیره و اشاره گر اطلاعاتم قرار میدهم.
در همه زبان های موجود اشاره گر وجود دارد ولی به روش و سینتکس خودشان ...
ما میگم "سلام" انگلیسی ها میگند "Hello" !!!
شما اشاره گر ++C را میبینید که * دارد!!! یعنی هر زبانی برای اشاره گر * نداشته باشد، اشاره گر ندارد !!!!!!!!!!!!!!!!!!!!!!!!!!!
اصلا پس سینتکس چه میشود؟ سینتکس یعنی همین تفاوت نوشتاری ...
قرار نیست هر زبانی که در عالم است برای اشاره گر از نماد * یا سینتکس ++C استفاده کند!
در VB.Net و C#.Net هر متغییری که از یک class تعریف شود اشاره گری خواهد بود.
مثلاً متغییر x در مثال زیر یک اشاره گر است! حالا * هم ندارد! چه فرقی میکند؟
=====کد:public class Class1
{
//...
}
//...
Class1 x = new Class1();
مثال عملی تر ...
الف) لیست پیوندی:
نمیدانم چقدر به اصول برنامه نویسی آشنا هستید؟
یکی از کاربردهای اشاره گر ها ساخت لیست های پیوندی است ...
که در یک لیست پیوندی ذات اشاره گر و خواص ان مشخص میشود.
این لیست ها طوری هستند که در مقابل سیستم آرایه ای قرار میگیرند و به جای انکه اعضای فهرست پشت سر هم و ایندکس شده باشند هر کدام گره هایی هستند (همه شناور در heap و بدون ایندکس و تمرکز) که به عنصر بعدی یا عنصر فرزند اولی و... اشاره میکنند...
Insert و Delete در لیست پیوندی بسیار سریع است، چون کافی است به محل مورد نظر بروید و اشاره گر گره قبلی را به گره جدید و اشاره موجود در گره جدید را به گره بعدی ست کنید و...
نمونه کد یک گره برای استفاده در لیست پیوندی در ++C
نمونه کد لیست پیوندی در #Cکد:class CNode
{
private: CNode* m_Next;
private: CNode* m_FirstChild;
}
نمونه کد لیست پیوندی در VB.Netکد:public class CNode
{
private CNode m_Next;
private CNode m_FirstChild;
}
نمونه کاملتری از یک لیست پیوندی در حالت کاملتر با پیاده سازی یک درخت گره ای که برای تاپیک دیگر نوشته بودم:کد:Public Class CNode
Private m_Next As CNode
Private m_FirstChild As CNode
End Class
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
به راحتی و در کمترین زمان ممکن و بدون هیچ * ای میتوان کد فوق را به C#.Net یا حتی VB.Net تبدیل کرد.
طوری که دقیق همان کار را انجام دهد.
اگر من میتوانم یک لیست پیوندی را (بدون هیچ * ای!) در #C و VB.Net بنویسم، پس اشاره گر چه شاخ و دمی باید داشته باشد که بگوییم فلان زبان ندارد؟! :31:
وقتی در زبانی به راحتی زبان دیگر میتوان لیست پیوندی ایجاد کرد، پس اشاره گر صریح و واضح وجود دارد.
(همین یک دلیل به تنهایی برای کسی که بفهمد کافی است و بقیه مطالب این پست زیاده گویی است! :31:)
=====
ب) آرایه یه و عناصر ایندکس شده پشت سر هم ...
کاربر بسیار پرمصرف دیگر اشاره گرها در ارایه ها و دسترسی به عناصر آن است.
تست انکه دسترسی به آرایه با اصول اشاره گری انجام میشود یا نه خلی ساده است ...
اگر من اشاره گر یک آرایه را به متد و جای دیگر منتقل کنم چون ادرس ان بلاک حافظه را منتقل کرده ام، اگر اطلاعات در ان متد تغییر و دستکاری شود باز در کد فراخوان هم نمایان خواهد بود.
کد ++C
کد #Cکد:int* x = new int[10];
Func1(x);
int y = x[5];
//...
void Func1(int* arr)
{
arr[5] = 123;
}
خوب این اگر اشاره گر نیست پس چیست؟کد:int[] x = new int[10];
Func1(x);
int y = x[5];
//...
private void Func1(int[] arr)
{
arr[5] = 123;
}
فقط ستاره اینجا باید استفاده میشد؟ بدون ستاره قبول نیست؟ :31:
حتماً "سلام" با "Hello" فرق دارد، چون ظاهرشان متفاوت است!!!
=====
ج) مقایسه اشاره گرها
از موارد کاربد دیگر میتوان به مقایسه اشاره گر دو شی به جای خود دو شی اشاره کرد:
همانطور که میبینید ++VC ترجیح میدهد برای مقایسه اشاره گر ستاره ای که دارد را نیاورد، سینتکس #C یک کست فرمالیته به object (فرمالیته یعنی هیچ تبدیلی در واقع رخ نمیدهد و فقط سینتکسی برای کامپایلر است) را ترجیح میدهد و سینتکس VB هم کلمه Is را ترجیح میدهد.کد:VC++:
Class1 x* = new Class1();
Class1 y* = new Class1();
if (*x == *y) ...
if (x == y) ...
C#.Net:
Class1 x = new Class1();
Class1 y = new Class1();
if (x == y) ...
if ((object)x == (object)y) ...
VB.Net:
Dim x As New Class1()
Dim y As New Class1()
If (x = y) ...
If (x Is y) ...
خوب چه فرقی دارد؟ اینها که همه به یک چیز کامپایل میشوند و یک مفهوم دارند و یک کار میکنند ولی با سینتکس خودشان که حق خودشان است از سینتکس خودشان استفاده کنند!
برنامه نویس باید تفاوت و مفهوم مقایسه اشاره گر و مقایسه خود شی را بداند و سینتکس زبانی را هم کار میکند بلد باشد.
=====
د) اشاره گر صریح
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 دات نت دسترسی پیدا کرد.
دات نت به روش دات نت امکان پذیر است ...
=====کد:VC++:
BYTE value = *((BYTE*)123);
C#.Net بدون unsafe:
byte value = System.Runtime.InteropServices.Marshal.ReadByte((IntPtr)123);
C#.Net با unsafe:
byte value = *((byte*)123);
البته هر سه کد صحیح هستند و با اعداد مناسب کارخواهند کرد ولی به دلیل 2 بیان شده هر سه کد بلوکه و به خطا خواهند خورد
شما باید مفاهیم و مبانی مطالب را متوجه شوید نه اینکه صرف سینتکس یک زبان را معیار قرار دهید.
من باید مفهوم کلمه "سلام" را درک کنم، احساس کنم و بفهمم چیست، چه میکند و کجا کاربرد دارد و کی استفاده کنم و در قبالش چه کنم ... شکل ظاهری "سلام" و "Hello" که مورد مهمی نیست، یک سینتکس و قرار داد نوشتاری است.
به جرات میتوانم بگویم کسی که به شما گفته، فلان زبان اشاره گر ندارد، یعنی خودش اصلاً مفهوم و ذات اشاره گر را درک نکرده و نفهمیده است ... فقط سینتکس یک زبانی مثل ++C را دیده و تازه درک هم نکرده اصلاً اشاره گر نباشد چه کار با رایانه میتوان انجام داد؟ چطور بدون اشاره گر میتوان به اشیا دسترسی داشت؟ اصلاً تا وقتی زبانی قابلیت اشاره گر را به برنامه نویس ندهد چطور میخواهد شی گرایی را بدهد؟ و... و... و...
=====
بعد از همه اینها و اینکه اشاره گر در کدهای هر زبانی جاری است و به وفور استفاده میشود...
بحث unsafe هم در #C وجود دارد که دوستمان در پست قبلی بیان کردند و میتوان مثل همان سینتکس ++C با اشاره گرها در #C کار کرد. (مثل اخرین خط کد این پست در چند خط بالاتر)
مطلب اخر که اگر آقای X با زبان Y جدیدی (زبانهای چند ساله اخیر) کار میکند و نمیتواند کاری را انجام دهد، مطمن باشد و باشید که سواد آقای X نسبت به زبانی که کار میکند، مشکل دارد، نه زبان Y، فرقی هم ندارد آقای X سالها برنامه نویسی تجربی کار کرده باشد یا فوق لیسانس نرم افزار از فلان دانشگاه معتبر باشد.
(این چیزی است که خودم عیناً و بارها در شرکت دیده ام)
=====
شب بخیر و جمیعاً موفق باشید.
:10:
مرسيي مرسي مرسي مرسي از استاداي گرامي ممنوون
سلام
سوالی پیش آمد لازم شد تاپیک بیاد بالا.
این بحث چی؟ انگار کمی در ماکروسافت بهش اشاره شده. این نماینگر همان اشاره گر در c++ هست؟
کد:
struct Point
{
public int x, y;
}
class MainClass12
{
unsafe static void Main()
{
Point pt = new Point();
Point* pp = &pt;
pp->x = 123;
pp->y = 456;
Console.WriteLine("{0} {1}", pt.x, pt.y);
}
}
سلام
این جزء همان کدهای unsafe است که دوستمان mahdi7s به آن اشاره کردند و در آخر پست قبلی ام هم اشاراتی به آن داشتیم.نقل قول:
این بحث چی؟
که امکان تخصیص اشاره گر unsafe را به انواع بومی دات نت و پاره ای از struct ها با شرایط خاص میدهد و بدون پشتیبانی Generic و... میدهد.
کلمات کلیدی unsafe و fixed و stackalloc از جمله کلمات کلیدی مرتبط با این موضوع هستند.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
و در کل خیلی مورد استفاده نیست و بهتر است استفاده هم نشود.
با درنظر گرفتن این مطلب که اشاره گر به مفهوم کلی که در پست قبلی ام اشاره کردم خیلی راحت و مطمئن در #C و VB.Net در دسترس است و کاربردهای روزمره و معتبر این حیطه (مانند لیست پیوندی) به راحتی قابل پیاده سازی است، دیگر دلیل زیاد و اصراری بر استفاده از unsafe باقی نمی ماند.
(((
تنها دلیل استفاده از unsafe میتواند در شرایط بسیار بسیار خاص جهت بازدهی بیشتر و یا تبادل داده با برخی API های خاص باشد.
)))