PDA

View Full Version : سوال: اشاره گر به اعضای کلاس



alireza_tavakol
جمعه 02 مرداد 1388, 12:47 عصر
من کلاس زیر رو ایجاد کردم

public static class a
{
public static class b
{
public static int c = 10; //Field
public static void d() //Method
{
//body
}
}
}

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

int C = a.b.c;

و هر وقت بخواهم متد d را صدا بزنم مجبورم کد زیر رو بنویسم

a.b.d();

اولا" ) به نظر شما چطوری می تونم متغییر تعریف کنم که به فلید c اشاره کنه ؟:متفکر:
دوما" ) به نظر شما راهی وجود داره برای صدا زدن متد d کد خلاصه تری نوشت؟:متفکر:

hozouri
جمعه 02 مرداد 1388, 13:09 عصر
دوست عزیز بهتر نبود به جای این کار از وراثت استفاده می کردی ...



public class a
{
.
.
.
}

public class b : a
{
int c=10;
}

alireza_tavakol
جمعه 02 مرداد 1388, 13:10 عصر
من برای رسیدن به جواب برای سوال اولم این راه رو رفتم ولی به خطا بخورد کردم

unsafe
{
int * p;
p = a.b.&c;
}

به نظر شما اصلا امکان تعریف کردن اشارگر به جنس کلاس وجود داره؟:گیج:

alireza_tavakol
جمعه 02 مرداد 1388, 13:14 عصر
دوست عزیز بهتر نبود به جای این کار از وراثت استفاده می کردی ...

این کلاس رو من به صورت مفرض مطرح کردم که بتونم سوالم رو طرح کنم والا برای رسیدن به هدف n راه وجود داره که مطمئنا" راه مستقم کوتاه ترین مسیره :چشمک: ولی من می خواستم راه های دیه رو تجربه کنم:اشتباه:

با تشکر از حسن توجه جنابعالی

alireza_tavakol
جمعه 02 مرداد 1388, 13:19 عصر
من برای رسیدن به جواب برای سوال دوم راه زیر رو رفتم ولی بازم تیرم به سنگ خورد:عصبانی++:

توی زبان ++C می تونستیم ثابت هایی تعریف کنیم که قبل از کامپایل شدن برنامه عمل جایگزینی در کد رو انجام میداد به شکلی که مثلا در کد زیر

#define D a.b.d()
این کد در ++C باعث میشد قابل از کامپایل برنامه هر جایی در کد برنامه نویس کلمه D رو دید بیاد و کلمه a.b.d() رو جایگزین کنه و بعد عمل کامپایل رو انجام میداد حالا من نمی دونم از این روش میشه توی #C استفاده کرد یا نه؟

SMRAH1
جمعه 02 مرداد 1388, 17:00 عصر
سلام
من تا حالا در #C راه کاری برای دسترسی سریع تر به اشای داخل یک کلاس (مثل with در VB یا defineدر C و ..) ندیدم!
در ضمن کد

int * p;
و در کل اشاره گر ها در #C هم وجود دارند ولی باید وجود اونها رو صرحا به برنامه اعلام کنی.به اینگونه کد ها در #C،کد unsafe گفته می شه.برای ایجاد کد unsafe باید اولا در هنگام نوشتن دستورات ،صریحا این رو مشخص کنی مثلا یک روش اینه :

using System;
class UnsafeTest
{
// Unsafe method: takes pointer to int:
unsafe static void SquarePtrParam(int* p)
{
*p *= *p;
}

unsafe static void Main()
{
int i = 5;
// Unsafe method: uses address-of operator (&):
SquarePtrParam(&i);
Console.WriteLine(i);
}
}
ثانیا در تنظیمات کامپایلر گزنیه allow unsafe code رو تیک بزی (Project > YourProjectName properties> Build).

برای اطلاعات بیشتر به MSDN مراجعه کن.

موفق باشی

alireza_tavakol
جمعه 02 مرداد 1388, 18:33 عصر
کل اشاره گر ها در #C هم وجود دارند ولی باید وجود اونها رو صرحا به برنامه اعلام کنی.به اینگونه کد ها در #C،کد unsafe گفته می شه.برای ایجاد کد unsafe باید اولا در هنگام نوشتن دستورات ،صریحا این رو مشخص کنی

خوب منم در تنظیمات کامپایلر گزنیه allow unsafe code رو تیک زدم و اگه دقت میکردین کدهام رو توی بلوک unsafe قرار دادم ولی وقتی می خوهم مقصد اشارگر تعریف شده را تنظیم کنم نمی دونم چطوری باید این کار رو انجام بدم
مثلا" برای متغییر های معمولا کد زیر باعث میشه اشارگر p به منبع متغییر var اشار کنه

int* p,var;
p=&var;

حالا من می خوام به جای متغییر var یک فیلد استاتیک از یک کلاس رو قرار بدم ولی نمی دونم نوع اشارگرم رو چی باید در نظر بگیرم و از عملگر & کجا و به چه شکلی استفاده کنم:متفکر:

hozouri
شنبه 03 مرداد 1388, 09:10 صبح
دوست عزیز من فکر کنم با fixed مشکل شما حل بشه.

چون کلاس ها در حافظه توسط garbage collector جابه جا می شن. شما باید این حافظه را ثابت نمایید...

hozouri
شنبه 03 مرداد 1388, 09:15 صبح
من برای رسیدن به جواب برای سوال اولم این راه رو رفتم ولی به خطا بخورد کردم

unsafe
{
int * p;
p = a.b.&c;
}

به نظر شما اصلا امکان تعریف کردن اشارگر به جنس کلاس وجود داره؟:گیج:



fixed ( int* p = &a.b.c )
{
.
.
.
}

alireza_tavakol
شنبه 03 مرداد 1388, 10:45 صبح
یک دنیا تشکر ( مشکل اول من حل شد ) .

حال به نظر شما چرا garbage collector اشیا ساخته شده از کلاس ها رو توی حافظه جا به جا مکنه ؟ ( برای جلوگیری از fragmentation )

راستی اگه راه کاری واسه دسترسی خلاصه تر به متد های کلاس های nested پیدا کردی بی خبرم نگذار ، بازم سپاس گذارم

hozouri
شنبه 03 مرداد 1388, 13:08 عصر
این کار برای مدیریت و بهینه سازی اشیا در داخل حافظه heap است.

samirdev
دوشنبه 05 مرداد 1388, 00:22 صبح
یه روش دیگه برای خلاصه سازی:

در اول کد وارد کنید :

using abstract = a.b;
حالا می توان به جای a.b از abstract استفاده کرد.