گفتگو هایی در باب سی شارپ

SU-57

Active Member
سلام

ما می تونیم دو تا namespace با نام یکسان داشته باشیم و کامپایلر خطا نمی گیره

C#:
namespace Autorun
{
  
}
namespace Autorun
{
  
}

اما به محض ایجاد یک کلاس با نام یکسان در دو فضای نام کامپایلر خطا می گیره. میگه شما قبلا کلاسی با این نام در فضای نام Autorun ایجاد کردید. در حالی که در حالت اول دو تا فضای نام مستقل در نظر گرفته شدن ولی انگار مستقل نیستن. اگه مستقل نیستن چرا پس خطا نمی گیره. اصلا ایجاد دو namespace با نام یکسان کاربردی داره که این قابلیت رو مایکروسافت توی سی شارپ گذاشته؟


C#:
namespace Autorun
{
    class Form
    {
    }
}
namespace Autorun
{
    class Form
    {
    }
}
 

the_king

مدیرکل انجمن
سلام

ما می تونیم دو تا namespace با نام یکسان داشته باشیم و کامپایلر خطا نمی گیره

C#:
namespace Autorun
{
 
}
namespace Autorun
{
 
}
نه. این دو تا namespace با نام یکسان نیست، namespace یک محدوده از { تا } مشخص می کنه که هر چی داخلش تعریف بشه به اون فضای نام تعلق بگیره. مثلا شهر تولد در شناسنامه، تو شناسنامه هر کسی محل تولد نوشته شده و شهر تولد خیلی ها شبیه همدیگر شده. اما اون شهر های هم نام همگی یک شهر هستند، چند شهر با اسم یکسان نیستند.

فرضا در یک پروژه ممکنه ده تا کلاس در ده فایل متفاوت تعریف کنید که همگی به فضای نام Autorun تعلق دارند، طبعا در هر فایل یکبار اون namespace Autorun درج میشه، به این معنا نیست که ده تا namespace ئه Autorun با اسامی یکسان داریم. همه اون { } ها دارند محدوده یک namespace به نام Autorun رو مشخص می کنند. فقط یک Autorun بوده، چند تا نیستند.
اما به محض ایجاد یک کلاس با نام یکسان در دو فضای نام کامپایلر خطا می گیره. میگه شما قبلا کلاسی با این نام در فضای نام Autorun ایجاد کردید. در حالی که در حالت اول دو تا فضای نام مستقل در نظر گرفته شدن ولی انگار مستقل نیستن. اگه مستقل نیستن چرا پس خطا نمی گیره. اصلا ایجاد دو namespace با نام یکسان کاربردی داره که این قابلیت رو مایکروسافت توی سی شارپ گذاشته؟


C#:
namespace Autorun
{
    class Form
    {
    }
}
namespace Autorun
{
    class Form
    {
    }
}
هر نام موجودیتی باید در فضای تعریف اش یکتا و منحصر بفرد باشه، مثلا در داخل فضای نام Autorun یا داخل کلاس MyClass یا داخل متد MyMethod و ...
برای همین نمیشه در فضای نام Autorun دو کلاس با نام مشابه Form تعریف بشه.
 

SU-57

Active Member
این دو تا namespace با نام یکسان نیست، namespace یک محدوده از { تا } مشخص می کنه که هر چی داخلش تعریف بشه به اون فضای نام تعلق بگیره. مثلا شهر تولد در شناسنامه، تو شناسنامه هر کسی محل تولد نوشته شده و شهر تولد خیلی ها شبیه همدیگر شده. اما اون شهر های هم نام همگی یک شهر هستند، چند شهر با اسم یکسان نیستند.
عرض سلام و شب بخیر
استاد علی به نظر من یادگیری مفاهیم سی شارپ از خود کدهای سی شارپ سخت تره. مثلا من اصلا نمی تونم درک درستی از namespace داشته باشم که اصلا چرا باید namespace در کدها وجود داشته باشه و ضرورتش چیه. مثلا اگه نبود چه کمبودی در سی شارپ به وجود میومد که البته مایکروسافت باید بگه.
حالا آقا سجاد در فیلم آموزشی یک مثالی زد که مثلا namespace مثل یک فولدر می مونه و کلاس مثل یک فایل درون یک فولدر می مونه. فولدر به خودی خود اهمیتی نداره و این فایل داخل فولدر مثل txt هست که ارزش داره.
مشکل اینجاست که طبق تعریف، کلاس یک مفهوم انتزاعیه و ما از روی این مفهوم انتزاعی شی می سازیم. مثلا من در ذهنم یک لیوان تصور می کنم و بعد وقتی اون رو ایجاد کردم یعنی یک شی ایجاد کردم. اما در اینجا کلاس یک فایل در نظر گرفته شده با پسوند cs. که خودش یک فایله و اصلا مفهومی و انتزاعی نیست بلکه وجود خارجی داره.
 

the_king

مدیرکل انجمن
عرض سلام و شب بخیر
استاد علی به نظر من یادگیری مفاهیم سی شارپ از خود کدهای سی شارپ سخت تره. مثلا من اصلا نمی تونم درک درستی از namespace داشته باشم که اصلا چرا باید namespace در کدها وجود داشته باشه و ضرورتش چیه. مثلا اگه نبود چه کمبودی در سی شارپ به وجود میومد که البته مایکروسافت باید بگه.
حالا آقا سجاد در فیلم آموزشی یک مثالی زد که مثلا namespace مثل یک فولدر می مونه و کلاس مثل یک فایل درون یک فولدر می مونه. فولدر به خودی خود اهمیتی نداره و این فایل داخل فولدر مثل txt هست که ارزش داره.
مشکل اینجاست که طبق تعریف، کلاس یک مفهوم انتزاعیه و ما از روی این مفهوم انتزاعی شی می سازیم. مثلا من در ذهنم یک لیوان تصور می کنم و بعد وقتی اون رو ایجاد کردم یعنی یک شی ایجاد کردم. اما در اینجا کلاس یک فایل در نظر گرفته شده با پسوند cs. که خودش یک فایله و اصلا مفهومی و انتزاعی نیست بلکه وجود خارجی داره.
لازم نیست مایکروسافت بگه. اون فولدر خیلی اهمیت داره. شما ممکنه در خیلی از فولدر ها یک فایل Readme.txt داشته باشید. بدون وجود اون فولدر Readme.txt ها نه ارتباط شون با سایر فایل ها قابل شناسایی است و نه از هم تفکیک شدنی هستند.
تصور کنید که دارید یک برنامه می نویسید که از چند کمپوننت برنامه نویسی استفاده می کنه، یکی اش برای ساختن فایل pdf یکی اش برای خوندن فایل doc و یکی اش برای ویرایش فایل jpeg.
در هر سه تاشون هم کلاس متفاوتی با نام FileData هست که ساختار شون یا شبیه بهم بوده یا خیلی متفاوت. که خیلی عادیه، هر کدوم رو برنامه نویسان متفاوتی نوشته اند که اصلا خبر ندارند سایر برنامه نویسان چه اسامی ای برای کلاس هاشون بکار می برند. دلیلی نداشته اسامی شون در پروژه شما منحصر بفرد در بیاد. حالا چطوری می توانید این سه تا FileData رو از هم تفکیک کنید؟ بر اساس فضای نام شون. بدون فضای نام هیچ تضمینی وجود نداشته که کنار هم قرار دادن تعاریف متفاوت امکان پذیر باشه.
 

SU-57

Active Member
تصور کنید که دارید یک برنامه می نویسید که از چند کمپوننت برنامه نویسی استفاده می کنه،
1- استاد علی این معنی کمپوننت یا کامپوننت چیه. اصلا چی هست. توی ساختار سی شارپ که من ندیدم چنین مفهومی یا اسمی اومده باشه. مثلا توی سایت های دانلود نوشته کامپوننت Telerik که چون لیست بلند بالایی داره و برای من نامشخص بود دانلود نکردم. مثلا من نوعی می تونم خودم کمپوننت شخصی درست کنم؟
2- یا مثلا من می تونم متد شخصی برای خودم ایجاد کنم طوری که در یک فایل کاملا مجرا باشه و به صورت تکی. مثلا یک متد ایجاد کنم برای محاسبه فاکتوریل اعداد و این داخل برنامه من نباشه. بلکه توی یک فایل با پسوند مثلا cs. یا پسوند دیگه باشه و مثلا 10 خط باشه و بعد من این متد ها رو همینجوری درست کنم در اوقات فراغت و بعد در هر پروژه ای که می خوام ازش استفاده کنم. نمی دونم دقیقا چطور استفاده کنم ولی فکر کنم اگه پسوندش cs. باشه بتونم کپی کنم توی پروژه اصلی
3- یکی هم مفهوم API های ویندوز. من به یکی از برنامه نویس های خارجی پیام دادم چرا این برنامه رو برای ویندوز 7 درست نمی کنی چون من و خیلی های دیگه ویندوز 7 فقط دوست داریم و اون پیام داد که این برنامه از فلان API ویندوز استفده می کنه که توی ویندوز 7 نیست و توی ویندوز 8 و 10 وجود داره. الان اسمش یادم نیست چون ایمیلش رو حذف کردم ولی باید دبوراه ازش بپرسم.
الان این API های ویندوز های 7 و 8 و 10 در کجا قرار دارند که ما بتونیم در پروژه هامون ازشون استفاده کنیم و از کجا بفهمیم که هر API کاربردش چیه و اصلا چطوری باید توی سی شارپ بیاریم. مثلا وقتی یک برنامه نویس می بینه یک API در ویندوز 7 نیست ولی توی 10 هست چرا نمی تونه برای ویندوز 7 اون رو خودش دستی ایجاد کنه. کار سختیه یا نشدنیه
 

the_king

مدیرکل انجمن
1- استاد علی این معنی کمپوننت یا کامپوننت چیه. اصلا چی هست.
به هر مجموعه نرم افزاری که اجزاء اش از نظر کارکرد یا مفهوم با هم ارتباط دارند کمپوننت میگن، مثلا اگر یکسری توابع باشه که باهاش بشه جلوه صوتی ایجاد کرد، میتوانند در یک مجموعه کنار هم جمع آوری بشوند و تشکیل یک کمپوننت رو بدهند. کمپوننت میتونه یک یا چند فایل dll باشه، کد یک یا چند کلاس باشه، یک یا چند برنامه باشه و ... مهم اینه که اجزاء اش بهم مربوط هستند. اینکه یکسری کد بی ربط کنار هم جمع آوری بشوند تشکیل کمپوننت نمیده.

توی ساختار سی شارپ که من ندیدم چنین مفهومی یا اسمی اومده باشه. مثلا توی سایت های دانلود نوشته کامپوننت Telerik که چون لیست بلند بالایی داره و برای من نامشخص بود دانلود نکردم. مثلا من نوعی می تونم خودم کمپوننت شخصی درست کنم؟
کمپوننت مفهوم نرم افزاری ئه، به زبان برنامه نویسی خاصی ربطی نداره. منوی Project گزینه ...Add Reference دکمه Browse عبارت Component رو در توصیف پسوند ها می بینید :
component.png
بله. کار خاصی لازم نیست بکنید، فقط باید مواردی که از نظر کارکرد و مفهوم بهم مربوط هستند رو در قالب یک پروژه جمع کنید.
2- یا مثلا من می تونم متد شخصی برای خودم ایجاد کنم طوری که در یک فایل کاملا مجرا باشه و به صورت تکی. مثلا یک متد ایجاد کنم برای محاسبه فاکتوریل اعداد و این داخل برنامه من نباشه. بلکه توی یک فایل با پسوند مثلا cs. یا پسوند دیگه باشه و مثلا 10 خط باشه و بعد من این متد ها رو همینجوری درست کنم در اوقات فراغت و بعد در هر پروژه ای که می خوام ازش استفاده کنم. نمی دونم دقیقا چطور استفاده کنم ولی فکر کنم اگه پسوندش cs. باشه بتونم کپی کنم توی پروژه اصلی
بله. متد باید داخل یک کلاس باشه، متد بدون کلاس نداریم، پس اگر متد رو تعریف می کنید باید یک کلاس هم برایش تعریف کنید.
کد cs مادامی که کامپایل نشده قابل اجرا نیست، پس اگر بخواهید از این متد در پروژه فلان استفاده کنید یا باید فایل cs رو به پروژه اضافه کنید یا قبلا کامپایلش کرده باشید و تا بصورت یک dll دربیاد و در پروژه به اون dll ئه reference بدهید.

در تعریف فضای نام محدودیتی ندارید، می توانید یک فضای نام که ربطی به برنامه تون نداره برای کلاس و متد تون تعریف کنید و در هر پروژه ای ازش استفاده کنید.
3- یکی هم مفهوم API های ویندوز. من به یکی از برنامه نویس های خارجی پیام دادم چرا این برنامه رو برای ویندوز 7 درست نمی کنی چون من و خیلی های دیگه ویندوز 7 فقط دوست داریم و اون پیام داد که این برنامه از فلان API ویندوز استفده می کنه که توی ویندوز 7 نیست و توی ویندوز 8 و 10 وجود داره. الان اسمش یادم نیست چون ایمیلش رو حذف کردم ولی باید دبوراه ازش بپرسم.
الان این API های ویندوز های 7 و 8 و 10 در کجا قرار دارند که ما بتونیم در پروژه هامون ازشون استفاده کنیم و از کجا بفهمیم که هر API کاربردش چیه و اصلا چطوری باید توی سی شارپ بیاریم.
سایت مایکروسافت منبع اطلاعاتی سرویس هایی است که نرم افزار های مایکروسافت دارند.
مثلا وقتی یک برنامه نویس می بینه یک API در ویندوز 7 نیست ولی توی 10 هست چرا نمی تونه برای ویندوز 7 اون رو خودش دستی ایجاد کنه. کار سختیه یا نشدنیه
جواب مشخص و ثابتی نداره. API برای استفاده از یک سرویسی است که نرم افزار فلان میده، مثلا سیستم عامل ویندوز یکسری سرویس داره که برای استفاده از اونها API هست. وقتی یک سرویسی از اساس وجود نداشته باشه، اضافه کردن API اش بی فایده است. یا باید از نرم افزار های دیگری استفاده کرد که مشابه اون سرویس رو می دهند یا اگر جایگزینی نداشته باشه قید اش رو زد.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
خواستم بگم Visual Studio 2022 ، نسخه ی preview اش قراره تابستون امسال ارائه بشه :


که نسخه ی کاملش همون سال 2022 احتمالا میاد .
یکی از بزرگترین تغییر این نسخه ، انگار اینه که این نسخه ، 64 بیت هم ارائه میشه .
پلتفرم جدید MAUI که تا جایی که متوجه شدم ، جایگزینی برای پلتفرم Xamarin.Form هست هم ویژگی مهم دیگه اش هست (البته تغییرات ، زیادن) .
به همراه .Net 6 که مهمترین تغییراتش را در سطح پایین و در سطح clr گفتن هست که بیشتر باعث افزایش کارایی و سرعت میشه :


اگه هم اشتباه متوجه نشده باشم ، starcture های بیشتری را برای کتابخونه های .net 6 توسعه میدن (که استفاده از استراکچر باعث افزایش سرعت بیشتری میشه) .

به همراه نسخه ی 9 سی شارپ برای .Net (نه برای .Net Framework که فقط تا نسخه ی 7.3 را بصورت رسمی در آخرین نسخه های ویژال استودیو پشتیبانی میکنه) .

البته استاد ، اگه اشتباهی کردم یا نکاتی هست ، بفرمایند .
 

SU-57

Active Member
سجاد جان سلام

من توی solution و توی پروژه اون یک کلاس ایجاد کردم به نام Test1.cs و خودش داخلش کلاس داشت و من توی این کلاس یک متد ایجاد کردم که یک عدد رو بر می گردونه از نوع int بعد روی Build Solution کلیک کردم و دیدم که فقط یک فایل exe از Form ایجاد شد و اصلا از اون فایل Test1.cs هیچ فایل dll ایجاد نشد. لطفا بگو باید چیکار کنم.

بعد اومدم یک پزوژه جدید ایجاد کردم ولی از نوع Class Library(.NET Standard و یک فایل به نام ClassLibrary1 ایجاد کرد که داخلش فایل با نام class1.cs قرار داشت و من داخل اون یک متد اضافه کردم و بعد کامپایل کردم و سه تا فایل ایجاد شد که یکیش dll داشت. بعد اومدم این فایل dll رو گذاشتم توی فولدر یکی از solution هایی که فبلا ساختم و به رفرنس هاش اضافه کردم. حالا چطوری از متدی که توی اون فایل dll هست می تونم توی پروژم استفاده کنم. راه ارتباط دادنش به چه صورته؟

البته بعد از کامپایل 3 تا فایل ایجاد شد
ClassLibrary1.deps.json و ClassLibrary1.dll و ClassLibrary1.pdb
من فقط ClassLibrary1.dll رو جدا کردم بردم توی اون پروژه اصلی. حالا این کار درست یا باید همشون رو ببرم و همچنین این دو فایل دیگه که پسوند json و pdb دارن کاربردشون چیه
 

the_king

مدیرکل انجمن
سجاد جان سلام

من توی solution و توی پروژه اون یک کلاس ایجاد کردم به نام Test1.cs و خودش داخلش کلاس داشت و من توی این کلاس یک متد ایجاد کردم که یک عدد رو بر می گردونه از نوع int بعد روی Build Solution کلیک کردم و دیدم که فقط یک فایل exe از Form ایجاد شد و اصلا از اون فایل Test1.cs هیچ فایل dll ایجاد نشد. لطفا بگو باید چیکار کنم.
البته لزومی نداره که حتما dll باشه، ولی به هر حال در منوی Project گزینه ...project name} Properties} زبانه Application گزینه Output type باید Class Library باشه تا dll بسازه.
بعد اومدم یک پزوژه جدید ایجاد کردم ولی از نوع Class Library(.NET Standard و یک فایل به نام ClassLibrary1 ایجاد کرد که داخلش فایل با نام class1.cs قرار داشت و من داخل اون یک متد اضافه کردم و بعد کامپایل کردم و سه تا فایل ایجاد شد که یکیش dll داشت. بعد اومدم این فایل dll رو گذاشتم توی فولدر یکی از solution هایی که فبلا ساختم و به رفرنس هاش اضافه کردم. حالا چطوری از متدی که توی اون فایل dll هست می تونم توی پروژم استفاده کنم. راه ارتباط دادنش به چه صورته؟
اولا کلاس هاتون باید public باشه تا خارج از اون dll تون قابل استفاده سایر اسمبلی ها باشه. ثانیا اسم فضای نام اون dll رو یا در ابتدای کد using می کنید یا جایی که میخواهید از محتویات اون dll استفاده کنید اول فضای نام رو می نویسید. اگر کلاسی داخل کلاس دیگری باشه، اسم کلاس خارجی رو هم باید اول بنویسید. مثلا mynamespae.Class1.Class2

البته بعد از کامپایل 3 تا فایل ایجاد شد
ClassLibrary1.deps.json و ClassLibrary1.dll و ClassLibrary1.pdb
من فقط ClassLibrary1.dll رو جدا کردم بردم توی اون پروژه اصلی. حالا این کار درست یا باید همشون رو ببرم و همچنین این دو فایل دیگه که پسوند json و pdb دارن کاربردشون چیه
اون فایل json مشخصات و تنظیمات جانبی اسمبلی رو ثبت می کنه.
فایل pdb اطلاعاتی است که موقع debug کردن اون فایل اجرایی لازم میشه تا ویژوال استدیو بتونه بفهمه این قسمت که در dll یا exe خطا میده مربوط به کدوم بخش از کد برنامه است.
 

SU-57

Active Member
البته لزومی نداره که حتما dll باشه، ولی به هر حال در منوی Project گزینه ...project name} Properties} زبانه Application گزینه Output type باید Class Library باشه تا dll بسازه.

اولا کلاس هاتون باید public باشه تا خارج از اون dll تون قابل استفاده سایر اسمبلی ها باشه. ثانیا اسم فضای نام اون dll رو یا در ابتدای کد using می کنید یا جایی که میخواهید از محتویات اون dll استفاده کنید اول فضای نام رو می نویسید. اگر کلاسی داخل کلاس دیگری باشه، اسم کلاس خارجی رو هم باید اول بنویسید. مثلا mynamespae.Class1.Class2


اون فایل json مشخصات و تنظیمات جانبی اسمبلی رو ثبت می کنه.
فایل pdb اطلاعاتی است که موقع debug کردن اون فایل اجرایی لازم میشه تا ویژوال استدیو بتونه بفهمه این قسمت که در dll یا exe خطا میده مربوط به کدوم بخش از کد برنامه است.

استاد علی خیلی ممنونم از پاسختون ولی من نتونستم انجام بدم.
کلمه کلیدی public رو هنوز نخوندم چون توی قسمت 29 آقا سجاد آموزش دادن و من توی قسمت 27 هستم ولی خوب وقتی کلاس ایجاد می کنم کلمه public وجود داره و اکثرا خودش اونجا هست مثل اول رویدادها اتوماتیک ایجاد می شه.
_________________________

1- زبانه Application رو به Class Library تغییر دادم و فایل dll تشکیل شد اما نه برای اون کلاس جداگانه ای که Add کرده بود با پسوند cs بلکه به طور کلی از پروژه من فایل dll تشکیل داد که اسم پروژه هم داره. احتمالا همه کلاس های cs. که در یک پروژه WinFormApp ایجاد بشن راه حلی نداره وقتی پروژه کامپایل می شه برای هر فایل cs. یک dll جداگانه تشکیل بشه یا شاید هم بشه توی این موارد فقط یک فایل cs. داخل پروژه رو به فایل dll تبدیل کرد.

2- حالا من اومدم یک پروژه ایجاد کردم با نام WindowsFormsApp1 و داخل این پروژه یک کلاس ایجاد کردم به نام Class2.cs که داخل این کلاس متدی ایجاد کردم به نام Method1 که این متد یک عددی رو می گیره و دو برابرش می کنه.

بعد اومدم یک کلاس خالی استاندارد با نام ClassLibrary3 ایجاد کردم و داخلش متدی ایجاد کردم به نام Method2 که این متد یک عدد رو می گیره و به توان 2 می رسونه. این کلاس رو کامپیال کردم و فایل dll اون رو در مسیر WindowsFormsApp1 قرار دادم و به رفرنس ها اضافه کردم. بعد روی فرم یک دکمه Button گذاشتم و داخلش یک عددی مثل 15 رو در قالب متغیر int گذاشتم.

حالا می خوام این فایل dll و فایل class2.cs رو طوری به این دکمه button و رویدادی که داره ارتباط بدم که وقتی روی button کلیک می کنم اعداد 30 و 225 رو برگردونه با MessageBox.show. یعنی این عدد بره داخل متد ها و برگشت داده بشه. این قسمت رو بعد از پاسخ شما 2 ساعت کار کردم آخر نشد. فایل ها رو پیوست می کنم اگه وقت داشتید نگاه کنید ببینید راه حلش چیه.
 

پیوست ها

  • ClassLibrary3.zip
    110.1 کیلوبایت · بازدیدها: 2
  • WindowsFormsApp1.zip
    299.9 کیلوبایت · بازدیدها: 1

the_king

مدیرکل انجمن
1- زبانه Application رو به Class Library تغییر دادم و فایل dll تشکیل شد اما نه برای اون کلاس جداگانه ای که Add کرده بود با پسوند cs بلکه به طور کلی از پروژه من فایل dll تشکیل داد که اسم پروژه هم داره. احتمالا همه کلاس های cs. که در یک پروژه WinFormApp ایجاد بشن راه حلی نداره وقتی پروژه کامپایل می شه برای هر فایل cs. یک dll جداگانه تشکیل بشه یا شاید هم بشه توی این موارد فقط یک فایل cs. داخل پروژه رو به فایل dll تبدیل کرد.
نه. همچنین تفکیک پذیری ای نیست، فایل cs بعد از کامپایل دیگه هیچ نقشی ای نداره, صد تا فایل cs هم داشته باشید بعد از کامپایل صرفا یک خروجی dll یا exe است، فرقی نمی کرد که محتویات اون cs ها در چند فایل بوده، چیزی که شما برای cs هاتون می توانید انجام بدهید تفکیک بر اساس فضای نام ئه.
2- حالا من اومدم یک پروژه ایجاد کردم با نام WindowsFormsApp1 و داخل این پروژه یک کلاس ایجاد کردم به نام Class2.cs که داخل این کلاس متدی ایجاد کردم به نام Method1 که این متد یک عددی رو می گیره و دو برابرش می کنه.

بعد اومدم یک کلاس خالی استاندارد با نام ClassLibrary3 ایجاد کردم و داخلش متدی ایجاد کردم به نام Method2 که این متد یک عدد رو می گیره و به توان 2 می رسونه. این کلاس رو کامپیال کردم و فایل dll اون رو در مسیر WindowsFormsApp1 قرار دادم و به رفرنس ها اضافه کردم. بعد روی فرم یک دکمه Button گذاشتم و داخلش یک عددی مثل 15 رو در قالب متغیر int گذاشتم.

حالا می خوام این فایل dll و فایل class2.cs رو طوری به این دکمه button و رویدادی که داره ارتباط بدم که وقتی روی button کلیک می کنم اعداد 30 و 225 رو برگردونه با MessageBox.show. یعنی این عدد بره داخل متد ها و برگشت داده بشه. این قسمت رو بعد از پاسخ شما 2 ساعت کار کردم آخر نشد. فایل ها رو پیوست می کنم اگه وقت داشتید نگاه کنید ببینید راه حلش چیه.
در کلاس ClassLibrary3 تون یک کلاس Class1 دارید که public ئه، اما متد Method2 ای که داخل این Class1 دارید چی؟ public هست؟ نه. private ئه. بصورت پیشفرض محتویات اون کلاس private ئه. باید بجای int Method2(int a) می نوشتید public int Method2(int a) تا Method2 برای دسترسی خارج از بدنه Class1 مهیا باشه.
این قضیه برای اون int Method1(int a) داخل Class2 هم صدق می کنه، Method1 ای که private باشه رو نمی توانید از بیرون Class2 فراخوانی کنید، باید public اش کنید.
وقتی public شون کردید اونوقت می توانید با کدی شبیه به ()var c = new ClassLibrary3.Class1 از کلاس شیء بسازید
و با کدی شبیه به var a = c.Method2(var1) در اون شیء متدی رو فراخوانی کنید.
 

SU-57

Active Member
سلام

1- می خواستم بدونم زبان SQL می تونه زیر مجموعه ای از زبان SQl Server باشه. یعنی کلمات کلیدی مختصری که در زبان SQl هست در صورت یادگیری، دقیقا این کلمات کلیدی در SQL Server هم هست که دوباره نیازی به یادگیری نباشه. همچنینی با یادگیری SQl می شه گفت مثلا 50 درصد SQL Server یاد گرفتم و برای کسی که یک نفره می خواد در آینده برنامه بنویسه همین کلمات کلیدی SQL کافیه در پروژه های کوچک و نهایت متوسط.

2- چرا باید کلمات کلیدی پایگاه داده همیشه به صورت بزرگ نوشته بشه مثلا تو زبان SQL نوشته فرقی نداره که بزرگ نوشته بشه یا کوچک اما باز می بینم همه جا بزرگ نوشته می شه مثلا select همیشه SELECT نوشته می شه. دلیلش چیه یا کاربردش چیه و چه هدفی برای اینکار دارن. مثلا اگه با حروف کوچک نوشته بشه چه اتفاقی می افته

3- یک پایگاه داده به نام Northwind وجود داره که از روی اون آموزش میدن ولی من هرجا گشتم فقط نسخه Access وجود داره و اگه می شه نسخه MDF اون رو به طور جداگانه برای دانلود قرار بدید که داشته باشم چون می خوام با این نسخه کار کنم. البته من بلد نیستم چطوری این پایگاه داده رو به یک پروژه وصل کنم و شاید خیلی کار داشته باشه برای همین چون فقط می خوام کلمات کلیدی پاشگاه داده SQl رو فعلا یاد بگیریم شما این پایگاه داده رو به یک پروژه وصل کنید و برای من قرار بدهید تا من فقط Query بگیرم از دستورات که کلمات کلیدی رو فعلا یاد بگیرم.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام

1- می خواستم بدونم زبان SQL می تونه زیر مجموعه ای از زبان SQl Server باشه. یعنی کلمات کلیدی مختصری که در زبان SQl هست در صورت یادگیری، دقیقا این کلمات کلیدی در SQL Server هم هست که دوباره نیازی به یادگیری نباشه. همچنینی با یادگیری SQl می شه گفت مثلا 50 درصد SQL Server یاد گرفتم و برای کسی که یک نفره می خواد در آینده برنامه بنویسه همین کلمات کلیدی SQL کافیه در پروژه های کوچک و نهایت متوسط.
سوال هاتون ارتباطی با موضوع این تاپیک و زبان #C نداره، لطفا برای اینجور سوالات تاپیک جدید ایجاد کنید.

نه، برعکس ئه، SQL یک زبان استاندارد ئه که یکسری نسخه های الحاقی (extensions) داره و یکسری زیر زبان ها (sub-languages).
نسخه های الحاقی (مثلا T-SQL و PL/SQL) یکسری موارد به SQL اضافه می کنند که در نسخه استاندارد SQL نیست.
و زیر زبان ها هم (مثلا DML و DQL) که کلا می توانند تفاوت های اساسی داشته باشند. فرضا زبان ای که در SQL Server تحت عنوان T-SQL می بینید نسخه الحاقی SQL ئه و در واقع SQL ئه به همراه یکسری تغییرات.
با یادگیری زبان SQL برنامه نویسی برای ارتباط با SQL Server رو یاد میگیرید، نه نحوه نگهداری و مدیریت خود SQL Server. هر سیستم مدیریت پایگاه داده ای مشخصات و قابلیت ها و نحوه مدیریتی داره که مستقل از اون زبان SQL ئه، درصد هم نداره.
دانستن SQL در مرحله مقدماتی لازمه اما نگهداری و مدیریت هر سیستم مدیریت پایگاه داده ای نیاز به یادگیری نکات فنی خاص خودش رو داره.
2- چرا باید کلمات کلیدی پایگاه داده همیشه به صورت بزرگ نوشته بشه مثلا تو زبان SQL نوشته فرقی نداره که بزرگ نوشته بشه یا کوچک اما باز می بینم همه جا بزرگ نوشته می شه مثلا select همیشه SELECT نوشته می شه. دلیلش چیه یا کاربردش چیه و چه هدفی برای اینکار دارن. مثلا اگه با حروف کوچک نوشته بشه چه اتفاقی می افته
کلمات کلیدی زبان SQL نسبت به بزرگی و کوچکی حروف حساس نیستند، پس فرقی نمی کنه با حروف بزرگ نوشته بشوند یا کوچک، ولی معمولا برای افزایش خوانایی کد با حروف بزرگ نوشته می شوند. در ضمن در بعضی سیستم های مدیریت داده تنظیم حساسیت به بزرگی و کوچکی حروف وجود داره و روی اسامی سایر موارد مثلا اسامی ستون ها و جدول ها تاثیر خواهد داشت یعنی الزاما شرایط اون کلمات کلیدی رو ندارند، ممکنه بزرگی و کوچکی حروف در یک کد مهم باشه.
3- یک پایگاه داده به نام Northwind وجود داره که از روی اون آموزش میدن ولی من هرجا گشتم فقط نسخه Access وجود داره و اگه می شه نسخه MDF اون رو به طور جداگانه برای دانلود قرار بدید که داشته باشم چون می خوام با این نسخه کار کنم. البته من بلد نیستم چطوری این پایگاه داده رو به یک پروژه وصل کنم و شاید خیلی کار داشته باشه برای همین چون فقط می خوام کلمات کلیدی پاشگاه داده SQl رو فعلا یاد بگیریم شما این پایگاه داده رو به یک پروژه وصل کنید و برای من قرار بدهید تا من فقط Query بگیرم از دستورات که کلمات کلیدی رو فعلا یاد بگیرم.
با اجرا کردن کد SQL در SQL Server Management Studio پایگاه داده اش ایجاد میشه :
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اشیاء بصری یکسری داده دارن، چه دو بعدی و چه سه بعدی، چه Bitmap و چه Vector، اون داده ها توسط رندر کننده در حافظه تصویری مشخصی رندر میشه، حالا با یک نخ یا چند نخ. بعد اون حافظه تصویری با نرخ فریم ثابت یا متغیر به حافظه کارت گرافیکی منتقل میشه تا نمایش بروز بشه. ممکنه رندر کننده GDI باشه، +GDI باشه، DirectX باشه و ...
اون بخش انتقال حافظه تصویری به حافظه کارت گرافیکی هم درایور کارت گرافیکی انجام میده.


اساس کار یکی ئه، اما طبعا در بازی هم رندر کننده و هم روال نمایش متفاوت ئه.

کارت گرافیکی در هر جایی که به درایور کارت گرافیکی رجوع بشه نقش داره، بستگی به کدی داره که نوشته شده، الزاما هم کاری که با پردازنده کارت گرافیکی انجام میشه ربطی به نمایش نداره، ممکنه نقش محاسباتی داشته باشه.
البته نمیدونم در تاپیک معماری پردازنده بگم یا اینجا (که بحث برنامه هم هست) .

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

نه الزاما. بستگی به کد رسم و قابلیت های درایور داره.

بستگی به کد داره، ممکنه از پردازنده کارت گرافیکی کمک بگیره.

به شرطی که رندر کننده از قابلیت های کارت گرافیکی به خوبی استفاده کنه.
....


سلامی مجدد
خیلی ممنون استاد از توضیح مفصل تون .

چیزی که توی سایت اینتل نوشته بود ، من برداشت کردم که بازی هایی که تعداد زیادی اشیاء متحرک دارن و برخورد دارن و کلا محاسبات برخورد و تخریب فیزیکی و کلا محاسبات فیزیکی و اینهاشون زیاده ، اون بازی ها ، هر فرضا یه تعداد خاصی از محاسبات اشیاءشون را در یه هسته پردازش میکنن (فرضا پردازش هر 5 هزار تا اشیاء متحرک را در یه هسته پردازش میکنن) .
مثل بازی Total War Three Kingdoms (که بسته به تعداد هسته های cpu ، انگار اشیاء را کم یا زیاد میکنه . قابلیت cpu scaling داره) :


پس کلا میشه نتیجه گرفت که هر چی تعداد اشیاء متحرک و فیزیک برخورد و در نتیجه محاسبات فیزیکی و بقیه ی محاسبات (مثل هوش مصنوعی و ...) بیشتر از یه حد خاصی باشه ، اون بازی به تعداد بیشتری از هسته های cpu برای پردازش نیاز داره؟

---------------------------------------

اما یه سئوالی که همیشه توی ذهنم هست اینه که همیشه سرعت رندر در نرم افزارهای 3 بعدی با سرعت رندر در بازی ها ، بسیار بسیار تفاوت دارن . دلیلش چیه؟

حتی ما اگه رندر را در نرم افزارهای 3 بعدی ، تحت gpu هم بگیریم (که معمولا سرعتشون 10 برابر یا ده ها برابر سریعتر از سرعت رندر در cpu های هم قیمتِ همون گرافیک هست) و تنظیمات بازی را هم کمتر در نظر بگیریم ، اما باز هم نسبت به رندر بازی ، بسیار بسیار ضعیف تر هستند .

فرضا رندرِ همین بازی ماهی در پست 1657 ، که بصورت میانگین انگار 170 فریم میده (نمیدونم با چه گرافیکی) ، اما همین را در نرم افزارهای 3 بعدی شبیه سازی و تحت موتور رندر gpu ، با همون کارت گرافیک رندر کنن ، قطعا رندر کردنِ یک فریمش ، خیلی بیشتر از 1/170 اُمِ یک ثانیه طول میکشه .

من سال ها پیش که یه کم سینما 4 دی کار میکردم و تصویر زیر را با cpu i5 4460 رندر کرده بودم :

CSharp.jpg


رندر کردن همین تصویر ، 1 ساعت و خردی طول کشید (مطمئنم از 1 ساعت و 10 دقیقه بیشتر بود . حالا شاید 1 ساعت و 40 دقیقه هم طول کشیده بود) .
حالا اگه موتوری تحت gpu میبود (و فرضا کارت GTX 1050Ti میبود) ، بعید میدونم زمان رندر را کمتر از 7 دقیقه میکرد . نهایت امرش این بود که 3 دقیقه میکرد . البته صرفا حدس خودم هست و تحت gpu رندر نکرده بودم .

حالا اگه همین در محیط بازی بود ، یک فریم رو در کمتر از یک 60 اُمِ ثانیه (حالا کمتر یا بیشتر) رندر میکرد .

در کل سئوالم اینه که تفاوت رندر در بازی ، با رندر در نرم افزارهای 3 بعدی چیه که این همه با هم اختلاف دارن ؟
ظاهرا فرقی ندارن . اما باید داشته باشن که این همه مدت زمان رندرشون فرق داره؟
پس اون تفاوت ، چیه؟
تشکر استاد .
 

the_king

مدیرکل انجمن
سلامی مجدد
خیلی ممنون استاد از توضیح مفصل تون .

چیزی که توی سایت اینتل نوشته بود ، من برداشت کردم که بازی هایی که تعداد زیادی اشیاء متحرک دارن و برخورد دارن و کلا محاسبات برخورد و تخریب فیزیکی و کلا محاسبات فیزیکی و اینهاشون زیاده ، اون بازی ها ، هر فرضا یه تعداد خاصی از محاسبات اشیاءشون را در یه هسته پردازش میکنن (فرضا پردازش هر 5 هزار تا اشیاء متحرک را در یه هسته پردازش میکنن) .
مثل بازی Total War Three Kingdoms (که بسته به تعداد هسته های cpu ، انگار اشیاء را کم یا زیاد میکنه . قابلیت cpu scaling داره) :


پس کلا میشه نتیجه گرفت که هر چی تعداد اشیاء متحرک و فیزیک برخورد و در نتیجه محاسبات فیزیکی و بقیه ی محاسبات (مثل هوش مصنوعی و ...) بیشتر از یه حد خاصی باشه ، اون بازی به تعداد بیشتری از هسته های cpu برای پردازش نیاز داره؟
به پردازنده با توان بیشتری نیاز داره، نه الزاما تعداد هسته بیشتر، نه الزاما هسته های سریعتر. حالا ممکنه این افزایش توان با هسته های سریعتر عملی باشه یا تعداد هسته های بیشتر یا معماری پیشرفته تر یا ... در نظر بگیرید که یک پردازنده با تعداد هسته های کمتر ممکنه از یک مدل پردازنده دیگه با هسته های بیشتر بازدهی بهتری داشته باشه.
اما یه سئوالی که همیشه توی ذهنم هست اینه که همیشه سرعت رندر در نرم افزارهای 3 بعدی با سرعت رندر در بازی ها ، بسیار بسیار تفاوت دارن . دلیلش چیه؟
اولا کیفیت رندر شون معمولا بهتر و جزئیات بیشتری داره که پردازش بیشتری نیاز خواهد داشت که الزاما همه شون هم با پردازنده کارت گرافیکی و درایورش پشتیبانی نمی شوند و پردازنده اصلی رو درگیر میکنه که قبلا در موردش صحبت کرده ایم. ثانیا منبع داده های رندر شون معمولا مثل بازی ها برای افزایش سرعت رندر کاهش حجم داده نشده اند و بهینه نیستند. ثالثا در بازی فریم باید فقط نمایش داده بشه، نیازی به انکود کردن فریم های خروجی و ذخیره سازی ویدئو نیست که خود انکود کردن و ساختن فایل ویدئویی فرضا mp4 یا avi و ذخیره سازی اش زمان بر ئه.
حتی ما اگه رندر را در نرم افزارهای 3 بعدی ، تحت gpu هم بگیریم (که معمولا سرعتشون 10 برابر یا ده ها برابر سریعتر از سرعت رندر در cpu های هم قیمتِ همون گرافیک هست) و تنظیمات بازی را هم کمتر در نظر بگیریم ، اما باز هم نسبت به رندر بازی ، بسیار بسیار ضعیف تر هستند .
در بازی ها تا جایی که امکان داره جزئیات بی تاثیر یا با تاثیر نامحسوس رو پیش از رندر هرس و حذف می کنند چون سرعت رندر همیشه براشون عامل تعیین کننده است.
فرضا رندرِ همین بازی ماهی در پست 1657 ، که بصورت میانگین انگار 170 فریم میده (نمیدونم با چه گرافیکی) ، اما همین را در نرم افزارهای 3 بعدی شبیه سازی و تحت موتور رندر gpu ، با همون کارت گرافیک رندر کنن ، قطعا رندر کردنِ یک فریمش ، خیلی بیشتر از 1/170 اُمِ یک ثانیه طول میکشه .

من سال ها پیش که یه کم سینما 4 دی کار میکردم و تصویر زیر را با cpu i5 4460 رندر کرده بودم :

CSharp.jpg


رندر کردن همین تصویر ، 1 ساعت و خردی طول کشید (مطمئنم از 1 ساعت و 10 دقیقه بیشتر بود . حالا شاید 1 ساعت و 40 دقیقه هم طول کشیده بود) .
حالا اگه موتوری تحت gpu میبود (و فرضا کارت GTX 1050Ti میبود) ، بعید میدونم زمان رندر را کمتر از 7 دقیقه میکرد . نهایت امرش این بود که 3 دقیقه میکرد . البته صرفا حدس خودم هست و تحت gpu رندر نکرده بودم .

حالا اگه همین در محیط بازی بود ، یک فریم رو در کمتر از یک 60 اُمِ ثانیه (حالا کمتر یا بیشتر) رندر میکرد .

در کل سئوالم اینه که تفاوت رندر در بازی ، با رندر در نرم افزارهای 3 بعدی چیه که این همه با هم اختلاف دارن ؟
ظاهرا فرقی ندارن . اما باید داشته باشن که این همه مدت زمان رندرشون فرق داره؟
پس اون تفاوت ، چیه؟
قبلا در موردش صحبت کرده ایم.
در رندر بازی ها توجه روی سرعت رندر زیاد ئه، نه الزاما بهترین کیفیت یا حداکثر جزئیات، هر جزئیاتی که در ظاهر تاثیر نامحسوس داشته باشه هرس می کنند، هر الگوریتم سریعتر گرچه تخمینی رو بکار می برند. فقط برای نمونه جستجو کنید و ببینید در Quake III برای محاسبه جذر معکوس عدد (Fast inverse square root) از چه کد عجیب و غریب سریعتر ولی با دقت تقریبی استفاده شده. در موردش یک ویدئو هم در یوتیوب بود.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
یکسری سوالات تون رو که خودتون باید جواب بدید چون شما دارید مستنداتش رو میخونید، من که نمی خونم. اینکه الان برای موردی کاربردی در برنامه تون سراغ ندارید خیلی مهم نیست، مهم اینه که الان بدونید فلان چیز برای فلان عملیات هست، که بعدا اگر بهشون نیاز پیدا کردید بدونید که همچین موردی وجود داشته.
چیزی که خیلی مهمه و باید بهش توجه داشته باشید ماهیت backup های vss ئه. مثلا شما نمی توانید backup ای بگیرید و بعد منتقل کنید به فلش درایو و بعد یک مدت برگردونید و توقع داشته باشید بشه باهاش restore انجام داد. backup باید همیشه در دسترس سیستم باشه که تکمیلش کنه. backup ای که در گذشته گرفته شده بوده با تغییراتی که در آینده پیش میاد گرفته میشه، نه همون لحظه. شما که نمی توانید backup ئه vss رو با فایل zip ای مقایسه کنید که دیگه تغییر نمی کنه.
اگه شما backup جدیدی میگیرید که نسبت به backup کامل ای differential ثبت میشه به اطلاعات فایل های حذف شده نیازی نداره چون در backup کامل قبلی هست، به فایل های جدید هم نیازی نداره چون خود فایل های جدید در درایو سرجاشون هستند و تغییری نداشته اند. این backup در آینده زمانی حجیم میشه که فایل هایی که در زمان backup گیری جدید محسوب میشدند تغییر کنند یا حذف شوند.
backup گیری رو باید با دوره زمانی فرضا هفته ای یکبار مشخص کنید، وگرنه ملاک دیگه ای در عمل قابل اجرا نیست.

کد:
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        private static extern bool GetVolumePathNamesForVolumeNameW(string lpszVolumeName, string lpszVolumePathNames, int cchBuferLength, ref int lpcchReturnLength);

        private string VolumeGUID2Letter(string guid)
        {
            int length = 100;
            var letter = new string(' ', length);
            if (GetVolumePathNamesForVolumeNameW(guid, letter, length, ref length) == false)
            {
                return string.Empty;
            }
            return letter.Split('\0')[0];
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var volumeGUID = @"\\?\Volume{1b10fe48-8172-46ed-3e72-c8a429dc89fb}\";
            var volumeLetter = VolumeGUID2Letter(volumeGUID);
        }

استاد .
میگم در این پست ، در متد GetVolumePathNamesForVolumeNameW ، پارامتر دومش (پارامتر lpszVolumePathNames) هر چند از نوع LPWCH هست (یعنی اشاره گر به کاراکتر که همون string هست) ، اما در توضیحات پارامتر نوشته که :
"یک اشاره گر به حافظه ای که لیستی از drive letter (نام درایو) را دریافت میکنه"
و همچنین نوشته که "(این) لیست ، آرایه ای از string هاست"

A pointer to a buffer that receives the list of drive letters and mounted folder paths. The list is an array of null-terminated strings terminated by an additional NULL character.

اما وقتی بجای آرایه ای از رشته ؛ نوعِ رشته را مشخص کردیم ، صرفا اشاره گرِ آرایه که همون اشاره گرِ به اولین خونه از عضو آرایه باشه (صفر امین ایندکس از آرایه) را برمیگردونه؟
بقیه ی اعضا را در نظر نمیگیره . درسته؟
تشکر استاد
 

the_king

مدیرکل انجمن
استاد .
میگم در این پست ، در متد GetVolumePathNamesForVolumeNameW ، پارامتر دومش (پارامتر lpszVolumePathNames) هر چند از نوع LPWCH هست (یعنی اشاره گر به کاراکتر که همون string هست) ، اما در توضیحات پارامتر نوشته که :
"یک اشاره گر به حافظه ای که لیستی از drive letter (نام درایو) را دریافت میکنه"
و همچنین نوشته که "(این) لیست ، آرایه ای از string هاست"
اما وقتی بجای آرایه ای از رشته ؛ نوعِ رشته را مشخص کردیم ، صرفا اشاره گرِ آرایه که همون اشاره گرِ به اولین خونه از عضو آرایه باشه (صفر امین ایندکس از آرایه) را برمیگردونه؟
بقیه ی اعضا را در نظر نمیگیره . درسته؟
تشکر استاد
اگر در مورد LPWCH و زبان ++C/C صحبت می کنید، فقط چند تعبیر متفاوت از یک شرایط یکسان ئه، فرقی با هم ندارند. اگر a یک آرایه ای از رشته ها باشه که a1 اولین رشته اون آرایه باشه، هر سه درست ئه :
a موقعیت شروع آرایه است.
a موقعیت شروع a1 است.
a موقعیت شروع a1[0] یعنی اولین کاراکتر رشته a1 است.
برای همین تغییر نوع داده تاثیری در آدرس حافظه و کارکرد متد نداره.
و آدرس شروع حافظه ای که به یک کاراکتر اشاره می کنه کاری با طول رشته و میزان حافظه اش نداره، اون lpszVolumePathNames حتی اولین عضو آرایه رو هم در نظر نمی گیره چه برسه به اعضاء بعدی. کاری با این چیزها نداره، فقط به یک کاراکتر اشاره می کنه. اینکه پشت سر اون کاراکتر چند کاراکتر دیگه یا چند رشته دیگه هست بهش ربطی نداره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
همینطور درباره ی جواب تاپیک wpf (من فکر میکردم که بخشی از کد را به Model انتقال بدم اما شما گفتین همه ی اون بخشی که باعث ایجاد آرایه ای از رشته ها میشه را انتقال بدم که متوجه شدم) .

داشتم فکر میکردم که بجای این کد ، یه پروپرتی در کلاس VssBackup یا ExtentionMethodForDriveInfo تعریف کنم که همون کدی که در تاپیک wpf دادم را ، بجاش یه پروپرتی ای فرضا در یکی از این دو کلاس تعریف کنم که همون خروجیِ آرایه ای از رشته ها را بده (لیستِ فرمت شده و تغییر شکل داده از نام درایوهای ثابت در کامپیوتر کاربر نهایی) و بعد بیام کمبوباکس ام را به این پروپرتی ، Binding کنم .

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

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

-----------------------------

بعد اینکه استاد همونطور که در جریانید ، هر بکاپ vss ، و در واقع کلاس VssBackup ، حداقل باید این پروپرتی ها را داشته باشه :
- زمان (ای که بکاپ ایجاد شد) .
- نام (بکاپ) .
- درایو (ای که بکاپ متعلق به اون هست) . (البته در اصل باید مسیر فایل باشه اما در نرم افزارم چون از کل درایو بکاپ میگیرم ، فعلا فقط اطلاعات اون درایو را میذارم) .
- مسیر اختصاصی بکاپ (که اولش با \\localhost شروع میشه که فعلا اسمش را فراموش کردم) .
و ... .


اما چیزی که هست اینه که برای هر درایو ، مجموعه ای از این بکاپ میتونه وجود داشته باشه . بنابراین هر مجموعه ای از بکاپ ای که در یک درایو وجود داره ، یه پروپرتی ای هم میتونه داشته باشه که مشخص کنه که کل مجموعه های اون بکاپ ، واسه ی کدوم درایو هست .
این قضیه ی نام درایو برای کالکشن ای از بکاپ ها (در هر درایو) ، جدای از این هست که هر شی از بکاپ (VssBackup) برای خودش اطلاعاتِ اون درایو را داره که مشخص میکنه که اون شی از بکاپ ، مربوط به کدوم درایو هست .


برای اجرای همچین کالکشن ای از بکاپ (که ویژگیِ اختصاصیِ این کالکشن ، داشتنِ پروپرتی ای هست که تعیین میکنه که کل کالکشن ها ، متعلق به کدوم درایو هستن) ، به نظرتون از همون List<T> یا در واقع همون List<VssBackup > استفاده کنم (یعنی نیاز به تعیینِ درایو برای یه مجموعه ای از بکاپ ها ، چندان ضروری نیست) .
یا اینکه فرضا پیشنهاد میکنید که یه کلاسِ Collection ئه اختصاصی برای کلاس VssBackup بسازم تا اون پروپرتی (نام و اطلاعات درایو برای کل کالکشن) را توش ایجاد کنم؟
کلا نظرتون در این باره چیه؟

تشکر استاد . :rose:
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
همینطور درباره ی جواب تاپیک wpf (من فکر میکردم که بخشی از کد را به Model انتقال بدم اما شما گفتین همه ی اون بخشی که باعث ایجاد آرایه ای از رشته ها میشه را انتقال بدم که متوجه شدم) .

داشتم فکر میکردم که بجای این کد ، یه پروپرتی در کلاس VssBackup یا ExtentionMethodForDriveInfo تعریف کنم که همون کدی که در تاپیک wpf دادم را ، بجاش یه پروپرتی ای فرضا در یکی از این دو کلاس تعریف کنم که همون خروجیِ آرایه ای از رشته ها را بده (لیستِ فرمت شده و تغییر شکل داده از نام درایوهای ثابت در کامپیوتر کاربر نهایی) و بعد بیام کمبوباکس ام را به این پروپرتی ، Binding کنم .

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

به نظر شما ، تعریف همچین پروپرتی ای ، کار درستی هست؟ و انجام بدم؟
طبعا کار اون مشخصه فراتر از وظایف اون دو کلاس ئه و لزومی نداره که در خود اون دو کلاس باشه، Model شما میتونه کلاس های زیادی داشته باشه که برای نیاز های پروژه است و اون مشخصه میتونه در یکی از اون کلاس های خاص پروژه قرار بگیره، نه در کلاس VssBackup یا ExtentionMethodForDriveInfo
یا اینکه در همین View ، اطلاعات آرایه ای از رشته ها که نام درایوهای ثابتِ فرمت شده هست را بگیرم؟
هر چند اگه متدی که این خروجی را میده ، یعنی متدی که آرایه ای از رشته ها که نام درایوهای ثابتِ فرمت شده را میده را به یکی از این دو کلاس منتقل کنم ، باز هم به درد اون کلاس ها نمیخورن و صرفا در View ازشون استفاده میکنم .
کلا نظرتون در این باره چیه؟

-----------------------------

بعد اینکه استاد همونطور که در جریانید ، هر بکاپ vss ، و در واقع کلاس VssBackup ، حداقل باید این پروپرتی ها را داشته باشه :
- زمان (ای که بکاپ ایجاد شد) .
- نام (بکاپ) .
- درایو (ای که بکاپ متعلق به اون هست) . (البته در اصل باید مسیر فایل باشه اما در نرم افزارم چون از کل درایو بکاپ میگیرم ، فعلا فقط اطلاعات اون درایو را میذارم) .
- مسیر اختصاصی بکاپ (که اولش با \\localhost شروع میشه که فعلا اسمش را فراموش کردم) .
و ... .


اما چیزی که هست اینه که برای هر درایو ، مجموعه ای از این بکاپ میتونه وجود داشته باشه . بنابراین هر مجموعه ای از بکاپ ای که در یک درایو وجود داره ، یه پروپرتی ای هم میتونه داشته باشه که مشخص کنه که کل مجموعه های اون بکاپ ، واسه ی کدوم درایو هست .
این قضیه ی نام درایو برای کالکشن ای از بکاپ ها (در هر درایو) ، جدای از این هست که هر شی از بکاپ (VssBackup) برای خودش اطلاعاتِ اون درایو را داره که مشخص میکنه که اون شی از بکاپ ، مربوط به کدوم درایو هست .


برای اجرای همچین کالکشن ای از بکاپ (که ویژگیِ اختصاصیِ این کالکشن ، داشتنِ پروپرتی ای هست که تعیین میکنه که کل کالکشن ها ، متعلق به کدوم درایو هستن) ، به نظرتون از همون List<T> یا در واقع همون List<VssBackup > استفاده کنم (یعنی نیاز به تعیینِ درایو برای یه مجموعه ای از بکاپ ها ، چندان ضروری نیست) .
یا اینکه فرضا پیشنهاد میکنید که یه کلاسِ Collection ئه اختصاصی برای کلاس VssBackup بسازم تا اون پروپرتی (نام و اطلاعات درایو برای کل کالکشن) را توش ایجاد کنم؟
کلا نظرتون در این باره چیه؟
نظری ندارم، پروژه با نظر طراحش پیاده میشه، کد رو طبق سلیقه و معیارهای خودتون طراحی کنید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
طبعا کار اون مشخصه فراتر از وظایف اون دو کلاس ئه و لزومی نداره که در خود اون دو کلاس باشه، Model شما میتونه کلاس های زیادی داشته باشه که برای نیاز های پروژه است و اون مشخصه میتونه در یکی از اون کلاس های خاص پروژه قرار بگیره، نه در کلاس VssBackup یا ExtentionMethodForDriveInfo

نظری ندارم، پروژه با نظر طراحش پیاده میشه، کد رو طبق سلیقه و معیارهای خودتون طراحی کنید.

آها خیلی ممنون .
ولی همونطور که میدونید ، از این دست اعضایی که به درد یک کلاسِ خاص نمیخوره (که جریانش را در پست قبلی توضیح دادم) و صرفا در ارتباط با View هست که معنا پیدا میکنه ، در طول پروژه ، زیادتر و زیادتر میشن .

در واقع نیازهای معماری MVVM هست که این نیازِ اضافی برای این نوع اعضا را بوجود میاره . (چون در معماری غیر MVVM ، فرضا همون کد در تاپیک wpf ، در همون View بود و لازم به جدا شدن نداشت) .

پس به نظرتون چطوره یه کلاس در Model بنام ExteraMemberForMVVM تعریف کنم تا این اعضاهایی که به درد یک کلاس خاصی نمیخوره و صرفا در پروژه ی MVVM (و در کد تاپیک wpf که دادم ، در ارتباط با View) هست که معنا پیدا میکنه را در اون تعریف کنم؟


شاید ممکنه بگید این چه سئوال های بی خودی که میپرسم . اما همونطور که میدونید ، اینها ، الگوی طراحی نرم افزارم را تشکیل میده که اگه بعدا بخوام تعویضش کنم (یعنی الان یه چیز مناسبی در نیاد و بعدا بخوام تعویضش کنم) ، شاید دوباره خیلی از کدهای 3 لایه ی View و Model و ViewModel را مجددا باید خیلی هاش را تغییر بدم .

ای کاش این دو تا سئوال را هم توی تاپیک wpf میپرسیدم . فکر نمیکردم مجددا به mvvm ربط پیدا کنه .
تشکر استاد .
 

جدیدترین ارسال ها

بالا