المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس الخامس عشر : التعرف على Static دورة .net 2008


khaledbelal
02-19-2010, 08:05 PM
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

لاحظنا في الدالة main الموجودة اساساً في البرنامج اننا نستخدم الكلمة static في ال C# أو Shared في ال VB.net ، فما معنى هذه الكلمة ؟

الكلمة static والتي يمكن استخدامها مع الدوال او الكلاس او حتى المتغيرات تعني ان هذا المتغير او الدالة يتم الوصول لها من على مستوى ال Class مباشرة وليس من مستوى ال object ، لنفترض المثال التالي الخاص ب Person :

C#:

class Person
{
public string FirstName;
public string LastName;
public int Age;
static public int counter;
}

VB.net:

Class Person
Public FirstName As String
Public LastName As String
Public Age As Integer

Public Shared counter As Integer
End Class

ولنفترض اننا كتبنا الكود التالي مثلاً :

C#:

Person MyEmpolyee = new Person();
MyEmpolyee.Age = 15;
MyEmpolyee.counter = 3;

VB.net:

Dim MyEmpolyee As New Person()
MyEmpolyee.Age = 15
MyEmpolyee.counter = 3

للاسف لن يكون هذا الكود صحيحاً ، حيث ان counter هو متغير static ولذا تتم قراءته مباشرة على مستوى الكلاس بالشكل التالي :

C#:

Person MyEmpolyee = new Person();
MyEmpolyee.Age = 15;
Person.counter = 3;


VB.net:

Dim MyEmpolyee As New Person()
MyEmpolyee.Age = 15;
Person.counter = 3;



لو قمنا بتعريف Object جديد من نفس الكلاس ، وقمنا بعرض قيمة ال counter الخاصة به من داخل الكلاس سنجد انها 3 مباشرة ، ذلك ان المتغير static يتم تعريف نسخة واحدة منه على مستوى الكلاس لجميع الكائنات object التي يتم عملها منه .

مثال على الاستفادة من هذه الخاصية هي خاصية العدادات ، والتي تقوم بعد الاوبجكتس التي ننشأها من هذا الكلاس ، سنضع الكود الاضفة في ال Constructor فيما نضع كود النقص في Destructor :

C#:

class Person
{
public string FirstName;
public string LastName;
public int Age;
static public int counter;
public string getFullName()
{
return FirstName + LastName;
}
public Person()
{
counter++;
}
~Person()
{
counter--;
}
}

VB.net:

Class Person

Public FirstName As String
Public LastName As String
Public Age As Integer

Public Shared counter As Integer

Public Function getFullName() As String
Return FirstName + LastName
End Function

Public Sub New()
counter += 1
End Sub
Protected Overrides Sub Finalize()
Try

counter -= 1
Finally
My****.Finalize()
End Try
End Sub
End Class

والآن سنقوم بانشاء عدد من الكائنات ، ومن ثم نقوم بعرض قيمة العداد :

C#:

Person MyEmpolyee = new Person();
Person MyEmpolyee2 = new Person();
Person MyEmpolyee3 = new Person();
Person MyEmpolyee4 = new Person();
Person MyEmpolyee5 = new Person();
Console.WriteLine(Person.counter);

VB.net:

Dim MyEmpolyee As New Person()

Dim MyEmpolyee2 As New Person()
Dim MyEmpolyee3 As New Person()
Dim MyEmpolyee4 As New Person()
Dim MyEmpolyee5 As New Person()
Console.WriteLine(Person.counter)

لو افترضنا الكود التالي :

c#:

Person [] MyEmpolyee = new Person[5];

Console.WriteLine(Person.counter);
vb.net:


Dim MyEmpolyee As Person() = New Person(4) {}
Console.WriteLine(Person.counter)

لا تتوقع ان الناتج سيكون 5 ، للاسف توقعك ليس في محله ، والسبب ان اياً من نسخ MyEmpolyee لم يتم انشاءه بعد ، الحالة التالية هي من ستعطيك الناتج 5 :


C#:

Person [] MyEmpolyee = new Person[5];
for (int i = 0; i < 5; i++)
MyEmpolyee[0] = new Person();
Console.WriteLine(Person.counter);

VB.net:

Dim MyEmpolyee As Person() = New Person(4) {}
For i As Integer = 0 To 4
MyEmpolyee(0) = New Person()
Next
Console.WriteLine(Person.counter)

Static Class :

منذ .net framewrok 2.0 تم اعتماد مبدأ ال Static Class ، وبطبيعة الحال فإن أي Static Class لا بد ان تكون جميع المتغيرات والدوال فيه من نوع static ، اضف إلى ذلك فإنه ليس من المنطقي تعريف object من هذا الكلاس باستخدام New .

في هذه الحالة يمكن استخدام الكلاس ودوالة مباشرة ، ابسط امثلة هذا ال Class هي MessageBox والتي يمكن استخدامها مباشرة دون تعريف نسخة منها .