PDA

View Full Version : Access of shared member, constant member, enum member or nested type through an instance; qualifying



Rambod
شنبه 07 اردیبهشت 1387, 12:42 عصر
سلام.
من تو برنامه‌ام از Cursor.Position بصورت زیر برای یافتن موقعیت ماوس استفاده می‌کنم:

Dim T As New System.Drawing.Point
T = Cursor.Position

ولی هنگام اجرا یک Warning با عنوان زیر نشون داده می‌شه:

Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated

این Warning برای چیه و چطوری می‌تونم از دستش خلاص بشم؟

amirsajjadi
شنبه 07 اردیبهشت 1387, 13:21 عصر
با سلام
Warning توی برنامه ها مهم نیست.

Dim T AsNew System.Drawing.Point
T = Windows.Forms.Cursor.Position

reza6384
چهارشنبه 03 مهر 1387, 12:56 عصر
من هم در دستور زیر این Warning رو داشتم. که با توضیح آقای سجادی درست شد.



Curosr.Current = Cursors.Default


فرم درست شدش :



System.Windows.Forms.Cursor.Current = Cursors.Default



ولی من یه توضیح کلی می خواستم، راجع به این Warning و کلا راجع به اعضای Shared یک کلاس.

Microsoft.net
چهارشنبه 03 مهر 1387, 14:53 عصر
ولی من یه توضیح کلی می خواستم، راجع به این Warning و کلا راجع به اعضای Shared یک کلاس.

در مورد Warning ها عرض كنم كه بر خلاف نظر اين دوستمون بنده عقيده دارم كه بسيار مهم هستند حتي مهمتر از Error ها ! چرا كه با وجود اين اخطارها برنامه قابل اجرا بوده و ممكن است نتيجه قسمتي از برنامه قابل پيشبيني نباشد . و اين مشكل ديباگينگ برنامه را مشكل ميكند. به هر صورت در جواب شما بايد بگم كه Shared Method ها اعضايي هستند كه نياز به تخصيص حافظه به صورت Instance ندارند و مستقل از آن كلاس عمل ميكنند . براي دسترسي به اين اعضا نبايد از طريق Instance كلاس در برگيرنده به آنها دسترسي صورت گيرد(همان مشكلي كه شما با آن برخورد كرديد) . و اگر حاوي ديتايي باشند آن مقدار را هميشه نگه داري ميكنند چه كلاس در بر گيرنده آنها Dispose شده باشد چه نشده باشد چه Nothing باشد چه نباشد . در CSharp هم معادل آن Static است . براي دسترسي به آنها كافي است به صورت ClassName.SharedObject انجام گيرد در اينجا مهم نيست ClassName ما New شده باشد يا نشده باشد

reza6384
چهارشنبه 03 مهر 1387, 23:26 عصر
من داشتم یه DLL می ساختم . بعد می خواستم یک DataSet بین بعضی از کلاس هام مشترک باشه ، کلاس ها رو به صورت Friend تعریف کردم تا وقتی User از Dll استفاده می کنه اونها رو نبینه. مشکل من این بود که می خواستم این DataSet رو فقط داخل کلاس های خودم تغییر بدم و از طرفی هم بین اونها مشترک باشه. اگر Public Shared تعریفش می کردم با این مشکل مواجه می شدم که User می تونست اونرو Modify کنه. و اگر Private Shared تعریف می کردم که اصلا در هیچ کلاسی دیده نمی شد. به نظرم رسید که از Pointer استفاده کنم. در یک کلاس مبدا این New DataSet رو تعریف کردم و جداولش رو بهش اضافه کردم. در کلاس هایی که می خواستم از این DataSet استفاده کنم یک DataSet تعریف کردم ولی New نکردم و با فراخوانی یک متد آدرس اون DataSet اصلی رو توی DataSet مقصد ریختم. اینجوری هم از سایر کلاس ها بهش دسترسی دارم ، هم Private اه و در نتیجه استفاده کننده DLL اون رو نمیبینه.
در اصل تعریف متغیر Public یه مقداری با اصول OO مشکل داره. من فکر می کنم یه متغیر Static باید درون کلاس استفاده بشه ، نه اینکه Public باشه و همه بهش دسترسی داشته باشند.

Microsoft.net
پنج شنبه 04 مهر 1387, 00:07 صبح
در اصل تعریف متغیر Public یه مقداری با اصول OO مشکل داره. من فکر می کنم یه متغیر Static باید درون کلاس استفاده بشه ، نه اینکه Public باشه و همه بهش دسترسی داشته باشند.

اصلا اینگونه که فکر میکنی نیست در واقع وجود Public به همراه Modifier های دیگه عین OO است !
همین API هایی که تمامی شرکت های نرم افزاری کوچک و بزرگ دارن استفاده میکنن به لطف وجود Public است
نمیشه یک مساله رو به تمامی مسایل بسط داد . هر چیزی در جای خودش کاربرد داره و این یعنی استفاده بجای هرچیز در جای خودش میتونه تعریفی کوچک از شی گرایی باشه .
امروزه اکثر شرکتهای نرم افزاری مایلند برای بسط و توسعه سیستم هاشون کاری کنند که دیگر افراد و شرکتها بتونند از برخی از توابع اونها به صورت استاندارد استفاده کنند

reza6384
پنج شنبه 04 مهر 1387, 14:40 عصر
دوست عزیز من منظورم اعضای کلاس بود. بله ، اگر همه متدها رو Private کنیم که دیگه هیچ چیز برای استفاده کاربر نمی مونه. اما من منظورم اعضای Public هست ، بیشتر کلاس هایی هم که دیدم ، یک متغیر Private دارند و اون رو با Property ها Get/Set می کنند.

Microsoft.net
پنج شنبه 04 مهر 1387, 18:14 عصر
دوست عزیز من منظورم اعضای کلاس بود. بله ، اگر همه متدها رو Private کنیم که دیگه هیچ چیز برای استفاده کاربر نمی مونه. اما من منظورم اعضای Public هست ، بیشتر کلاس هایی هم که دیدم ، یک متغیر Private دارند و اون رو با Property ها Get/Set می کنند.

متاسفانه بنده برداشت دیگری از صحبتهای شما کردم ؛ در هر صورت این صحبت شما کاملا صحیح است