بسم الله الرحمن الرحيم
السلام عليكم
اذا ممكن شرح
•explicit
•implicit
•operator
وشكرا
يا ريت ايضا متى يتم استعمال كل منهما ؟
وما الفائدة منهم؟
بسم الله الرحمن الرحيم
السلام عليكم
اذا ممكن شرح
•explicit
•implicit
•operator
وشكرا
يا ريت ايضا متى يتم استعمال كل منهما ؟
وما الفائدة منهم؟
وعليكم السلام،
اولا کما تعلم، explicit و implicit يعني "الصريحة" و "الضمنية" على الترتيب.
explicit:
للتحویل بین نوعین نستخدم explicit keyword. و یجب تحویل واضح بین نوعین أی مثل هذا مثلا
Celsius c = (Celsius)f;
انظر كيفية استخدام (Celsius)
مثال من مكتبة MSDN
class Celsius
{
public Celsius(float temp)
{
degrees = temp;
}
public static explicit operator Fahrenheit(Celsius c)
{
return new Fahrenheit((9.0f / 5.0f) * c.degrees + 32);
}
public float Degrees
{
get { return degrees; }
}
private float degrees;
}
class Fahrenheit
{
public Fahrenheit(float temp)
{
degrees = temp;
}
// Must be defined inside a class called Farenheit:
public static explicit operator Celsius(Fahrenheit f)
{
return new Celsius((5.0f / 9.0f) * (f.degrees - 32));
}
public float Degrees
{
get { return degrees; }
}
private float degrees;
}
class MainClass
{
static void Main()
{
Fahrenheit f = new Fahrenheit(100.0f);
Console.Write("{0} fahrenheit", f.Degrees);
Celsius c = (Celsius)f;
Console.Write(" = {0} celsius", c.Degrees);
Fahrenheit f2 = (Fahrenheit)c;
Console.WriteLine(" = {0} fahrenheit", f2.Degrees);
}
}
/*
Output:
100 fahrenheit = 37.77778 celsius = 100 fahrenheit
*/{ألق نظرا بكيفية التحويل من Fahrenheit to Celsius والعکس}
implicit:
نستخدم هذا ايضا لهذا الغرض، لكن للتحويل الضمني،
ألق نظرا بالمثال:
class Digit
{
public Digit(double d) { val = d; }
public double val;
// ...other members
// User-defined conversion from Digit to double
public static implicit operator double(Digit d)
{
return d.val;
}
// User-defined conversion from double to Digit
public static implicit operator Digit(double d)
{
return new Digit(d);
}
}
class Program
{
static void Main(string[] args)
{
Digit dig = new Digit(7);
//This call invokes the implicit "double" operator
double num = dig;
//This call invokes the implicit "Digit" operator
Digit dig2 = 12;
Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);
Console.ReadLine();
}
}
}هنا مباشرا نحول من نوع Digit إلى نوع double
double num = dig;
لکن لا نحتاج لـcast للتحویل کمثل السابق (Celsius)
المثال واضح ان شاء الله :-]
الفرق بينهما:
إذا كانت عملية التحويل يمكن أن تسبب فقدان المعلومات أو تسبب exceptions، يجب عليك استخدام explicit conversion
لکن ان تعلم أنها لن تسبب فقدان المعلومات فإستخدم implicit conversion.
وأما operator:
لـ operator overloading و التحویل بین نوعین
مثال:
class Fraction
{
int num, den;
public Fraction(int num, int den)
{
this.num = num;
this.den = den;
}
// overload operator +
public static Fraction operator +(Fraction a, Fraction b)
{
return new Fraction(a.num * b.den + b.num * a.den,
a.den * b.den);
}
// overload operator *
public static Fraction operator *(Fraction a, Fraction b)
{
return new Fraction(a.num * b.num, a.den * b.den);
}
// user-defined conversion from Fraction to double
public static implicit operator double(Fraction f)
{
return (double)f.num / f.den;
}
}
class Test
{
static void Main()
{
Fraction a = new Fraction(1, 2);
Fraction b = new Fraction(3, 7);
Fraction c = new Fraction(2, 3);
Console.WriteLine((double)(a * b + c));
}
}
/*
Output
0.880952380952381
*/فی هذا المثال نقوم بـ operator overloading لـ + و *
(a * b + c)
و ايضا التحويل بين النوعين
(double)(a * b + c)
معًا.
الامثلة واضحة جدا ولا تحتاج بالتوضيح والتفصيل :-)
للتفاصيل:
MSDN:
Stackoverflow:
والسلام عليكم
تم تعديل هذه المشاركة بواسطة موليان في 4 سبتمبر 2011 في 18:34
شكرا جزيلا
إن شاء الله في ميزان الحسنات