View Full Version : فضاهای نامی و کلاسهای مفید و متداول
eshpilen
یک شنبه 18 مهر 1389, 11:10 صبح
چون از مدتی قبل دارم Class Library دات نت رو مطالعه میکنم و گاهی موارد مهمی میبینم که بعدا خودم هم ممکنه اسم و مکان دقیق اونا رو یادم بره، و از طرف دیگه بخاطر آشنایی کسانی که رفرنس کلاسهای دات نت رو نمیخونن و با امکاناتش آشنا نیستن، فکر کردم ایدهء خوبی باشه این تاپیک رو ایجاد کنم و همینطور که پیش میرم کلاسهای مفید و کاربردشون رو ذکر کنم. منظورم بیشتر کلاسهایی هست که کاربردهای متداول و مهم برای اپلیکیشن نویسهای عادی دارن.
دوستان دیگر هم میتونن کمک کنن و اگر چیزی از قلم افتاد یا مطلب اشتباهی گفته شده بود اصلاح کنن.
به این وسیله یک دید کلی و برآورد کلی از امکانات دات نت هم بدست میاد. چون تعداد کلاسهای دات نت با اینکه در ظاهر خیلی زیاد هست اما خیلی از اونا برای کارایی های متداول اپلیکیشن نویسهای عادی نیستن. بعکس بعضی موارد هم هست که تا رفرنس رو نخونیم احتمالا متوجه وجود چنان چیز یا امکاناتی نمیشیم و ممکنه توی کتابها و منابعی که مطالعه میکنیم نیامده باشه. بخصوص که دات نت بهرحال نسبتا جدید هست و هنوز درحال توسعه و دادن نسخه های با تغییرات قابل توجه.
البته شاید کامل کردن این تاپیک بخاطر کمبود وقت و انرژی و پیچیدگی کار ممکن نباشه، اما بهرحال امتحان میکنیم!
هرکس هر کلاس مهمی که باهاش آشنا هست، البته با توضیح کافی، میتونه ارائه کنه.
البته مثلا ذکر کردن خیلی از کلاسهایی که در window.forms هستن و همه باهاشون آشنا هستن و توی بیشتر کتابها آموزشش هست فکر نمیکنم در این تاپیک مفید باشه و صرفا تاپیک رو شلوغ میکنه. یعنی لازم نیست هر جزء رابط گرافیکی مثل دکمه و منو و غیره رو در این تاپیک معرفی کنیم، چون اینا همه تحت یک مجموعه و جزییات اون هستن که تعدادشون هم خیلی زیاده، اما بدیهی و اشاره به هرکدوم صرفا اطلاعات پیش پا افتاده و تکراری ای هست که تقریبا همه میدنن (ولی یه وقت کلاس خاصی در اون رو که همه نمیشناسن و کاربرد مفید و استانداردی میتونه داشته باشه معرفی کنید). اما خود فضای نام window.forms رو میشه معرفی کرد و توضیحاتی داد و به چند نمونه از کلاسها و کاربردهایی که داره اشاره کرد. یعنی تمام فضاهای نامی اساسی و کلاسهای برجسته رو میخوایم در این تاپیک معرفی کنیم. خیلی هم زیاد نمیشه بنظرم. اینطور که من تاحالا از یک سوم بیشتر کتابخانهء کلاس رو مطالعه کردم، کسر کوچکی از کلاسها و فضاهای نامی دات نت قابل ارائه در این تاپیک هستن. بقیشون جزییات و موارد تکراری و مربوط به ساختارهای داخلی و جزییات کدنویسی میشن که هرکس نیاز داشت و خواست عملا الگوریتمی در اون زمینه بنویسه، خودش میتونه به رفرنس اون فضای نام و کلاسها مراجعه کنه و کامل بخونه. در اینجا ما میخوایم یک دید کلی و سرنخ های مهم رو مشخص کنیم و بگیم کتابخانهء دات نت چه امکاناتی داره (نه با یک بیان خیلی کلی که عملا بدرد تقریبا هیچکس نمیخوره) و این امکانات اسمشون چیه و در کدام فضای نام و کلاس هستن. این تاپیک برای آموزش برنامه نویسی یا داکیومنت کردن کل کلاسها نیست.
البته سرفرصت باید برگردم و از ابتدا فضای نام ها و کلاسهایی رو که تاحالا مطالعه کردم مرور کنم تا موارد لازم رو در این تاپیک درج کنم، و بعد از اون به مرور که کلاسهای جدید رو میخونم هرکدوم که بنظرم لازم بود در این تاپیک لیست میکنم.
-------------------------------
لینک رفرنس کتابخانهء کلاس دات نت: .NET Framework Class Library (http://msdn.microsoft.com/en-us/library/ms229335.aspx)
eshpilen
یک شنبه 18 مهر 1389, 20:18 عصر
فضای نام Microsoft.Win32
کلاسهای مهم:
OpenFileDialog که برای انتخاب فایل یا فایلهایی از طرف کاربر برای باز کردن بکار میره.
SaveFileDialog که برای انتخاب فایلی از طرف کاربر برای سیو کردن بکار میره.
همچنین در این فضای نام کلاسهایی برای کار کردن با رجیستری (خواندن، نوشتن، دلیت کردن...) وجود دارن.
و سرانجام کلاس SystemEvents که بوسیلهء اون میشه وقایعی در سیستم مثل تغییر رزولیشن صفحهء نمایش توسط کاربر، تغییر در فونتهای نصب شده در سیستم، تغییر تاریخ و ساعت سیستم، خارج شدن کاربر از سیستم (لاگ آف) و خاموش شدن سیستم رو در برنامه تحت نظر گرفت و به اونها عکس العمل نشون داد.
این کلاس مهم آخری داشت از زیر دستم در میرفت!
دوستان هر نقص و اشتباهی در مطالب دیدن تذکر بدن لطفا.
eshpilen
دوشنبه 19 مهر 1389, 19:29 عصر
فضای نام System
از کلاس Console برای ورودی و خروجی در پنجرهء کنسول، چک کردن وضعیت کلید CapsLock و NUM LOCK، پخش کردن بوق بوسیلهء بوق سیستم (میشه فرکانس و زمان اون رو هم تعیین کرد)، تغییر رنگ زمینه و رنگ متن پنجرهء کنسول، دریافت ترکیب کنترلی CTRL+C جهت پاسخگویی (این ترکیب معمولا به معنای درخواست کنسل کردن عملیات و بستن برنامه هست)، و جزییاتی مثل تعیین عنوان پنجرهء کنسول و نمایش یا عدم نمایش مکان نما استفاده کرد.
از کلاس Convert برای تبدیلاتی مثل باینری به رشتهء کاراکتری Base64 و بعکس، تبدیل انواعی مثل عدد اعشاری و صحیح به Boolean (در دات نت اینطور تبدیلات بصورت Cast مجاز نیستن)، تبدیل اعداد به کاراکتر یونیکد، تبدیل رشتهء عددی به عدد صحیح، اعشاری، تبدیل عدد اعشاری به رشته و غیره استفاده میشه. تمام این تبدیلات توسط متدهای استاتیک کلاس Convert انجام میشن.
از کلاس Environment برای کارهایی مثل گرفتن دایرکتوری جاری، فهمیدن اینکه سیستم عاملی که برنامه توش درحال اجرا هست 64 بیتی است یا خیر، اینکه پردازش جاری خودش 64 بیتی هست یا نه، نوع و نسخهء سیستم عامل، تعداد CPU های سیستم، دایرکتوری سیستم، مدت زمانی که سیستم روشن بوده، کاربر جاری سیستم، گرفتن آرگومانهای خط فرمان، خواندن مقدار متغییرهای محیطی، گرفتن نام درایوهای کامپیوتر، بدست آوردن مسیر دایرکتوری های ویژهء سیستم استفاده میشه.
از کلاس GC برای گرفتن اطلاعات و تنظیم و اعمال دستوراتی در ارتباط با garbage collector دات نت استفاده میشه که ممکنه بعضی وقتها و همچنین در تست برنامه ها از نظر حافظهء مصرفی یا بهینه سازی برنامه هایی که شرایط خاص از نظر حافظه دارن و غیره بدرد بخوره.
از کلاس Math برای استفاده از توابع ریاضیاتی معمول مثل توابع مثلثاتی، لگاریتم، قسمت صحیح، توان، گرد کردن، ریشهء دوم و ثابت های عدد پی و پایهء لگاریتم طبیعی میشه استفاده کرد.
از کلاس ObsoleteAttribute میتونید برای علامتگذاری اجزایی از برنامه، مثل متدها و کلاسهای خاصی، که با اینکه وجود دارن و قابل استفاده هستن اما به کاربران کد شما توصیه میشه که دیگه از اونها استفاده نکنن استفاده کنید. درموقع استفاده از اجزایی که به این روش علامتگذاری شدن، هشدارهای مربوطه به کاربران داده میشه (همراه با پیامی که شما تعیین میکنید).
از کلاس OperatingSystem برای گرفتن اطلاعات راجع به سیستم عامل استفاده میشه. این اطلاعات نسخهء سیستم عامل، نسخهء سرویس پک، و خانوادهء سیستم عامل هستن.
از کلاس Random برای تولید اعداد و بایتهای تصادفی استفاده میشه.
از کلاس String برای ذخیره و دستکاری رشته ها در دات نت استفاده میشه. تمام رشته ها در دات نت از نوع یونیکد هستن. اعمالی که بوسیلهء این کلاس روی رشته ها میشه انجام داد شامل جستجوی یک رشتهء یا کاراکتر/کاراکترهای یونیکد خاص، درج کردن در مکان خاصی از رشته، الحاق رشته ها، Pad کردن، تقسیم کردن رشته به رشته های جداگانه بر حسب یک کاراکتر یا رشتهء خاص، جایگزین کردن یک کاراکتر یا رشته در رشتهء مورد نظر با کاراکتر و رشتهء دیگر، تبدیل حروف رشته به کاراکترهای بزرگ یا کوچک، مقایسهء رشته ها، و غیره هست.
از کلاس Uri برای ساخت و دستکاری آدرسهای منابع اینترنتی و غیره استفاده میشه و توسط اون میتونیم براحتی اجزای مختلف یک آدرس رو مثل مسیر، Fragment، Host، پورت و غیره جدا کنیم. همچنین برای کارهایی مثل Escape کردن این کلاس امکانات لازم رو در خودش داره.
کلاس WeakReference برای استفاده از weak reference بکار میره که کاربردهای برنامه نویسی خاصی دارن مثل پیاده سازی بعضی سیستمهای Cache درون برنامه.
توضیح: کلاسهای ذکر شده بخش کوچکی از کلاسها و کاربردهای موجود در فضای نام System بودن که بر اساس معیار عمومیت و کلی بودن کاربردها انتخاب شدن. ممکنه در این انتخابها اشتباه یا از قلم افتادگی وجود داشته باشه. ضمنا بقیهء کلاسها و امکانات موجود در این فضای نام، برای نوشتن کدها و برنامه های واقعی کامل و مکمل کلاسها و کاربردهای ذکر شده و همچنین در دیگر قابلیت ها و کلاسها در فضاهای نامی دیگر فریمورک دات نت کاربرد دارن.
eshpilen
چهارشنبه 21 مهر 1389, 10:25 صبح
مثل اینکه استقبالی نشد :لبخند:
ممکنه دیگه ادامه ندم.
Pr0grammer
جمعه 07 آبان 1389, 14:09 عصر
لطفا ادامه بدید...
اگه نیتتون فقط دریافت تشکر نیست، حیفه که ادامه ندید...
eshpilen
دوشنبه 10 آبان 1389, 14:51 عصر
نه مثل اینکه استقبال زیاد شد :لبخند:
باشه ادامه میدم.
eshpilen
دوشنبه 10 آبان 1389, 23:14 عصر
فضای نام System.Collections
کلاس ArrayList یک آرایهء دینامیک هست. یعنی هر تعداد عضو که توش ذخیره بکنید خودش بصورت خودکار فضا برای ذخیره سازی اختصاص میده و نیازی نیست شما نگران تجاوز از حدود آرایه باشید. این نوع آرایه دینامیک البته بجز این خاصیت تعداد زیادی متد برای کارهایی مثل جستجو و درج و حذف در سناریوهای مختلف داره. ضمنا اگر لازم باشه میتونید با متدهایی که وجود داره از این آرایه یک wrapper از نوع ReadOnly یا FixedSize بگیرید. یعنی مثلا در جاهایی که نمیخواید آرایه بصورت اشتباهی دستکاری بشه میتونید از این دو روش استفاده کنید که اولی عملا یه آرایهء قفل شده به ما میده و دومی از حذف و اضافهء عناصر در آرایه که موجب تغییر طول آرایه میشن جلوگیری میکنه ولی امکان تغییر آبجکت های ذخیره شده در آرایه وجود داره و مثلا میشه با متد مربوطه آرایه رو Sort هم کرد.
کلاس CaseInsensitiveComparer میتونه برای مقایسهء دو رشته بصورت غیرحساس به کوچکی و بزرگی حروف استفاده کرد. مزیت این کلاس اینه که میشه با استفاده از متدهای استاتیک Default و DefaultInvariant، اشیایی از این کلاس رو ایجاد کرد که مقایسه رو بر اساس قواعد مقایسهء کشور پیشفرض کاربر یا (درمورد دومی) بدون حساسیت به قواعد مرتب سازی کشور خاصی انجام بدن.
کلاس Comparer هم مکمل کلاس قبلی هست و تنها فرقش اینه که مقایسه بصورت حساس به بزرگی و کوچکی حروف انجام میشه.
کلاس Hashtable هم که از اسمش معلومه یک جدول هش هست یا میشه گفت نوعی آرایه که کلیدهای دسترسی به عناصر اون میتونن غیر از عدد انواعی مثل رشته و غیره باشن (در آرایه های معمولی کلیدهای ما که Index نامیده میشه فقط میتونن عدد باشن و از صفر تا حد بالای آرایه هستن). ضمنا Hashtable هم دینامیک هست. یعنی هرچی بهش عضو اضافه کنید خودش بصورت خودکار اگر از ظرفیتی که قبلا رزرو کرده تجاوز کنه، فضای جدید اختصاص میده. البته دقت کنید کلیدهای یک Hashtable هر شیء ای هم نمیتونن باشن و اون شیء باید خصوصیات لازم رو داشته باشه (متدهای لازم برای تولید و مقایسهء کلید رو دارا باشه)، ولی در عموم موارد نیازهای ما با انواع زیادی مثل رشته ها که در دسترس هستن و بیشتر از بقیه بعنوان کلید بکار میرن برآورده میشه و نیازی نیست نگران این جزییات باشیم. خب این کلاس هم متدهایی برای دستکاری و تنظیم و جستجو داره. شما در یک Hashtable متدهایی دارید که میتونید باهاشون هردوی وجود یک کلید یا مقدار خاص رو در Hashtable مورد نظر چک کنید.
کلاس Queue که باز معرف برنامه نویسان حرفه ای هست و یک صف رو تعریف میکنه. در یک صف عنصری که اول وارد میشه اول هم خارج میشه. عناصر به همون ترتیبی که در یک صف وارد میشن از صف برداشته میشن. در یک صف ما نمیتونیم با هر ترتیبی عناصر ذخیره شده رو بازیابی کنیم و تنها میتونیم عنصر بعدی رو که نوبتش هست از صف برداریم (که از صف حذف میشه) و یا چک کنیم ببینیم چی هست (با متد Peek). البته میشه جستجو کرد که آیا عنصر خاصی در صف وجود داره یا نه (با متد Contains)، ولی نمیشه با ایندکس به عناصر دسترسی خواندنی یا نوشتنی داشت. هر عنصری هم که اضافه میکنیم تنها میتونیم به انتهای صف اضافه کنیم و قادر به تعیین مکان قرارگیری اون در جای دیگری نیستیم. شاید بگید خب چرا بجای صف از آرایه استفاده نکنیم! بنظر بنده مزیت صف در بهینه بودنش از نظر معنایی و خوانایی و احتمالا Performance و اینه که در کاربردهایی که با الگوریتم صف پیاده سازی میشن، عملیات دستیابی و حذف رو در یک مرحله انجام میده و در این الگوریتم ها ما معمولا نیازی به انواع دیگر امکانات و دسترسی هم نداریم.
کلاس SortedList همزمان هم شبیه آرایه (دینامیک) هست و هم Hashtable و ویژگی دیگرش که از اسمش هم مشخص هست اینه که بصورت خودکار اعضایی رو که بهش اضافه میشن مرتب میکنه. البته حتما به این توجه دارید که مثل Hashtable این مرتب سازی بر اساس کلیدها انجام میشه و نه مقدارها. هر عنصر، تحت کلیدی که درج میشه، بلافاصله در جایی لیست قرار میگیره که لیست بصورت مرتب شده باشه. اعضای یک SortedList، هم توسط کلیدها قابل دسترسی هستن و هم توسط ایندکس (که این قابلیت اخیر در Hashtable وجود نداشت). البته ایندکس یک مقدار ذخیره شده، با اضافه و کم شدن عناصر میتونه تغییر کنه چون بصورت خودکار برای مرتب سازی جابجا میشه. راستی برای دسترسی از طریق ایندکس از متدهای GetByIndex و SetByIndex استفاده میشه و نه از روش عادی با علامتهای []. وقتی از علامتهای [] استفاده میکنیم باید در داخل اونها از کلید استفاده کنیم و نه ایندکس. اضافه کردن اولیهء عنصر هم فقط از طریق متد Add انجام میشه که نیاز به تعیین کلید داره.
کلاس Stack میشه گفت معکوس و مکمل صف (Queue) هست. در صف عنصری که اول وارد شده اول هم خارج میشه، در Stack یا به فارسی پشته، عنصری که آخر وارد شده اول خارج میشه و عنصری که اول وارد شده آخرین عنصری هست که خارج میشه. خب Stack متدهایی داره مثل Push و Pop معروف و مثل صف متد Peek هم داره.
---------------------------------------------------------------------------------
راستی دقت کنید که در تمام این آرایه ها و لیست و جدول هش که اشیاء رو ذخیره میکنیم، نوع اشیاء ذخیره شده Object در نظر گرفته شده که میدونیم تمام اشیاء در دات نت از این کلاس ارث بردن و بنابراین ما میتونیم تمام انواع اشیاء رو به این شکل در یک آرایه یا لیست و جدول ذخیره کنیم.
eshpilen
دوشنبه 17 آبان 1389, 22:52 عصر
فضای نامی System.Collections.Concurrent
این فضای نامی محتوی چند کلاس هست که شبیه بعضی کلاسهای موجود در فضای نامی System.Collections یا System.Collections.Generic هستن، و تنها خاصیت مفید اضافه ای که دارن اینه که دسترسی و دستکاری محتویات اونها بصورت همزمان توسط چند ترد (نخ) یا همون thread، امن هست و مشکل تداخل ایجاد نمیکنه و نیازی به پیاده سازی مکانیزم های قفل کردن و هماهنگ/همزمان سازی از طرف برنامه نویس ندارن؛ این قبیل عملیات بصورت داخلی در خود این کلاسهای پیاده سازی شده و انجام میشه و شما میتونید با خیال راحت از چند thread به این مجموعه های ذخیره سازی دسترسی داشته باشید و چیزهایی رو بهشون اضافه یا ازشون کم کنید و همزمان بخونید و غیره.
نیازی به ذکر و توضیح تمام کلاسهای این فضای نامگذاری نمیبینم چون کارایی و امکانات چند کلاسی که در این فضای نام هست کم و بیش شبیه بعضی از کلاسهای System.Collections.Generic هست و البته یکسری متدها و پراپرتی های خاص خودشون رو بر اساس خواص دسترسی همزمان از طریق چند thread دارن.
چند کلاس از کلاسهای این فضای نام رو برای روشن شدن مطلب ذکر میکنم.
بطور مثال کلاس ConcurrentBag<T> o (نکته: حرف o که در انتها میبینید، جزو نام کلاس نیست و برای بهم نریختن نمایش نام کلاس اضافش کردم) یک مجموعهء دینامیک غیرمرتب شده هست. این کلاس هم مثل کلاسهای دیگهء این فضای نام thread-safe هست. متد Add رو داره برای اضافه کردن یک شیء به مجموعه. توجه کنید که نوع اشیاء ذخیره شده در این مجموعه رو در ابتدای تعریفش توسط پارامتر T مشخص میکنیم. یعنی این کلاس عملا از نوع Generic هست و به ما یک مجموعهء Strong type میده (نوع دقیق اشیاء ذخیره شده در اون میتونه مشخص بشه و از نوع کلی و پایهء Object نیستن لزوما).
درواقع تمام کلاسهای مشابه دیگر این فضای نام از نوع Generic هستن.
متد دیگر این کلاس بطور مثال متد TryTake هست که یک عنصر از این آرایه رو داخل یک آرگومان (این پارامتر از نوع out هست) میریزه و اون عنصر رو از آرایه حذف میکنه، اما درصورتیکه در حال حاضر موفق به انجام این کار نشه (احتمالا درحالتی که مجموعه بخاطر دسترسی thread دیگری قفل شده) مقدار پیشفرض انواع ذخیره شده در آرایه رو در پارامتر خروجی میریزه. مقداری که این تابع برمیگردونه مشخص میکنه که عملیات چطور انجام شده؛ اگر موفق به برداشت عنصری از مجموعه بشه، مقدار true و اگر موفق به برداشت عنصری نشه و مقدار پیشفرض اشیاء مورد نظر رو در پارامتر خودش بریزه، مقدار false رو برمیگردونه.
متد دیگری هم به نام TryPeek هست که فرقش با متد TryTake اینه که عنصر استخراج شده رو از مجموعه حذف نمیکنه.
این کلاس و کلاسهای دیگه در این فضای نام، Extension Method های زیادی هم دارن که میتونید مطالعه کنید. تاجایی که میدونم این Extension Method ها در LINQ کاربرد اساسی دارن، اما بصورت مستقل و مستقیم هم قابل استفاده هستن و میتونن مفید باشن.
بطور مثال Extension Method ای به نام Skip<T> o یک IEnumerable<TSource> o برمیگردونه که میتونه برای دسترسی به عناصر آرایه با جهش از تعدادی عنصر از ابتدای آرایه که ما این تعداد رو بصورت آرگومان پاس شده به متد Skip مشخص میکنیم بکار بره.
یا Extension Method دیگری به نام Where میتونه بر اساس تصمیمی که تابعی که بعنوان آرگومان به این متد پاس میکنیم درمورد هر عنصر آرایه میگیره، عناصر خاصی رو فیلتر کنه (مثل مورد قبلی، چیزی که این تابع برمیگردونه از نوع Enumerable هست).
متد مفید دیگر ConcurrentBag، میتونه متد ToArray باشه که یک آرایهء معمولی از نوع عناصر ذخیره شده در این مجموعه ایجاد کرده و عناصری رو که درحال حاضر در ConcurrentBag وجود دارن در اون کپی کرده و آرایهء ایجاد شده رو برمیگردونه.
از کلاسهای دیگر این فضای نام مثلا کلاس ConcurrentDictionary<TKey, TValue> o هست که از اسمش و مشخصاتش مشخص هست چکار میکنه و متدهایی مثل TryAdd، TryGetValue، TryRemove و TryUpdate داره (از طریق سینتاکس [key] هم میشه به اعضای این کلاس دسترسی داشت).
کلاس دیگر کلاس ConcurrentQueue<T> o هست که مشخصه یک صف، یا مجموعهء FIFO هست که مثل بقیهء کلاسهای این فضای نام بخاطر thread-safe بودن بصورت جداگانه طراحی شده (یادتون هست که مثلا در فضای نام System.Collections هم یک کلاس Queue داشتیم).
-------------------------------------------------
ممکنه بعضیا بگن چرا ما همیشه برای تمام برنامه ها از کلاسهای فضای نام System.Collections.Concurrent استفاده نکنیم که thread-safe هم هستن؟
اگر نظر بنده رو میخواید، باید بگم اولا تاجایی که دیدم تعداد کلاسهای این فضای نام از کلاسهای فضای نامهای مجموعه ای دیگه کمتر هست و امکاناتشون هم کمتره.
دوما، پیاده سازی thread-safety در این کلاسها مسلما هزینه هایی از نظر مصرف منابع سیستم و Performance داره و بنابراین برای کاربردهایی که نیاز به thread-safe بودن ندارن اصلا بهینه بنظر نمیرسن و استفاده ازشون اشتباه هست.
eshpilen
شنبه 22 آبان 1389, 23:52 عصر
فضای نامی System.Collections.Generic
این فضای نامگذاری دارای شباهت با فضای نام System.Collections هست و بعضی کلاسهای کم و بیش مشابهی داره، تنها با این تفاوت عمده که این کلاسها از نوع Generic هستن. یعنی موقع ایجاد این کلاسها باید نوع اشیایی رو که میخواید در اونها ذخیره کنید مشخص کنید. مزایایی که درمورد استفاده از این کلاسهای Generic بجای کلاسهای موجود در فضای نام System.Collections (که همه نوع شیء رو بصورت Object که کلاس پایهء اشیاء دات نت هست میپذیرفت) بالبداهه بنظر من میرسه اینه که به این روش خوانایی برنامه افزایش پیدا میکنه، امکان اشتباهات کاهش پیدا میکنه (مثلا درج شیء از نوع نادرست در مجموعه تشخیص داده میشه)، نیاز به Cast کردن در جاهای مختلف برنامه نداریم، و ضمنا این کلاسها میتونن از Performance بالاتری برخوردار باشن (بنا به اظهارت سایت MSDN) که علتش میتونه بهینه سازیها یا استفاده از الگوریتم هایی باشه که با دونستن نوع اشیاء ذخیره شده امکان پذیر میشن.
گفته میشه برنامه نویسها خیلی بیشتر از کلاسهای این فضای نام استفاده میکنن تا فضای نام System.Collections. بهرحال چون بنده قبلا توضیح راجع به کلاسهای فضای نام System.Collections دادم و کلاسهای System.Collections.Generic هم کم و بیش مشابه اونها هستن، فقط با تفاوت عمدهء Generic بودن، دیگه لزومی برای معرفی کامل کلاسها و توضیح مجدد مسائل مشترک نمیبینم و به بعضی از موارد مهم و موارد تفاوت اکتفا میکنم.
این فضای نام کلاسهایی داره مثل Comparer<T> o (حرف o در انتها اضافه هست و برای بهم نریختن نمایش اضافه شده) که مشابه Generic کلاسی با همین نام در فضای نام System.Collections هست.
کلاس دیگر Dictionary<TKey, TValue> o هست که مجموعه ای از انواع خاصی از اشیاء رو با کلیدهایی از نوع اشیاء دیگر ذخیره میکنه و بنظرم شباهت با Hashtable داره اما کاملا شبیه اون نیست و روش و امکانات و استانداردهای خاص خودش رو داره. مثلا میتونید بوسیلهء foreach اعضای این مجموعه رو که هر کلید با مقداری که داره بصورت KeyValuePair<TKey, TValue> o برگردونده میشه، پیمایش کنید. متد دیگر این کلاس TryGetValue هست که نباید از اسمش دچار اشتباه شد و فکر کرد مشابه متدهایی با نام نزدیک که در کلاسهای فضای نام System.Collections.Concurrent دیده میشدن هست. این کلاس thread-safe نیست. متد TryGetValue مقدار اختصاص داده شده به کلیدی رو که مشخص میشه در دیکشنری پیدا میکنه و در پارامتری از نوع out میریزه؛ و اگر کلید مشخص شده در دیکشنری موجود نباشه، مقدار پیشفرض نوع مقادیر ذخیره شده در دیکشنری رو در پارامتر مربوطه میریزه و مقدار بازگشتی خود متد false خواهد بود (درصورت موجود بودن کلید مورد نظر، true). این روش از روشی که بخوایم از طریق KeyNotFoundException بفهمیم که کلید مورد نظر در دیکشنری وجود نداشته، سرعت و کارایی بیشتری داره و درمورد کاربردهایی که مدام با کلیدهایی که در دیکشنری موجود نیستن برخورد میکنن ایدئال هست (درواقع این متد کارایی متد ContainsKey و Item رو (در سی شارپ Item معادل دسترسی با سینتاکس [] هست) با هم ترکیب کرده).
در پایان همچنین بد نیست به این اشاره ای بکنیم که این کلاس Extension Methods های زیادی داره که کاربرد اصلی اونها در LINQ هست. یعنی شما میتونید بصورت LINQ با اشیاء این کلاس کار کنید.
کلاس HashSet<T> o تعدادی شیء از نوع مشخص شده رو نگهداری میکنه (بدون کلید). این کلاس علاوه بر متدهای معمول برای اضافه کردن و دسترسی، متدهای مفیدی داره مثل ExceptWith که باهاش میتونیم یک مجموعهء دیگر رو از مجموعهء HashSet تفریق بکنیم، یعنی عناصری رو که در مجموعهء دیگر هستن (که به شکل یک IEnumerable<T> o معرفی شده و مورد دسترسی قرار میگیره) که در HashSet ما هم هستن رو از HashSet حذف بکنیم، و متد IntersectWith که باعث میشه اعضای مشترک بین HashSet و مجموعهء دیگری که بصورت آرگومان به این متد پاس میکنیم در HashSet ذخیره بشن، و متدهای دیگری مثل IsSubsetOf که با مقدار true یا false ای که برمیگردونه مشخص میکنه آیا اعضای HashSet ما زیرمجموعه ای از اعضای مجموعهء دیگه هستن یا نه، متد Overlaps مشخص میکنه که مجموعهء ما و مجموعهء دیگر دارای عضو یا اعضای مشترکی هستن یا نه، و متد UnionWith که باعث میشه اجتماع اعضای HashSet ما و مجموعهء دیگر در HashSet ذخیره بشن. متد SymmetricExceptWith که باعث میشه HashSet ما حاوی اعضایی بشه که یا در HashSet و یا در مجموعهء دیگر وجود دارن ولی نه در هر دو (بین دو مجموعه مشترک نیستن).
کلاس SortedSet<T> o مجموعه ای از اعضای غیرتکراری رو که بصورت خودکار مرتب شده هستن نگهداری میکنه. متدهایی مشابه کلاس قبلی هم داره. پراپرتی های Min و Max که بزرگترین و کوچکترین عضو مجموعه رو برمیگردونن، متد GetViewBetween که یک SortedSet دیگه رو برمیگردونه که تنها شامل اعضایی با مقدار حداقل و حداکثری هست که ما مشخص میکنیم (این متد بطور مثال درمورد مقادیر عددی و رشته ای برای فیلتر کردن میتونه مفید باشه).
کلاس SynchronizedKeyedCollection<K, T> o یک مجموعهء thread-safe هست که شامل اشیایی از نوع مشخص شده هست که بر اساس کلید گروه بندی شدن. به اعضای اون میشه بوسیلهء ایندکس یا کلید دسترسی داشت، شیء خاصی رو در ایندکس خاصی درج کرد، حذف کرد، میشه کلید یک عضو خاص رو تغییر داد و غیره. متاسفانه بعلت اینکه نسخهء دات نت بنده این کلاس رو نداشت موفق به تست و اطمینان عملی نشدم و بنابراین توضیحات بیشتر به عهدهء رفرنس و تست خودتون میذارم. اهمیت ذکر این کلاس بخاطر thread-safe بودنش بود.
کلاس SynchronizedCollection<T> o که مجموعه ای از اشیاء با نوع تعیین شده رو نگهداری میکنه و thread-safe هم هست.متدهای معمول برای اضافه کردن، دسترسی و دستکاری رو داره و بطور مثال متد IndexOf که اندیس نخستین وقوع یک مقدار/شیء خاص در مجموعه رو برمیگردونه.
کلاس LinkedList<T> o یک لیست پیوندی دوبل یا دو طرفه هست. میدونید که مزیت مهم لیست پیوندی اینه که عملیات درج و حذف در هرکجای لیست پیوندی از مرتبهء O(1) o هست. هر عضو این لیست پیوندی از نوع LinkedListNode<T> o هست که پراپرتی های Next و Previous و Value رو داره. LinkedList متدهایی مثل AddAfter(LinkedListNode<T>, T) o و AddBefore(LinkedListNode<T>, T) o و AddFirst(T) o و AddLast(T) o و Contains و Remove(LinkedListNode<T>) o و RemoveFirst و غیره رو داره که از اسمشون مشخصه چکار میکنن و هرکس با لیستهای پیوندی آشنا باشه براش کاملا آشکار هست، بنابراین دیگه توضیح زیادی نمیدم.
کلاس List<T> o هم یک لیست ساده هست که میشه توسط اندیس به اعضاش دسترسی داشت. این کلاس معادل Generic کلاس ArrayList از فضای نام System.Collections هست. علاوه بر متدهای متداول، متدهایی داره مانند BinarySearch که جستجو برای عضو مورد نظر رو با الگوریتم باینری انجام میده (یادتون باشه که برای استفاده از این الگوریتم، باید لیست قبلا مرتب شده باشه، وگرنه ممکنه نتایج غلطی تولید بشه)، متد ConvertAll که تمام اعضای لیست رو به نوع دیگر مورد نظر تبدیل کرده و در قالب یک لیست دیگر برمیگردونه، متد Sort لیست رو مرتب میکنه (بصورت درجا)، متد Reverse ترتیب اعضای لیست رو معکوس میکنه (بصورت درجا)، متد Reverse یک Overload دیگه هم داره که یک آرگومان اندیس و یک آرگومان تعداد رو میگیره و عمل معکوس کردن رو فقط در محدودهء اعضایی که از اندیس شروع شده و به تعداد ادامه پیدا میکنه انجام میده.
-----------------------------------------------------------
شاید بد نباشه به این اشاره ای بکنیم که این فضای نام پس از اضافه شدن قابلیت Generic به سی شارپ و CLR نسخهء 2 به دات نت اضافه شد. بنابراین میتونیم علت وجود کلاسهای غیر Generic موجود در فضای نام System.Collections رو قبل از این زمان متوجه بشیم. بطور کلی توصیه شده که بهتره هر زمان ممکن است از کلاسهای Generic جدیدی که در این فضای نام هستن استفاده کنیم.
ضمنا نکتهء دیگه اینکه کلاسهای این فضای نام Extension Methods زیادی دارن که کاربرد اصلی اونها در LINQ هست، و بنظرم بیشتر این توابع در کلاسهای فضای نام System.Collections وجود ندارن.
eshpilen
سه شنبه 02 آذر 1389, 21:31 عصر
فضای نام System.Data
این فضای نام بخش اصلی کلاسهای مربوط به ADO.NET رو در خودش داره. ADO.NET رابط شیء گرایی هست که میشه بوسیلهء اون روی بانکهای اطلاعاتی یا انواع دیگر از منابع داده ای کار کرد، صرفنظر از روش ذخیره سازی و رابط اصلی خود اون منابع.
ما بوسیلهء ADO.NET میتونیم با تمام منابع دیتا تا حد ممکن بصورت شیء گرا و با یک الگو و ساختار یکسان، صرفنظر از ساختار و پیاده سازی و رابط مستقیم خود منبع داده ای، کار کنیم و ضمنا عملیات در حافظهء اصلی رایانه انجام میشن که باعث سرعت و سادگی کار و کم شدن عملیات ارتباط با دیتابیس و ذخیره و بازیابی اطلاعات از دیسک سخت میشه؛ نهایتا وقتی عملیات مختلف مثل حذف، درج، ویرایش و غیره رو انجام دادیم میتونیم فرمانهای آپدیت شدن دیتابیس (یا منبع داده ای اصلی) رو صادر کنیم تا مقادیر جدید و تغییرات اشیاء متناظر دیتابیس و جدولهای اون در ADO.NET به دیتابیس و جداول مربوطه اعمال بشن.
ناگفته نمونه که ساختار ADO.NET در بخشهای دیگر دات نت مثل Windows Forms (اجزای رابط گرافیکی کاربر) بکار رفته و ما میتونیم اونها رو بوسیلهء ADO.NET با منابع داده ای مرتبط کنیم.
اولین کلاس مرکزی ADO.NET کلاس DataSet هست. هر DataSet میتونه شامل چند DataTable باشه که هر DataTable میتونه دیتای خودش رو از یک منبع داده ای متفاوت مثل SQL Server بگیره.
هر DataTable شامل یک DataColumnCollection هم که مجموعه ای از اشیاء کلاس DataColumn است میباشد. هر DataColumn معرف نوع داده ای، نام و دیگر مشخصات یک ستون/فیلد جدول هست.
معرفی ارتباطهای بین (ستونهای) جدول های متمایز توسط کلاس DataRelation انجام میشه.
کلاسهایی مثل SqlClient و Odbc و OracleClient برای اتصال به بانکهای اطلاعاتی مختلف و استفاده و ارتباط با اونها توسط ADO.NET آماده هستن.
کلاس ForeignKeyConstraint برای ایجاد ارتباط بین دو ستون از دو جدول بصورت کلید اصلی و کلید خارجی بکار میره و تعیین میکنه که وقتی یک کلید اصلی/رکورد در جدول اول (جدول والد) حذف میشه یا تغییر پیدا میکنه، فیلد مرتبط در جدول دوم (جدول فرزند) چه تغییری بکنه.
---------------------------------------------------
این توصیف کلی کاربرد و کلاسهای اصلی و متداول این فضای نام بود تاجایی که یادم بود و با مرور رفرنس متوجه شدم. اگر در نظر دوستان هر نقص و اشتباهی هست لطفا بیان کنن.
eshpilen
چهارشنبه 17 آذر 1389, 19:40 عصر
فضای نام System.Data.SqlClient
خب فکر کنم نمیشه از این فضای نام گذشت و بصورت اجمالی هم که شده باید ذکر بشه.
این فضای نام محتوی کلاسهایی هست که برای ارتباط با SQL Server بکار میره. یا بقول خودش Data Provider دات نت برای SQL Server هست.
کلاس SqlBulkCopy برای Load کردن حجم زیادی از داده به یک جدول از دیتابیس SQL Server بکار میره. البته نه وقتی که مثلا بخوایم داده ها رو از یک جدول دیتابیس به جدول دیگر همون سرور انتقال بدیم، چون در اینصورت این کلاس کارایی بهینه نداره. اما در مواردی که از یک سرور به سرور دیگه میخوایم داده ها رو بصورت خام فقط منتقل کنیم، یعنی مثلا کل یک جدول یا منبع داده ای دیگری رو که به کلاسهای ADO.NET مرتبط/کپی شده به سرور کپی کنیم، این کلاس به میزان قابل توجهی کارایی بالاتری از روشی که خودمون بصورت دستی و با کد نویسی و کوئری ها و فرامین معمولی بخوایم این کار رو انجام بدیم ارائه میده. یعنی اصلا از اسمش هم مشخص هست و برای همین کار یعنی کپی حجم زیادی از دادهء خام به سرور طراحی شده. این کلاس متدهای سرراستی برای این کار داره بنام WriteToServer که اوورلودهای مختلف اون میتونن بعنوان منبع دیتا، DataTable یا IDataReader و یا آرایه ای از رکوردها (DataRow[]) رو دریافت بکنن. ضمنا اگر ستونهای دو جدول مبداء و مقصد دقیقا با هم یکی نباشن (مثلا از نظر نام)، میتونیم از کلاس SqlBulkCopyColumnMapping برای نگاشت ستونهای جدول مبداء به ستونهای جدول مقصد استفاده کنیم.
با کلاس SqlCommand یک عبارت SQL یا stored procedure رو ایجاد میکنیم تا روی دیتابیس اجراش کنیم.
کلاس SqlCommandBuilder برای تولید خودکار عبارت های SQL ای که برای انجام عملیات Insert، Update و Delete روی دیتابیس بر اساس داده های موجود در اشیاء ADO.NET (که ممکنه عملیات حذف، تغییر و درج روشون انجام شده باشه و با داده های اولیهء موجود در دیتابیس تفاوت داشته باشن) بکار میره و این کار رو بر اساس SelectCommand ای که برای SqlDataAdapter تعیین کردیم انجام میده (یعنی از روی این فرمان، فرمان های دیگر مورد نیاز رو تولید میکنه). البته این کلاس این کار رو فقط برای آپدیت های تک جدولی انجام میده: you can create a SqlCommandBuilder object to automatically generate Transact-SQL statements for single-table updates if you set the SelectCommand property of the SqlDataAdapter. Then, any additional Transact-SQL statements that you do not set are generated by the SqlCommandBuilder.
کلاس SqlConnection برای اتصال به دیتابیس SQL Server بکار میره. یک Connection String بهش داده میشه و سپس با متد Open کانکشن با دیتابیس رو برقرار میکنیم. اول باید یک کانکشن با دیتابیس برقرار کنیم و بازش کنیم (با Open) تا بعد بقیهء ارتباط و دستورات بتونن با دیتابیس انجام بشن. فقط یادتون باشه وقتی کارتون تموم شد، شما مسئول close کردن کانکشن ایجاد شده هستید و این کار مثلا با خارج شدن شیء SqlConnection ما از scope، بصورت خودکار انجام نمیشه. خاتمهء اتصال دیتابیس رو میشه با فراخوانی متد Close و یا Dispose انجام داد، ولی یک روش تمیزتر و راحتتر در خیلی موارد استفاده از بلاک using در برنامه نویسی هست که این کار رو بصورت خودکار در انتهای محدودهء بلاک using برای ما انجام میده.
کلاس SqlConnectionStringBuilder برای کمک کردن در ساخت و مدیریت Connection String ها طراحی شده. مجبور نیستیم ازش استفاده کنیم، اما میتونه کار تهیه و دستکاری و مدیریت Connection String ها رو برای ما خیلی راحتتر و اصولی تر کنه (بجای اینکه جزییات Connection String رو بصورت رشته ای ایجاد یا دستکاری کنیم میتونیم از پراپرتی های این کلاس استفاده کنیم).
کلاس SqlDataAdapter محتوی یک مجموعه فرمان SQL و یک اتصال دیتابیس هست که برای پر کردن اولیهء یک DataSet (در ADO.NET) و بعکس آپدیت کردن یک دیتابیس SQL Server بر اساس محتویات اشیاء متناظر ADO.NET و تغییراتی که در محتوای اونها صورت گرفته ازش استفاده کنیم. به بیان دیگر، این کلاس یک پل ارتباطی میان DataSet و SQL Server هست برای بازیابی و ذخیرهء داده ها. بطور مثال متد Update(DataSet) باعث میشه فرامین درج، آپدیت، یا حذف لازم برای هر کورد تغییر یافته در DataSet مورد نظر، برای منعکس شدن تغییرات در دیتابیس اجرا بشن.
کلاس SqlDataReader برای خواندن بصورت متوالی و یک طرفهء رکوردها از دیتابیس بکار میره. یعنی ما همهء داده ها رو بصورت یکجا به حافظه لود نمیکنیم، بلکه رکورد به رکورد بوسیلهء این کلاس که با اجرای متد ExecuteReader شیء SqlCommand برگردونده میشه، از دیتابیس رکوردها رو دریافت میکنیم. یعنی بنظرم بعکس روشی که مثلا با استفاده از متد Fill شیء SqlDataAdapter یک DataSet رو از ابتدا در یک مرحله با تمام داده ها پر میکنیم که تمام داده ها یکجا دریافت و در حافظه لود میشن (که بنظرم اگر حجم داده ها خیلی زیاد باشه منجر به مصرف بالای حافظه میشه).
راستی یه نکتهء مهم جدای توصیف کاربرد تکی کلاسها باید بگم تا یادم نرفته: برای ایجاد یک Transaction باید از متد BeginTransaction شیء SqlConnection استفاده کنیم که یک شیء SqlTransaction رو برمیگردونه که بعد باید این شیء رو به پراپرتی Transaction شیء SqlCommand خودمون اختصاص بدیم و بعد بوسیلهء متدهای Commit و Rollback شیء SqlTransaction میتونیم به هدف خودمون برسیم.
راستی متاسفانه کد مثال برای کلاس SqlDependency پیدا نکردم اما فکر میکنم کلاس مهمی باشه. تاجایی که فهمیدم میشه بوسیلهء این کلاس تغییراتی رو که در دیتابیس صورت میگیره مانیتور کرد. یعنی هروقت فلان تغییر تعیین شده در مثلا فلان جدول بوجود آمد، میتونیم توسط Event تولید شده با خبر بشیم. به گفتهء خود رفرنس این کلاس، کاربردش مثلا در پیاده سازی سیستم کش درون حافظه برای یک اپلیکیشن ASP.NET هست.
خب این فضای نام تموم شد. البته جزییات و کلاسهای دیگری هم داره و این فقط توصیف اجمالی و کلاسهایی که بنظرم متداول و مهم و مرکزی بودن بود.
فضاهای نامی دیگری مثل System.Data.OracleClient و System.Data.Odbc هم وجود دارن که بنظرم کم و بیش قابلیت های مشابهی رو با کلاسهای مشابه، درمورد دیتابیس های دیگر در اختیار برنامه نویس میذارن. منتها من به دیتابیس SQL Server اکتفا کردم چون بنظرم مهمترین و پرکاربردترین DBMS در برنامه های اکثر برنامه نویسان هست و ضمنا با توصیفش، بیشتر قابلیت های فضاهای نام دیتابیس های دیگر هم کم و بیش شرح داده شدن.
sonixax
دوشنبه 22 آذر 1389, 02:56 صبح
میشه توضیح بدید کلا چه طوری میشه دنبال یک کلاس خاص توی MSDN گشت ؟
مثلا من دنبال یک کلاس برای کار کردن با تصاویر میگردم ، چه طوری میتونم فضای نامی و کلاس هایی که لازم دارم رو توی MSDN پیدا کنم ؟
خیلی ممنون .
eshpilen
دوشنبه 22 آذر 1389, 21:11 عصر
سوالای عجیبی میپرسیدا!
خب با کیوردهای مناسب در گوگل یا خود سایت جستجو میکنی و بعد نتایج رو بررسی میکنی.
یا میتونی مستقیما به لینک رفرنس کتابخانهء دات نت 4 که در پست اول گذاشتم بری و لیست فضاهای نامی و توضیحات درج شده رو بررسی کنی و اونایی رو که بنظر مربوط میان باز و بررسی کنی. از اسم فضاهای نامی و اسم کلاسها و همچنین توضیحات مختصری که جلوی هرکدوم داده خیلی چیزها معلوم هست. ضمنا اون کادر کوچک Find مرورگر رو فراموش نکن که بیخودی چشمت رو خسته نکنی و وقتت رو هدر ندی.
ضمنا بنظر من هیچ چیزی جای مطالعهء کامل رفرنس رو نمیگیره. جزییات و کلیات مهم متعددی هست که آدم در جریان خوندن از اول تا آخر میبینه و بهشون پی میبره و از سردرگمی درمیاد. زیاد هم وقتی نمیبره اگر بکوب بخونی نهایتا چند ماه :لبخند:
بنده دارم همین کار رو میکنم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.