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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شیء رو که شما تو کدتون می سازید، کامپایلر که لازم نداره شیء بسازه، شیء وجود داره. فقط می مونه فراخوانی متد Dispose اش.
شما چون داخل بلوک using فراخوانی Dispose نمی بینید از اجرا شدنش تعجب می کنید؟
پس چطور قبول می کنید که وقتی i به 10 رسید از حلقه for درمیاد؟ مگه توی این حلقه if و break ای هست که از حلقه در بیاد؟
کد:
            for (int i = 0; i < 10; i++)
            {
            }

ممنون
خوب ساختار حلقه جوری هست که به شرط رسید ، کمپایلر از حلقه بیرون میاد
مگه ساختار اینترفیس IDisposable اینه که تمام اعضای فرزندش رو اتوماتیک اجرا کنه؟!!!
 

the_king

مدیرکل انجمن
ممنون
خوب ساختار حلقه جوری هست که به شرط رسید ، کمپایلر از حلقه بیرون میاد
مگه ساختار اینترفیس IDisposable اینه که تمام اعضای فرزندش رو اتوماتیک اجرا کنه؟!!!
خوب ساختار using هم اینطوریه، کامپایلر برای using هم مثل for قواعدی داره. IDisposable هیچ قاعده خاصی نداره، Interface ساده ای است که یک متد Dispose داره.
یعنی فقط کلاس وارث مجبوره که یک پیاده سازی برای متد Dispose داشته باشه، مثل همون CC. این using ئه که قواعد مخصوص داره.
using فقط اشیاء Dispose شدنی رو قبول می کنه که همه شون از Interface ئه IDisposable ارث بری می کنند و این متد Dispose رو الزاما دارند. using همیشه موقع خروج از بلوک، متد Dispose شیء ای
که داخلش ( ) اش هست رو فراخوانی می کنه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
چجوزی میشه یه فایل کلاس خارجی رو پیوست کرد به پروژه؟ یعنی توی solution explorer اضافه کرد؟
با add reference انگار نمیشه
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون آقا علی
یه فایل با پسوند cs (که کدهای سی شارپ یا همون کلاس توش نوشته شده) رو میخوام اضافه تا استفاده کنم (غیر از کپی کردن کدهای این کلاس به داخل کلاس جدید ، راهی نیست که بصورت مستقیم این فایل رو به پروژه اضافه کنم؟)
 

the_king

مدیرکل انجمن
سلام
ممنون آقا علی
یه فایل با پسوند cs (که کدهای سی شارپ یا همون کلاس توش نوشته شده) رو میخوام اضافه تا استفاده کنم (غیر از کپی کردن کدهای این کلاس به داخل کلاس جدید ، راهی نیست که بصورت مستقیم این فایل رو به پروژه اضافه کنم؟)

چند تا کار می توانید بکنید، منطقی ترین کار اینه که در منوی Project با ...Add Existing Item فایل اش رو به پروژه تان اضافه کنید، صرفا دقت کنید که چون احتمالا در پروژه دیگری نوشته شده بوده در متن کد namespace عنوانی داره
که با پروژه شما فرق داره، یا باید به namespace پروژه خودتان تغییرش دهید که شبیه بقیه پروژه بشه و یا هر جا ازش استفاده می کنید اون namespace متفاوت رو بکار ببرید یا using کنید.

اما اگر به هر دلیلی نمی خواهید جزئی از خود پروژه باشه می توانید در یک پروژه مجزای Class Library قرارش بدهید و بعد یا اون پروژه رو یکجا در منوی ...File > Add > Existing Project به Solution تون اضافه کنید (Solution می تونه شامل چندین پروژه باشه)
و یا بعد از Build کردنش فقط به dll اش در پروژه تان Reference بدهید. اگر دقت کرده باشید موقع Reference دادن یک زبانه Projects هم هست که فقط مواردی اونجا نشون داده میشه که به Solution اضافه کرده اید.
معمولا اگر کد ممکنه به تدریج ویرایش و اصلاح بشه و تغییر کنه خود پروژه رو به Solution اضافه می کنند تا لازم نشه برای هر تغییر مجددا dll جایگزین بشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون آقا علی . درست شد با راهنمایی تون
----------------
وقتی که از متد Convert.ToInt32 استفاده میکنیم ، وقتی رشته ی وارد شده ، حاوی کاراکترهای عددی نباشه و حروف باشه ، با ارور برنامه متوقف میشه
حالا بجز از طریق try - catch از روش دیگه ای نمیشه با استفاده از شرط ، بگیم وقتی ارور میده ، کد اجرا نشه؟
اصلا این متد و متدهای شبیه این ، موقع ارور (مثلا در همین مثال خط بالا که زدم) چه چیزی رو برمیگردونن؟
null able اش هم میکنم شی این متد رو ، بازم null رو برنمیگردونه و با ارور متوقف میشه
من الان کلا میخوام متوجه شم که کاربر توی ورودی این متد آیا عدد خالی وارد کرده یا عدد با غیر از عدد باید چجوری متوجه شم؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون آقا علی . درست شد با راهنمایی تون
----------------
وقتی که از متد Convert.ToInt32 استفاده میکنیم ، وقتی رشته ی وارد شده ، حاوی کاراکترهای عددی نباشه و حروف باشه ، با ارور برنامه متوقف میشه
حالا بجز از طریق try - catch از روش دیگه ای نمیشه با استفاده از شرط ، بگیم وقتی ارور میده ، کد اجرا نشه؟
اصلا این متد و متدهای شبیه این ، موقع ارور (مثلا در همین مثال خط بالا که زدم) چه چیزی رو برمیگردونن؟
null able اش هم میکنم شی این متد رو ، بازم null رو برنمیگردونه و با ارور متوقف میشه
من الان کلا میخوام متوجه شم که کاربر توی ورودی این متد آیا عدد خالی وارد کرده یا عدد با غیر از عدد باید چجوری متوجه شم؟

خطا جلوی اجرا بقیه کد رو می گیره، برای همین چیزی برگردونده نمیشه، حتی تابعی که باید مقدار return کنه هم متوقف میشه :
کد:
        private int AA()
        {
[B][COLOR="#FF0000"]            throw new InvalidOperationException();[/COLOR][/B]
            return 12;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int x = 1;
            try
            {
                x = AA();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("x = {0}, Message = {1}", x, ex.Message));
            }
        }

از TryParse استفاده کنید، البته Microsoft.VisualBasic.Information.IsNumeric هم هست که عدد بودن محتوای رشته رو تشخیص بده ولی لزومی نداره بخاطر یک تابع اینچنینی به کتابخانه یک زبان دیگه رفرنس داده بشه.
کد:
            var s = "1234";
            int i;
            if (string.IsNullOrEmpty(s))
            {
                // The specified string is null or empty.
            }
            else if (int.TryParse(s, out i) == false)
            {
                // The conversion failed.
            }
            else
            {
                // OK. variable 'i' is ready
            }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خطا جلوی اجرا بقیه کد رو می گیره، برای همین چیزی برگردونده نمیشه، حتی تابعی که باید مقدار return کنه هم متوقف میشه :
کد:
        private int AA()
        {
[B][COLOR=#FF0000]            throw new InvalidOperationException();[/COLOR][/B]
            return 12;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int x = 1;
            try
            {
                x = AA();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("x = {0}, Message = {1}", x, ex.Message));
            }
        }

از TryParse استفاده کنید، البته Microsoft.VisualBasic.Information.IsNumeric هم هست که عدد بودن محتوای رشته رو تشخیص بده ولی لزومی نداره بخاطر یک تابع اینچنینی به کتابخانه یک زبان دیگه رفرنس داده بشه.
کد:
            var s = "1234";
            int i;
            if (string.IsNullOrEmpty(s))
            {
                // The specified string is null or empty.
            }
            else if (int.TryParse(s, out i) == false)
            {
                // The conversion failed.
            }
            else
            {
                // OK. variable 'i' is ready
            }


ممنون
من این throw رو توی try - catch متوجه نشدم کارش چیه
کلا این خط قرمز (فیلم خط قرمز نه :green:)
رو متوجه نشدم :

کد:
throw new InvalidOperationException();
 

the_king

مدیرکل انجمن
ممنون
من این throw رو توی try - catch متوجه نشدم کارش چیه
کلا این خط قرمز (فیلم خط قرمز نه :green:)
رو متوجه نشدم :

کد:
throw new InvalidOperationException();

خطا پرتاب کردنی ئه، throw میشه، کلا خطا در برنامه نویسی فقط سهوا رخ نمیده، با قصد و منظور هم ایجاد میشه. وقتی تابعی نوشته اید که ورودی اش به هر دلیلی درست نیست باید به نحوی این مساله رو ابراز کنید.
هر خطایی کلاس و مشخصات خودش رو داره ولی پدر همه کلاس های خطا Exception ئه، InvalidOperationException خطایی است که موقع اجرای عملیات غیر معتبر استفاده میشه،
هر جا خواستید در کد بروز همچین خطایی رو اعلام کنید ازش شی می سازید و throw می کنید. برنامه به اون throw که برسه شیء ای که ساخته اید به عنوان سند خطا بوجود میاد. این شیء اصولا شامل اطلاعات نوع خطا، پیغام خطا،
محل بروز خطا و هر مقدار مرتبط با اون نوع خطا است. خودتان هم می توانید یک کلاس جدید برای خطای خاصی ایجاد کنید. گاهی لازمه که برای هر نوع خطایی عکس العمل متفاوتی نشون داده بشه، برای همین catch الزما یک دونه نیست
و برای هر نوع خطای خاصی میشه catch قرار داد. هر catch ای خطاهایی رو پوشش میده که با نوع کلاس اش مطابقت دارند.

کد:
            var array = new object[] { null, "test", "12" };
            foreach (var item in array)
            {
                try
                {
                    var s = Convert.ToInt32(item.ToString());
                }
                catch (NullReferenceException a)
                {
                    MessageBox.Show(a.Message);
                }
                catch (FormatException b)
                {
                    MessageBox.Show(b.Message);
                }
            }
 

SajjadKhati

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

the_king

مدیرکل انجمن
ممنون آقا علی
دقیق نه ولی یه چیزهایی متوجه شدم
پس خطایابی توی سی شارپ بصورت کلاس های exception هه (کلاس پدر) و بقیه ی کلاس هایی از این دست و مثل لوا و بقیه ی زبون ها نیست که مثلا یک مقدار null ای هم همونجا برامون برگردونه (اگه هم null برگردونه ، باز باید با تابع دیگه انگار متوجه شد و بصورت مستقیم توی شرط نمیشه انگار)
حالا اگه مثلا من که مبتدی هستم وقتی از کلاس exception فقط برای خطا ام استفاده کنم و خطایی رخ بده که پیام اش (Message) توی این کلاس نباشه ، باز کدمون با خطا متوقف میشه یا نه ؟
متوقف نمیشه، عرض کردم که Exception پدر همه خطا ها است، هیچ خطایی نیست که کلاس اش وارث Exception نباشه و با Exception مطابقت نداشته باشه، در نتیجه همه خطا ها رو پوشش میده،
پیام جزئی از کلاس نیست، مربوط به شیء ئه، ("throw new Exception("Hello و ("throw new Exception("Invalid Operation هر کدوم پیغام متفاوتی دارند.
مشخصه Message در خود کلاس Exception هست، پس دلیلی نداره که پیغام یک خطا در Exception از دست بره.

برای همین کامپایلر بهتون اجازه نمیده که بعد Catch ای از نوع Exception یک Catch از نوع دیگری قرار بدهید چون چیزی سهم اش نخواهد بود. اما بر عکس اش زیاد نوشته میشه، خطا هایی که احتمال وقوع اش را پیش بینی می کنند با نوع کلاس مشخصی Catch می کنند
و نهایتا یک Catch از نوع Exception قرار می دهند هر خطای غیر منتظره دیگری هم پوشش داده شود.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
چجوری میشه از افزونه ی BabeLua در ویژال استودیو استفاده کرد؟

https://babelua.codeplex.com/

کلا مراحل کدنویسی و برنامه نویسی اولیه در این افزونه چجوری هه؟ از تنظیمات (اگه لازمه انجام بشه) و ...
یعنی چجوری میشه یه فرم آورد و کنترل های مورد نظر رو اضافه کرد و کد نوشت؟
بعد اینکه این انگار از لوا 5.1 استفاده میکنه . میشه از توابع دات نت در ویژال استودیو برای لوا (این افزونه) استفاده کرد؟ . اگه بشه پس میشه توابع و dll های ساخته شده در سی شارپ رو در اتوپلی فراخونی کرد که!!
واسه من کلا یه صفحه ی خالی میاره که آدم حتی نمیتونه کدی توش بنویسه!
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
چجوری میشه از افزونه ی BabeLua در ویژال استودیو استفاده کرد؟

https://babelua.codeplex.com/

کلا مراحل کدنویسی و برنامه نویسی اولیه در این افزونه چجوری هه؟ از تنظیمات (اگه لازمه انجام بشه) و ...
یعنی چجوری میشه یه فرم آورد و کنترل های مورد نظر رو اضافه کرد و کد نوشت؟
بعد اینکه این انگار از لوا 5.1 استفاده میکنه . میشه از توابع دات نت در ویژال استودیو برای لوا (این افزونه) استفاده کرد؟ . اگه بشه پس میشه توابع و dll های ساخته شده در سی شارپ رو در اتوپلی فراخونی کرد که!!
واسه من کلا یه صفحه ی خالی میاره که آدم حتی نمیتونه کدی توش بنویسه!

کدوم فرم؟ عنوان اش a free lua editor/debuger ئه، یعنی یک ویرایشگر و دیباگر رایگان لوا. داخلش می توانید راحت تر از Notepad کد لوا بنویسید، همین. زبان برنامه نویسی ویژوال لوا نساخته که فرم بیاورید و کنترل داخلش اضافه کنید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
کدوم فرم؟ عنوان اش a free lua editor/debuger ئه، یعنی یک ویرایشگر و دیباگر رایگان لوا. داخلش می توانید راحت تر از Notepad کد لوا بنویسید، همین. زبان برنامه نویسی ویژوال لوا نساخته که فرم بیاورید و کنترل داخلش اضافه کنید.

اوه . جدی؟ :) :cry:
پس چرا توی دومین عکسش انگار داره کد تعریف کنترل دکمه رو میکنه؟ !! :

Capture.JPG.428c8881783c22db368cdeb55a9d15d5.JPG


یعنی داره از کلاس کنترل ها استفاده میکنه دیگه. این طور نیست مگه؟
 

the_king

مدیرکل انجمن
اوه . جدی؟ :) :cry:
پس چرا توی دومین عکسش انگار داره کد تعریف کنترل دکمه رو میکنه؟ !! :

Capture.JPG.428c8881783c22db368cdeb55a9d15d5.JPG


یعنی داره از کلاس کنترل ها استفاده میکنه دیگه. این طور نیست مگه؟

بعید نیست، اما ربطی به این ویرایشگر نداره، باید ببینید از چه کتابخانه ای برای اجرا کردن کد اش استفاده می کنه و ساختار کتابخانه اش چیه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
مشکل این تابع چیه؟
به متغییر value گیر میده :

کد:
public static string MyFunc(string myPath)
        {


            File.Delete(myPath);
            string[] myArray = new string[] { "ali", "hasan", "mahmood" };
            ArrayList myArrList = new ArrayList();
            int i = 0;
            foreach (var value in myArray)
            {
                myArrList[i] = value;
                i++;
            }
            return myArrList[0].ToString();
        }


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

برای اضافه کردن یه شی داخل ArrayList ، حتما باید با متد Add از این کلاس ، شی مونو اضافه کنیم؟ بصورت بالا نمیشه؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
مشکل این تابع چیه؟
به متغییر value گیر میده :

کد:
public static string MyFunc(string myPath)
        {


            File.Delete(myPath);
            string[] myArray = new string[] { "ali", "hasan", "mahmood" };
            ArrayList myArrList = new ArrayList();
            int i = 0;
            foreach (var value in myArray)
            {
                myArrList[i] = value;
                i++;
            }
            return myArrList[0].ToString();
        }


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

برای اضافه کردن یه شی داخل ArrayList ، حتما باید با متد Add از این کلاس ، شی مونو اضافه کنیم؟ بصورت بالا نمیشه؟
اون لیست ای که با ()new ArrayList می سازید خالیه، برای همین آیتم [myArrList[i وجود نداره که بخواهید مقداری داخلش قرار بدهید.
کد:
            ArrayList myArrList = new ArrayList() { "ali", "hasan", "mahmood" };

کد:
            ArrayList myArrList = new ArrayList(myArray);

کد:
            ArrayList myArrList = new ArrayList();
            myArrList.AddRange(myArray);
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
چجوری میشه توی سی شارپ ، صدای یه پروسه ی خاص رو فقط کم و زیاد کرد نه صدای کلی خروجی رو؟
یعنی وقتی توی ویندوز 7 به بالا ، روی آیکون صدا در تسک بار کلیک میکنید ، گزینه ی mixer میاد که با زدنش ، لیست نرم افزارهایی که در حال تولید صدا هستن رو میاره . چجوری میشه یه نرم افزار خاص رو فقط صداشو کنترل کرد توی سی شارپ؟
 

the_king

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

به عنوان پروسه برنامه تون درخواست تغییر ولوم رو می کنید، سیستم هم با توجه به اینکه کدوم پروسه چنین درخواستی رو داره تصمیم می گیره کدوم ولوم رو تغییر بده.
اینطوری نیست که بخواهید بجای یک پروسه دیگه درخواست بدید.
 

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

بالا