PDA

View Full Version : مبتدی: چگونگی استفاده و کاربرد تابع استاتیک



مهسا فرجی
جمعه 28 خرداد 1389, 18:46 عصر
سلام من طریقه استفاده از تابع استاتیک رو نمی دونم وکاربرد دقیقش رو هم نمیدونم؟

L u k e
جمعه 28 خرداد 1389, 19:01 عصر
وقتی شما یه متد رو استاتیک تعریف می کنید دیگه عضوی از اون کلاس نمی شه و می شه عضوی از فضای نام اون کلاس
مثلا شما نیاز دارید به یه کلاس که یه سری توابع داشته باشه و یه سری فرمول های ریاضی را برای شما حساب کند
مثلا محیط دایره و محیط مستطیل و ...
اگه اون متد ها رو استاتیک تعریف نکنید باید یه متغیر از نوع اون کلاس حساب کنید بعد با متدهای توش کار کنید
ولی اگه استاتیک باشه یه راست می تونید از متدهاش استفاده کنید و نیاز نیست که هر وقت بهش احتیاج داشتید یه متغیر اون نوع اون تعریف کنید و ...

teardrop
جمعه 28 خرداد 1389, 19:01 عصر
به نام خدا
تابع استتیک فقط به داده های استتیک دستیابی دارد.
و بدونه تعریف شی میتوان از توابع و داده های عضو کلاس استفاده کرد.

sara alavi
جمعه 28 خرداد 1389, 20:16 عصر
سوال!!!
داخل namespace های دیگه هم قابل دسترسی هستند؟

amir-yeketaz
جمعه 28 خرداد 1389, 20:23 عصر
سوال!!!
داخل namespace های دیگه هم قابل دسترسی هستند؟
خیر ... ولی استفاده از تابع ها و متغیر های Static به صورت زیاد پیشنهاد نمیشود ...
چرا :
چون شی گرایی رو نقض میکنه ...

mmd2009
جمعه 28 خرداد 1389, 23:03 عصر
دوست عزیز

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

sara alavi
شنبه 29 خرداد 1389, 11:29 صبح
آقا من اینو نمی فهمم!!!
یه مثال بزارید لطفا!!!

mmd2009
شنبه 29 خرداد 1389, 12:53 عصر
آقا من اینو نمی فهمم!!!
یه مثال بزارید لطفا!!!

با سلام

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

اگر خیلی این مبحث رو دوست دارید چند روز دیگه با یک DLL اموزش کاملا ویدئویی 4 عمل اصلی بانک رو می خوام انجام بدم اونجا خیلی بهتر روند کار رو اموزش دادم

دانلود (http://www.persiangig.com/pages/download/?dl=http://mmd2009.persiangig.com/static.rar)

ALIREZACO
پنج شنبه 03 تیر 1389, 14:45 عصر
سلام من طریقه استفاده از تابع استاتیک رو نمی دونم وکاربرد دقیقش رو هم نمیدونم؟
:عصبانی++:

amir-yeketaz
پنج شنبه 03 تیر 1389, 14:56 عصر
:عصبانی++:
ویژگی های تابع استاتیک :
1- در رده ی نمونه (instance) نیست و در رده ی کلاس است ... یعنی شما میتونید بدون اینکه شی ای از کلاس مورد نظر بسازید به اون متد با استفاده از نام کلاس دسترسی داشته باشین ...
2- توابع استاتیک override نمیشوند (دلیلش رو خودتون روش فکر کنید متوجه میشین!)
3- توابع استاتیک دارایه local variable های استاتیک هستند و قرار دادن یک متغیر غیر استاتیک در آن ارور کامپایلری است ...
یک مثال از کاربرد اونها :
در کلاس Console شما وقتی میخواین چیزی رو تو محیط کنسول پرینت کنین میگین
Console.WriteLine() ... در حالی که هیچ شی ای از کلاس Console نساخته این پس متد WriteLine یک متد static هست که همچین امکانی رو به شما میده ...
امیدوارم مفید بوده باشه ...
موفق باشید ...

Saeed.Masoumi
پنج شنبه 03 تیر 1389, 15:50 عصر
خیر ... ولی استفاده از تابع ها و متغیر های Static به صورت زیاد پیشنهاد نمیشود ...
چرا :
چون شی گرایی رو نقض میکنه ...
سلام با احترام به نظر شما اما به نظر من اینطور نیست!!!تابع استاتیک هیچ مشکلی رو برای شی گرایی بوجود نمیآره بله اگر متغییر به صورت public static تعریف می شد می توانستیم بگیم که سطح دسترسی یک متغییر رو به تا خارج از کلاس بالا بردیم و لی با ایجاد تابع هیچ مشکلی پیش نمیاد بالاخره کلاس باید با محیط بیرون یک ارتباط برقرار کنه یا نه؟همه چیز که با پراپرتی حل نمیشه.

mmd2009
پنج شنبه 03 تیر 1389, 16:01 عصر
سلام دوست عزیز

یعنی به نظر شما استفاده از متغیر استاتیک در کلاس برای فراخوانی در کل فرم ها اصولی شی گرایی رو خراب نمیکنه ؟؟؟

خواهشا یکی یک منبع خوب بده ببینیم کی ما اصول شی گرایی رو خراب نمی کنیم!!!

amir-yeketaz
پنج شنبه 03 تیر 1389, 16:10 عصر
سلام با احترام به نظر شما اما به نظر من اینطور نیست!!!تابع استاتیک هیچ مشکلی رو برای شی گرایی بوجود نمیآره بله اگر متغییر به صورت public static تعریف می شد می توانستیم بگیم که سطح دسترسی یک متغییر رو به تا خارج از کلاس بالا بردیم و لی با ایجاد تابع هیچ مشکلی پیش نمیاد بالاخره کلاس باید با محیط بیرون یک ارتباط برقرار کنه یا نه؟همه چیز که با پراپرتی حل نمیشه.
من هم تا حدودی با نظر شما موافقم ...
من گفتم که استفاده ی "زیاد" از متغیر ها و توابع استاتیک نمیشه ...
چه بسا در خیلی از موارد کاربرد توابع و متغیر های استاتیک بسیار مفید باشد ...
.
.
.
من هم دنبال یک منبع خوب برایه اینکه چجوری میشه قواعد شی گرایی رو رعایت کرد میگردم ...
اگه یکی معرفی کنه ممنون میشم ...

Saeed.Masoumi
پنج شنبه 03 تیر 1389, 16:11 عصر
سلام دوست عزیز

یعنی به نظر شما استفاده از متغیر استاتیک در کلاس برای فراخوانی در کل فرم ها اصولی شی گرایی رو خراب نمیکنه ؟؟؟


چرا خراب می کنه.
من عرض کردم توابع نه متغییر ها.
منبع کتابهای رفرنس برای درس مهندسی نرم افزار 1 و 2

mmd2009
پنج شنبه 03 تیر 1389, 16:15 عصر
راستی فقط یک سوال دارم

البه این سوال شاید خیلی مبتدیانه باشه چون خودمم مبتدی هستم و امیدوارم جواب خوبی هم داشته باشه

اگر استفاده از متغیر استاتیک با استفاده از کلاس اصول شی گرایی رو میبره زیر سوال پس چرا تو برنامه ها از این گونه روش ها خطا گرفته نمیشه

Saeed.Masoumi
پنج شنبه 03 تیر 1389, 16:19 عصر
راستی فقط یک سوال دارم

البه این سوال شاید خیلی مبتدیانه باشه چون خودمم مبتدی هستم و امیدوارم جواب خوبی هم داشته باشه

اگر استفاده از متغیر استاتیک با استفاده از کلاس اصول شی گرایی رو میبره زیر سوال پس چرا تو برنامه ها از این گونه روش ها خطا گرفته نمیشه



مثلا؟
ببینید متغییر استاتیکبه خودی خود بد نیست
// // کلاس استاتیک بد نیست : Math
// /// تابع استاتیک بد نیست: همون مثال Console.write
چون درتوابع استاتیک نمیتوانید از فیلدهای غیر استاتیک استفاده کنید پس نیاز به متغییر استاتیک دارید اما اینکه به متغییری سطح دسترسی رو از داخل کلاس بالا ببرید چه استاتیک و ... اشتباه است.ولی یک متغییر در سطح کلاس هیچ مشکلی از این نظر بوجود نمی آره.

mmd2009
پنج شنبه 03 تیر 1389, 16:22 عصر
دوست عزیز حالا فرض کنید من یک کلاس نوشتم با این شکل :




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace class_moteghaier
{
class Class1
{
private static string name = "mojtaba dinarvand";


public string NAME
{
get { return (name); }
set { name = value; }
}
}
}





حالا تو برنامه اینطوری فراخوانیش میکنم





Class1 cl = new Class1();
MessageBox.Show(cl.NAME);



حالا بگید مشکل این چیه؟

واقعا ممنون میشم

amir-yeketaz
پنج شنبه 03 تیر 1389, 16:22 عصر
مثلا؟
ببینید متغییر استاتیکبه خودی خود بد نیست
// // کلاس استاتیک بد نیست : Math
// /// تابع استاتیک بد نیست: همون مثال Console.write
چون درتوابع استاتیک نمیتوانید از فیلدهای غیر استاتیک استفاده کنید پس نیاز به متغییر استاتیک دارید اما اینکه به متغییری سطح دسترسی رو از داخل کلاس بالا ببرید چه استاتیک و ... اشتباه است.ولی یک متغییر در سطح کلاس هیچ مشکلی از این نظر بوجود نمی آره.
پس واقعا مشکل از اینجاست ؟؟؟!!!
مشکل دیگه ای نیست؟؟

Saeed.Masoumi
پنج شنبه 03 تیر 1389, 16:28 عصر
دوست عزیز حالا فرض کنید من یک کلاس نوشتم با این شکل :




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace class_moteghaier
{
class Class1
{
private static string name = "mojtaba dinarvand";


public string NAME
{
get { return (name); }
set { name = value; }
}
}
}



حالا تو برنامه اینطوری فراخوانیش میکنم





Class1 cl = new Class1();
MessageBox.Show(cl.NAME);

حالا بگید مشکل این چیه؟

واقعا ممنون میشم
شرمنده اینجا نقش اون استاتیکه چیست؟؟؟؟اینو اگر هم استاتیک نباشه میشه همین جوری نوشت.
این کاری که کردین همون پراپرتی است و به نظر من (لا اقل به نظر من ) مشکلی نداره
برای منبع این برای شروع بدک نیست:
تحلیل و طراحی سیستمها
نویسنده:ایگور هوریس کوویچ
فصل یازدهم :مدل سازی اشیاء - فصل دوازدهم: تحلیل شی - شناسایی اشیائ

mmd2009
پنج شنبه 03 تیر 1389, 16:33 عصر
البته مطمئنا میدونید واسه چیه ولی من بازم میگم
استاتیکش واسه اینه اگر یک بار تغییرش بدی متغیر رو تو همه قسمت های فراخوانی شده تغییر حالت میده ولی اگر استاتیک نباشه هر جا میتونی یک چیز دیگه براش تعریف کنی به صورتی که تو کل پروژه تغییری نمیکنه

ولی دوستانی که 3 یا 4 تا پیرهن بیشتر پاره کردن میگن این روش اصلا خوب نیست و بهتره در این مواقع از app.config استفاده بشه

zahra_m_alipoor
پنج شنبه 03 تیر 1389, 20:56 عصر
بالاخره کلاس باید با محیط بیرون یک ارتباط برقرار کنه یا نه؟همه چیز که با پراپرتی حل نمیشه.

میشه فرق کلاس با componnent رو بهمن بگید؟

Salar Ashgi
جمعه 04 تیر 1389, 09:14 صبح
تو یک کلام : اگر تابعی از یک کلاس static تعریف بشه ، میتونیم بدون استفاده از اینکه آبجکتی از کلاس درست

کنیم ، به این تابع دسترسی داشته باشیم .

مثال بارزش کلاس Math خود دات نت :

اگر متودهای این کلاس static نبودن ، بجای اینکه بنویسی :



int i = Math.Sqrt(16);


باید مینوشتی :



Math m = new Math();
int i = m.Sqrt(16);

kamran m
دوشنبه 24 آبان 1389, 18:42 عصر
دوستان كسي ميتونه 5-6 تا از توابع استاتيك رو نام ببره و يك توضيح كوتاه هم از هر كدوم بده؟؟؟

flash118
دوشنبه 24 آبان 1389, 19:59 عصر
خوب با سلام
دوستان با این که زیاد در موردش گفتن منم تا حد توان ساده تر بیان میکنم بلکه ایشاالله دوستانی که باهاش مشکل دارن به صلح برسن
اینا کد کلاس

class sample
{
public static int sum;
public static int add(int x, int y)
{
sum = x + y;
return sum;
}
public int add_without_static(int x, int y)
{
int k = x + y;
return k;
}



}

اینم ادامش با توضیحات فارس که تا حد توان ساده نوشته شده:

private void button1_Click(object sender, EventArgs e)
{
//دوست عزیز الان میخواهم بدون استفاده از ساختن شی از کلاس تابع رو فراخوانی کنم
MessageBox.Show("حاصل جمع با استفاده از توابع استاتیک"+sample.add(10, 20).ToString());
//خوب دوست عزیز الان من میخواهم بدون ساختن شی تابع دوم که استاتیک نیست رو فراخوانی کنم
//ولی چون شی از نوع کلاس ساخته نشده قابل دسترسی نیست حالا میخواهم یه شی بسازم ببینم مشکل حل میشه که حتما خواهد شد
sample s_1 = new sample();
//حال که شی جدید ساخته شد میرم از تابع استفاده کنم
MessageBox.Show("حاصل جمع بدون استفاده از استاتیک"+s_1.add_without_static(30, 20).ToString());
//مشکل حل شد ولی جالبه بدونید هنوزم sumمقدار خودش رو خفظ کرده
MessageBox.Show("مقدار متغییر سام که بصورت استاتیک هست"+sample.sum.ToString());
}

amir-yeketaz
دوشنبه 24 آبان 1389, 20:08 عصر
دوستان كسي ميتونه 5-6 تا از توابع استاتيك رو نام ببره و يك توضيح كوتاه هم از هر كدوم بده؟؟؟
کلاس Console که خودش استاتیکه و تمام متدهای درونشم مطمئنا stattic هست ...

برای این که خودتون متوجه بشین از منوی view گزینه object browser رو انتخاب کنید و مثلا کلمه ی Console رو تو قسمت سرچ اون بزنید تا در قسمت توضیحات (پایین سمت راست!) ببینید که این کلاس و متدهاش استاتیک هستند...

موفق باشید ...