PDA

View Full Version : کاربرد این دو keyword چیست ؟!!!



gigil_Question
شنبه 26 تیر 1389, 09:58 صبح
سلام
داشتم دوتا نمونه کد رو برسی میکردم دو سوال برام پیش اومد:
یکی اینکه using وسط کد به چه معناست ؟


using (System.IO.StreamReader reader = new (http://www.barnamenevis.org/wiki/C_Sharp_Programming/Keywords/new) StreamReader("readme.txt"))
{
// read from the file
}


و یکی دیگه اینکه Yield کاربردش چیه ؟
ممنون

gigil_Question
شنبه 26 تیر 1389, 17:31 عصر
چرا کسی جواب نمیده ؟:افسرده:
در باره yield تو سایت هست ولی من چیزی نفهمیدم

homan1374
شنبه 26 تیر 1389, 17:45 عصر
یکی اینکه using وسط کد به چه معناست ؟
شما در دستور using میتونید یک شی بسازید و درون این دستور از اون استفاده کنید و تا به پایان این دستور رسیدید این شی نابود میشه انگار نه انگار که بوده
دستور yield هم یه چیزیه باور کن اصلا بدردت نمیخوره یعنی نفهمی چی هتسش خیلی خیلی بهتره!

amirh_karimifar
شنبه 26 تیر 1389, 17:50 عصر
ما برای فراخوانی متد ها یا متغیر های یک کلاس باید نام آن کلاس را صریحا و کامل تا پیدا شدن آن متد پیمایش نماییم مثالا .

system.IO.File.delete(FilePath)

هر بار که بخواهیم از متد Delete استفاده کنیم باید این مسیر را کامل بنویسیم .

با یک بار اجرای دستور در ابتدای برنامهusing system.IO.File
می توانیم فقط دستور را در صورت نیاز بنویسید . Delete()

محسن شامحمدی
شنبه 26 تیر 1389, 18:58 عصر
دستور new هم یک شی جدید تعریف می کنه مثلا
textbox t=new textbox;
یعنی یک شی جدید از نوع textbox توی حافظه ایجاد کن. و حالا قابل استفاده به هر حالتی است

r00tkit
شنبه 26 تیر 1389, 21:37 عصر
شما در دستور using میتونید یک شی بسازید و درون این دستور از اون استفاده کنید و تا به پایان این دستور رسیدید این شی نابود میشه انگار نه انگار که بوده
دستور yield هم یه چیزیه باور کن اصلا بدردت نمیخوره یعنی نفهمی چی هتسش خیلی خیلی بهتره!

using باعث فراخوانی dispose می شه


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

قبل net.2 ما برای این که یه مجموعه داشته باشیم که بشه با foreach اعضای ان رو پیمایش کرد نیاز به پیاده سازیinterface IEnumerable داشتیم اما بعد net.2 ما یه راه دیگه هم داریم که ان استفاده از کلمه ی کلیدی yield هستش که این کار رو خیلی اسون می کنه

نكته ی
1)) البته اگه با reflection نگاه کنی می بیمی که خود کامپایلر GetEnumerator() وCurrentو
Reset() رو پیاده سازی کرده

2)) هر بار که برنامه به yield return می رسه حالت برنامه ذخیره می شه و هر وقت كنترل برنامه یک بار دیگه به yield return رسید برنامه از جایی که حالتش ذخیره بود ادامه پیدا می گنه(احتمالا این کار با thread ها انجام می شه (توی reflection بود) )

3)) از yield برای پباده سازی توابع coroutine استفاده می شه

#aliyari_C
یک شنبه 27 تیر 1389, 00:18 صبح
{
string a;
{
string b;
{
string c;
}
}
}
هر متغیر و هر نمونه سازی (new) یک محدوده دسترسی دارد , مانند متغیرهای بالا که هر کدام از آنها در محدوده خود({}) تعریف می شوند , از همین لحاظ بعد از آنکه بلوک آن به اتمام برسد در نتیجه زباله روب آن را هم از حافظه خارج می کند.
__________________________________________________ ___________________
چون به دریا می توانی راه یافت
سوی یک قطره چرا باید شتافـت


نتایج آماری,مقایسه ای بین String و StringBuildr (http://www.barnamenevis.org/forum/showthread.php?t=233987)

FastCode
یک شنبه 27 تیر 1389, 01:09 صبح
using (احتمالا این کار با thread ها انجام می شه (توی reflection بود) )
جواب کاملاً منفیه.

وقتی شما یک Enumerator میسازی کامپایلر یه کلاس تولید میکنه که چند تا متغیر private داره:
متغیر های اون متد, متغیری current , source
وقتی شما Reset رو صدا میزنی current خالی میشه.و وضعیت به حالت اول برمیگرده.
وقتی MoveNext رو صدا میزنی, دستوراتی که شما نوشتی تا yield بعدی جلو میره.
و current مساوی مقداری که yield return شده قرار میگیره که شما میتونی اون رو با پراپرتی Current بگیری.
برای همین من همیشه از Enumerable های fake استفاده میکنم تا dicompiler رو
گیج کنم چون decompile کردن این کد از کدهای معمولی خیلی سخت تره.(برای برگشت به حالت اول)

FastCode
یک شنبه 27 تیر 1389, 01:11 صبح
در نتیجه زباله روب آن را هم از حافظه خارج می کند.
روی برنامتون رم هم اشانتیون میدین دیگه؟
به این حرفی که شما زدی میگن:MEMORY LEAK

#aliyari_C
یک شنبه 27 تیر 1389, 01:52 صبح
روی برنامتون رم هم اشانتیون میدین دیگه؟
به این حرفی که شما زدی میگن:MEMORY LEAK
نه بهش می گن garbage collector
آره , ولی به شما کیک و ساندیس می دیم.
__________________________________________________ __________________________________________________
چون به دریا می توانی راه یافت
سوی یک قطره چرا باید شتافـت

نتایج آماری,مقایسه ای بین String و StringBuildr (http://www.barnamenevis.org/forum/showthread.php?t=233987)

gigil_Question
یک شنبه 27 تیر 1389, 10:09 صبح
سلام
از دوستان خیلی خیلی ممنون
ولی من هنوز مفهوم yield رو خوب متوجه نشدم
اگر ممکنه یه مثال بزنید و تحلیلش کنید یا اینکه لطف کنید این قطعه رو برام تشریح کنیم



public IEnumerable<RuleViolation> GetRuleViolations() {

if (String.IsNullOrEmpty(Title))

yield return new RuleViolation("Title required", "Title");

if (String.IsNullOrEmpty(Description))

yield return new RuleViolation("Description required","Description");

if (String.IsNullOrEmpty(HostedBy))

yield return new RuleViolation("HostedBy required", "HostedBy");

if (String.IsNullOrEmpty(Address))

yield return new RuleViolation("Address required", "Address");

if (String.IsNullOrEmpty(Country))

yield return new RuleViolation("Country required", "Country");

if (String.IsNullOrEmpty(ContactPhone))

yield return new RuleViolation("Phone# required", "ContactPhone");

if (!PhoneValidator.IsValidNumber(ContactPhone, Country))

yield return new RuleViolation("Phone# does not match country",

"ContactPhone");

yield break;
}

ممنون:لبخندساده:

r00tkit
یک شنبه 27 تیر 1389, 15:42 عصر
جواب کاملاً منفیه.

وقتی شما یک Enumerator میسازی کامپایلر یه کلاس تولید میکنه که چند تا متغیر private داره:
متغیر های اون متد, متغیری current , source
وقتی شما Reset رو صدا میزنی current خالی میشه.و وضعیت به حالت اول برمیگرده.
وقتی MoveNext رو صدا میزنی, دستوراتی که شما نوشتی تا yield بعدی جلو میره.
و current مساوی مقداری که yield return شده قرار میگیره که شما میتونی اون رو با پراپرتی Current بگیری.
برای همین من همیشه از Enumerable های fake استفاده میکنم تا dicompiler رو
گیج کنم چون decompile کردن این کد از کدهای معمولی خیلی سخت تره.(برای برگشت به حالت اول)


مجبوری...... ؟؟؟؟

ان چیزی که نوشتی چه ربطی به نوشتهی من داشت که کاملا منفی دونسدیش من می گم ان قسمت که از متنت رو ضخیم کردم با thread پیاده سازی شده برای دیدنش برو reflector رو ببین
و لازم نبود این جا داستان تعریف کنی همه می دونن روند اجرای IEnumerator , foreach , yield و ... چی هستش اگه نمی دونی بهت توصیه می کنم بری کتاب c# in depth رو بخونی

موفق باشی


geek عصبانی از خود راضی

FastCode
یک شنبه 27 تیر 1389, 22:25 عصر
نه بهش می گن garbage collector
آره , ولی به شما کیک و ساندیس می دیم.
بهتون پیشنها میکنم که یه تجدید نظر کلی در روش برنامه نویسی و جواب دادنتون بکنید.
منظور من از دادن رم این نبود که اشانتیون بدید.منظور من این بود که به این شکل برنامه نوشتن ممکنه براتون خیلی مشکل درست کنه.

اگر واقعاً انقدر به خودتون مطمئنید که حاضر نیستید برای تحقیق راجع به چیزی که بهتون گفتم یه جست و جو ساده بکنید واقعاً براتون متاسفم.
برای این که ثابت بکنم که اشتباه میکنی این کار رو بکن:
یه برنامه که به این شکل نوشتی رو اجرا کن.
تمام فرمهای برنامه رو ۲ بار باز و بسته کن.
مقدار حافظه مصرفی رو با لحظه اول مقایسه کن.
مقدار اختلاف اسمش هست مقدار MEMORY LEAK.
garbage collector خیلی چیز ها رو جمع نمیکنه:
Circular dependency
Object reference in EventHanddlers
Structs
MALLOCs
........
به این میگن MEMORY LEAK.
{}
هیچ ربطی یه GC نداره و کارش جدا از GC.

FastCode
یک شنبه 27 تیر 1389, 22:30 عصر
مجبوری...... ؟؟؟؟

ان چیزی که نوشتی چه ربطی به نوشتهی من داشت که کاملا منفی دونسدیش من می گم ان قسمت که از متنت رو ضخیم کردم با thread پیاده سازی شده برای دیدنش برو reflector رو ببین
و لازم نبود این جا داستان تعریف کنی همه می دونن روند اجرای IEnumerator , foreach , yield و ... چی هستش اگه نمی دونی بهت توصیه می کنم بری کتاب C#‎ in depth رو بخونی

موفق باشی


geek عصبانی از خود راضی
۱۵ دقیقه طول کشید بنویسم.
نمیدونم چرا نیومد.
ولی لپ کلام این بود که:
بودجه C# in depth رو ندارم.No Warez
برای این که کلت رو بخوابونم یه راه بهت میگم.
اگر هر Enumerator یه thread بخواد:
شما ۱۰ تا Thread ایجاد کن و زمانش رو انداره بگیر.
۱۰۰ تا Enumerator ایجاد کن و زمانش رو انداره بگیر.
یا
سعی کن با ایجاد Enumerator به PAGE_STATUS_QUOTA برسی.

alirezaahmadreza
سه شنبه 16 مهر 1392, 07:31 صبح
سلام
من تا جایی که فهمیدم یکی از کاربرد های این دستور(Yield) زمانی است که ما میخواهیم بروی یکسری داده عملیاتی تکراری را انجام دهیم و تمامی ان داده ها را هم خروجی بفرستیم اگه بخوام بیشتر توضیح بدم من میخوام عدد 2 رو به توان 1 تا n برسونم و تمامی مقادیر رو هم در خروجی چاپ کنم برای این کار میتونم از این دستور استفاده کنم این در حقیقت مثالی است که خود ماکروسافت برای این دستور زده.

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

public class List
{
//using System.Collections;
public static IEnumerable Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}

static void Main()
{
// Display powers of 2 up to the exponent 8:
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
}
}
/*
Output:
2 4 8 16 32 64 128 256
*/


کد معادل دستور بالا ولی بدون استفاده از دستور yield:

public class List
{
//using System.Collections;
public static System.Collections.IEnumerable PowerNotYield(int number, int exponent)
{
int counter = 0;
int result = 1;
List<int> listNumber = new List<int>();
while (counter++ < exponent)
{
result = result * number;
listNumber.Add(result);
}
return listNumber;
}

static void Main()
{
// Display powers of 2 up to the exponent 8:
foreach (int i in PowerNotYield(2, 8))
{
Console.Write("{0} ", i);
}
}
}
/*
Output:
2 4 8 16 32 64 128 256
*/

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

امیدوارم که تونسته باشم منظورمو رسونده باشم

alirezaahmadreza
سه شنبه 16 مهر 1392, 07:56 صبح
اگر بخوام راجب دستور using هم واسه دوستمون توضیح بدم

1) این دستور اگر در بالای صفحه مورد استفاده قرار بگیرد که برای تعریف Namespace های برنامه می باشد که باعث می شود میزان نوشتن دستورات کوتاه شود و دیگر برای نوشتن یک دستور نیاز نباشد که کل Namespace های اون دستور را نوشت شما حتی میتوانید نام یک فضای کاری را در صورت تمایل تغییر دهید و ان را به صورت یک نام مستعار(alias) بنویسید و نام طولانی آن فضای کاری را کوتاه و مختصر و مفید کنید

2) اگر این دستور در بلوک برنامه مورد استفاده قرار گیردکاربردش زمانی است که ما یک نمونه غیر مدیریت شده داریم که به صورت عادی فضای حافظه از آن پس گرفته نمی شود که ممکن است در حالت عادی دچار مشکل گردد و GC یا همون سطل زبانه نتواند فضای حافظه را از آن نمونه باز پس گیرد که از آن جمله زمانی که میخواهیم به دیتابیس ارتباط برقرار کنیم بهتر است دستور کانکشن رو در یک بلاک Using بنویسیم که مطمئن شویم بعد از پایان کار اون فضای حافظه از ان کانکش باز پس گرفته می شود یا حتی زمانی که ما میخواهیم یک فونت را تعریف کنیم باز همینطور بهتر است که تعریف یک نمونه فونت را در بلاک using بنویسیم تا مطمئن شویم که فضای کاری از آن پس گرفته می شود.
اگه بخوام علمی تر توضیح بدم زمانی ما مطمئن نیستیم که Dispose توسط کاربر فراخوانی گردد ما نمونه مورد نظر را در یک بلاک using تعریف میکنیم تا با اتمام یافتن بلاک به صورت اتوماتیک Dispose بروی ان نمونه فراخوانی گردد