الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استخدام Conversion Keywords

بدأه man.hi في 4 سبتمبر 2011 · 2 رد · 578 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم

اذا ممكن شرح

•explicit

•implicit

•operator

وشكرا

يا ريت ايضا متى يتم استعمال كل منهما ؟

وما الفائدة منهم؟

#2

وعليكم السلام،

اولا کما تعلم، 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:

explicit

implicit

operator

Stackoverflow:

C# tag

والسلام عليكم

تم تعديل هذه المشاركة بواسطة موليان في 4 سبتمبر 2011 في 18:34

1

..:: رَبِّ زِدْني عِلْمًا ::..

#3

شكرا جزيلا

إن شاء الله في ميزان الحسنات

مواضيع مشابهة