PDA

View Full Version : مشکل در delegate



hosseinam1370
سه شنبه 12 خرداد 1394, 09:22 صبح
دوستان تو این کد چرا نمیتونم به عنوان سازنده ، تابع sum رو بفرستم؟

البته اگه تابع sum استاتیک باشه مشکل حل میشه، ولی به غیر از معرفی به صورت استاتیک چه راه دیگه ایی وجود داره؟
namespace delegate1
{
class Program
{
public delegate void myDelegate(int m , int n);

static void Main(string[] args)
{
int a = 100, b = 200;
myDelegate MathDelegate = new myDelegate(sum); //--------->> inja sum error mizane.
MathDelegate(a, b);

Console.ReadKey();

}

public void sum(int m, int n)
{
Console.WriteLine("{0} + {1} = {2}", m, n, m + n);
}
}
}

با تشکر.

Javad_raouf
سه شنبه 12 خرداد 1394, 09:49 صبح
ربطی به delegate نداره
قانون کلیه که یک متد یا پروپرتی غیر استاتیک نمیشه توی یک متد استاتیک استفاده بشه
وقتی Sum رو غیر استاتیک تعریف کردی یعنی متد Sum وجود نداره مگر وقتی از کلاس Program یک شیء New کنیم
و چون تابع Main استاتیکه یعنی بدون نیاز به New شدن کلاس program قابل دسترسیه در نتیجه در تابع Main نمی تونی از Sum استفاده کنی
اگر دلیلی داری برای اینکه Sum رو استاتیک تعریف نکنی میشه با یک کلک رشتی قضیه رو حل کرد:
class Program
{
public delegate void myDelegate(int m, int n);


static Program KalakRashti = new Program();
static void Main(string[] args)
{
int a = 100, b = 200;
myDelegate MathDelegate = new myDelegate(KalakRashti.sum); //--------->> inja sum error mizane.
MathDelegate(a, b);


Console.ReadKey();


}


public void sum(int m, int n)
{
Console.WriteLine("{0} + {1} = {2}", m, n, m + n);
}
}

hosseinam1370
سه شنبه 12 خرداد 1394, 10:42 صبح
خوب شما اومدید یه شی از کلاس program و نوع static ساختید و حل کردید، حالا مثلا چرا نمیشه از این روش استفاده کرد؟ میخام بگم با این کد ، در لحظه ران شدن این کلاس، آیا حافظه استاتیک براش در نظر گرفته نمیشه؟
namespace delegate1
{
class static Program
{
public delegate void myDelegate(int m , int n);

static void Main(string[] args)
{
int a = 100, b = 200;
myDelegate MathDelegate = new myDelegate(this.sum); //--------->> inja sum error mizane.
MathDelegate(a, b);

Console.ReadKey();

}

public void sum(int m, int n)
{
Console.WriteLine("{0} + {1} = {2}", m, n, m + n);
}
}
}

با تشکر.

sohrab08
چهارشنبه 13 خرداد 1394, 15:31 عصر
بجای public void sum بنویس public static void sum

RmeXXXXXXXXX
چهارشنبه 13 خرداد 1394, 18:56 عصر
دوست عزیز کلمه this به شی جاری اشاره میکنه. کلاً متدها و خصوصیات استاتیک وابسته به شی نیستند! پس به هیچ متدی یا خصویت غیر استاتیک (instance) دسترسی نخواهید داشت چون شیی وجود نداره!
یکی از دوستان روشی رو عنوان کردن که نمیشه بهش گفت کلک! بلکه نحوه و روش دسترسی به عناصر غیر استاتیک رو توضیح دادن. تنها راه دسترسی همون ایجاد شی (نمونه) هست.
البته برای مثال شما ساده تر هم میشه نوشت:

myDelegate MathDelegate = new myDelegate(new Program().sum);