1
אובייקטים ומחלקות
הגדרת classוהגדרת struct
הגדרת משתנים
הגדרת מתודות
הגדרת properties
הגדרת constructors
משתנים מסוג Read Only
הגדרת מחלקה אנונימית
הגדרת struct
הגדרת מחלקה מסוג partial
הגדרת מחלקה סטטית
המחלקה Object
© 2009 Haim Michael
2
הגדרת classוהגדרת struct
הגדרת classב C#-מהווה הגדרה של תבנית שעל פיה ניתן לאחר מכן לייצור אובייקטים .בתבנית יוגדו משתנים
ומתודות .בכל אחד מהאובייקטים שייווצרו על פיה ניתן יהיה למצוא את כל אחד מהמשתנים .את כל אחת מהמתודות
ניתן יהיה להפעיל על כל אחד מהאובייקטים.
הגדרה של structדומה במשמעותה להגדרה של .classההבדל הוא בכך שהזיכרון שמשמש ליצירת אובייקטים מ-
structנלקח מה stack-בעוד שהזיכרון שמשמש ליצירת אובייקטים מ class-נלקח מה .heap-הבדל נוסף הוא שלא ניתן
להגדיר structאשר יורש מ struct-אחר.
כללי התחביר שחלים בהגדרה של classדומים לכללי התחביר שחלים בהגדרה של .structההבדל הוא שבמקום
להשתמש במילה classמשתמשים במילה .struct
© 2009 Haim Michael
3
הגדרת משתנים
יצירת אובייקט חדש מ class-או מ struct-נעשית באמצעות המילה השמורה .newגישה למשתנים שבתוך האובייקט
נעשית באמצעות אופרטור הנקודה ' ,'.אשר משמש גם לקריאה להפעלתן של מתודות )על האובייקט(.
;)Rectangle rec = new Rectangle(20,30
;rec.width = 20
;rec.height = 30
;)(double val = rec.Area
משתנים סטטיים מוגדרים באמצעות המילה השמורה .staticלהבדיל ממשתנה רגיל אשר ניתן יהיה למצוא בכל אחד
מהאובייקטים ,משתנה סטטי מתאר את המחלקה כולה והוא איננו מופיע בעותקים נפרדים בכל אחד מהאובייקטים .כדי
לפנות למשתנה סטטי ניתן לרשום את שם המחלקה בצירוף אופרטור הנקודה המפרידה ' '.ומייד לאחריו שם המשתנה
הסטטי שאליו רוצים לפנות.
;Rectangle.MaxWidth = 100
© 2009 Haim Michael
4
הגדרת מתודות
ב classs-ניתן להגדיר מתודות אשר ניתן יהיה להפעיל על כל אובייקט שיווצר ממנו .הפעלת מתודה על אובייקט נעשית
באמצעות אופרטור הנקודה '.'.
;)Rectangle rec = new Rectangle(20,30
;rec.width = 20
;rec.height = 30
;)(double val = rec.Area
הגדרה של מתודה נעשית באופן הבא:
)][modifiers] return_type MethodName([parameters
{
...
}
אם מוסיפים להגדרת המתודה את המילה השמורה staticאז מתקבלת מתודה שלא ניתנת להפעלה על אובייקט
מסוים .המתודה שמתקבלת מסוגלת לבצע פעולה כללית אשר קשורה למחלקה מבלי לפעול על אובייקט מסוים .הדוגמה
הבאה מציגה הגדרה של מתודה סטטית.
© 2009 Haim Michael
5
using System;
namespace abelski.csharp
{
class SimpleMethodDemo
{
static void Main()
{
int value1 = 1234;
int value2 = 2222;
int value3 = Sum(value1,value2);
Console.WriteLine("value1="+value1);
Console.WriteLine("value2="+value2);
Console.WriteLine("value3="+value3);
Console.ReadLine();
}
}
static int Sum(int num1, int num2)
{
return num1 + num2;
}
}
:הפלט הוא
© 2009 Haim Michael
6
אם מסמנים פרמטר של.( )ברירת מחדלby value כאשר מגדירים מתודה עם פרמטרים הערכים שיישלחו אליה יישלחו
יש להוסיף גם להגדרת הפרמטר במתודה וגם לקוד אשרref את.by reference אז הערך יישלחref מתודה באמצעות
. הדוגמה הבאה מציגה זאת.קורא להפעלתה
using System;
namespace abelski.csharp
{
class ByReferenceDemo
{
static void Main()
{
int i = 2;
Console.WriteLine("before... i="+i);
DoSomething(ref i);
Console.WriteLine("after... i="+i);
Console.ReadLine();
}
static void DoSomething(ref int num)
{
num++;
}
}
}
:הפלט יהיה
© 2009 Haim Michael
7
ניתן להגדיר מתודה אשר מחזירה יותר מערך אחד באמצעות פרמטר שמוגדר בה .כאשר משתמשים ב ref-בהגדרתו של
פרמטר ניתן לקבל דרכו ערך מוחזר .כאשר משתמשים ב out-אז בדומה לשימוש ב ref-ניתן לקבל באמצעות הפרמטר
ערך מוחזר .ההבדל הוא שכאשר משתמשים ב out-אז לא חייבים לאתחל את המשתנה אשר שולחים למתודה .בדומה
לשימוש ב ref-את outיש להוסיף גם להגדרת הפרמטר במתודה וגם לקוד אשר קורא להפעלתה .הדוגמה הבאה מציגה
זאת.
;using System
namespace abelski.csharp
{
class OutParameterDemo
{
)(static void Main
{
;int i
;)DoSomething(out i
;)Console.WriteLine("i="+i
;)(Console.ReadLine
}
)static void DoSomething(out int num
{
;num=123
}
}
}
הפלט יהיה:
© 2009 Haim Michael
8
ההבדל ביניהן חייב להיות במספר. תומכת בהגדרה של מספר גרסאות שונות לאותה מתודהC# שפת התיכנות
. להלן דוגמה.(overloading methods) או בטיפוס שלהם/הפרמטרים ו
using System;
namespace abelski.csharp
{
class OverloadingParametersDemo
{
static void Main()
{
int num1 = 20;
int num2 = 44;
int num3 = 24;
int num4 = Total(num1,num2,num3);
Console.WriteLine("num4="+num4);
Console.ReadLine();
}
static int Total(int val1, int val2)
{
return val1+val2;
}
static int Total(int val1, int val2, int val3)
{
return val1+val2+val3;
}
}
}
:הפלט יהיה
© 2009 Haim Michael
9
הגדרת properties
שפת התיכנות C#מאפשרת להגדיר מתודה )או זוג של מתודות( אשר יפעלו מבחינת המתכנת באופן שקוף בכל פעם
שינסה לקבוע את ערכו )או לקבל בחזרה את ערכו( של משתנה שאליו המתודה )או זוג המתודות( מתייחסת )מתייחסות(.
מתודה )מתודות( זו )אלה( ידועה )ידועות( בשם .propertyאופן ההגדרה של propertyהוא כדלקמן.
public property_type PropertyName
{
access_modifier get
{
... return some value
}
access_modifier set
{
... set the property value
}
}
באמצעות valueניתן להתייחס לערך שאותו מנסים להכניס אל תוך המשתנה שה property-מתייחס אליו .ניתן
להשתמש ב value-רק בגבולות של בלוק הפקודות שמתייחס ל .set-הדוגמה הבאה ממחישה זאת.
;using System
namespace Abelski.CSharp
{
class SimplePropertyDemo
{
)(static void Main
{
;)(Rectangle rec = new Rectangle
;rec.Width=12
;rec.Height=14
;)(rec.PrintDetails
}
}
class Rectangle
;private double width, height
© 2009 Haim Michael
{
10
public void PrintDetails()
{
Console.WriteLine("["+Width+","+Height+"]");
}
public double Width
{
get
{
return width;
}
set
{
if(value>0) { width = value; }
else {Console.WriteLine("width was not set...");}
}
}
public double Height
{
get
{
}
set
{
return height;
if(value>0)
{
height = value;
}
else
{
Console.WriteLine("height was not set...");
}
}
}
}
}
© 2009 Haim Michael
11
הפלט הוא:
אם משמיטים את setמההגדרה של ה property-אז מקבלים .read only propertyאם משמיטים את get
מההגדרה של ה property-אז מקבלים .write only propertyניתן להעניק הרשאות גישה שונות ל get-ול-
.set
אם ה property-שאנו רוצים להגדיר הוא propertyפשוט ללא כל בדיקות אז ניתן להגדירו באופן המקוצר הבא:
};public property_type property_name {get; set
במקרה שבו מגדירים את ה property-באופן זה אז אין צורך להגדיר את המשתנה שאליו ה property-מתייחס.
המהדר יעשה זאת עבורנו באופן אוטומטי .זהו המקרה היחידי שבו המשתנה מוגדר עבורנו באופן אוטומטי.
ניתן להגדיר את setואת getעם הרשאות גישה שונות באופן הבא:
};public property_type property_name {get; private set
© 2009 Haim Michael
12
.properties הדוגמה הבאה מציגה הגדרה מקוצרת של
using System;
namespace abelski.csharp
{
class AutomaticProperty
{
static void Main()
{
Rectangle rec = new Rectangle();
rec.Width=12;
rec.Height=14;
rec.PrintDetails();
}
}
class Rectangle
{
public void PrintDetails()
{
Console.WriteLine("["+Width+","+Height+"]");
}
public double Width {get; set;}
public double Height {get; set;}
}
}
:הפלט שיתקבל הוא
© 2009 Haim Michael
13
© 2009 Haim Michael
14
הגדרת constructors
הגדרה של constructorsב C#-נעשית באופן דומה להגדרה של constructorsב .Java-הגדרה של constructor
הנה ,למעשה ,הגדרה של מתודה עם שם שזהה לשם של המחלקה ומבלי שיהיה לה ערך מוחזר.
public class SomethingClass
{
)(public SomethingClass
{
...
}
}
כל עוד לא הגדרנו constructorמיוזמתנו ,המהדר מייצר עבורנו ,default constructorשהינו
constructorללא כל פרמטרים .בדומה להגדרה של מתודות ,ניתן להגדיר יותר מ constructor-אחד )
.(constructors overloadingניתן להגדיר constructorsעם כל הרשאת גישה.
שפת התכנות C#מאפשרת גם להגדיר static constructorבאופן הבא:
class MyClass
{
)(static MyClass
{
...
}
}
ה static constructor-חייב להיות מוגדר ללא כל פרמטרים .ניתן להגדיר static constructorאחד
בלבד .ה static constructor-מתבצע פעם אחת בלבד )כאשר ה class-נטען לזיכרון( .לstatic-
constructorאין הרשאת גישה .בהיותו מופעל פעם אחת בלבד כאשר ה class-נטען לזיכרון אין כל משמעות
להרשאת גישה .הדוגמה הבאה מציגה הגדרה של .static constructor
© 2009 Haim Michael
15
using System;
namespace abelski.csharp
{
class StaticConstructorDemo
{
private static int defaultWidth;
private static int defaultHeight;
static StaticConstructorDemo()
{
defaultWidth = 10;
defaultHeight = 4;
}
}
}
static void Main()
{
Rectangle rec = new Rectangle();
rec.Width=defaultWidth;
rec.Height=defaultHeight;
rec.PrintDetails();
}
class Rectangle
{
public void PrintDetails()
{
Console.WriteLine("["+Width+","+Height+"]");
}
public double Width {get; set;}
public double Height {get; set;}
}
© 2009 Haim Michael
16
:הפלט שיתקבל הוא
: אחר באופן הבאconstructor מסוים ניתן לקרוא מתוכו להפעלתו שלconstructor כאשר מופעל
class MyClass
{
public MyClass(int width): this(width,10)
{ ... }
public MyClass(int width, int height)
{ ... }
}
.הדוגמה הבאה מציגה זאת
using System;
namespace abelski.csharp
{
class ConstructorsThisDemo
{
static void Main()
{
Rectangle rec = new Rectangle();
rec.PrintDetails();
}
}
}
© 2009 Haim Michael
17
class Rectangle
{
private double Width {get; set;}
public double Height {get; set;}
public Rectangle() : this(10.0,10.0)
{
Console.WriteLine("Rectangle() is executed");
}
public Rectangle(double widthVal, double heightVal)
{
this.Width = widthVal;
this.Height = heightVal;
Console.WriteLine("Rectangle(double,double) executed");
}
public void PrintDetails()
{
Console.WriteLine("["+Width+","+Height+"]");
}
}
}
:הפלט שנקבל הוא
© 2009 Haim Michael
18
משתנים מסוג Read Only
ניתן לסמן משתנה במחלקה באמצעות .readonlyבמקרה כזה ,המקום היחידי שבו ניתן יהיה להכניס לתוכו ערך הוא ה-
.constructorלהבדיל ממשתנה מסוג ,consttניתן לסמן משתנה כ readonly-גם כשמדובר במשתנה staticוגם
כשמדובר במשתנה .instance
© 2009 Haim Michael
19
הגדרת מחלקה פנימית אנונימית
ניתן להגדיר מחלקה אנונימית )ללא שם( אשר יורשת מ Object-והגדרתה משולבת ביצירת אובייקט ממנה באופן הבא:
{ var stud = new
Name=”Daniel Shabat”,
id=2321231,
;}average=98
© 2009 Haim Michael
20
struct הגדרת
.class בדומה לאופן השימוש במילה השמורהstruct ( יש להשתמש במילה השמורהclass )במקוםstruct כדי להגדיר
:class- לstruct להלן ההבדלים העיקריים בין
.references types הםclass values- הרי שvalue types הםstruct values- בעוד ש.1
. אשר יורש מאחרstruct לא ניתן להגדיר.2
. שאנחנו לא יכולים להחליף באחרdefault constructor שאנו מגדירים ישstruct- ב3
:struct להלן דוגמה להגדרה של
using System;
namespace abelski.csharp
{
class ConstructorsThisDemo
{
static void Main()
{
Rectangle rec = new Rectangle(14,12);
rec.PrintDetails();
}
}
struct Rectangle
{
private double width,height;
public Rectangle(double widthVal, double heightVal)
{
width = widthVal;
height = heightVal;
}
public void PrintDetails()
{
Console.WriteLine("["+width+","+height+"]");
}
}
}
© 2009 Haim Michael
21
להלן הפלט שנקבל.
© 2009 Haim Michael
22
partial הגדרת מחלקה מסוג
partial את המילה השמורה. ביותר מקובץ קוד מקור אחדinterface אוstruct אוclass ניתן להגדירpartial באמצעות
. להלן דוגמה שממחישה זאת.( )בהתאם למה שמגדיריםinterface אוclass, struct יש למקם לפני המילה השמורה
using System;
namespace abelski.csharp
{
class ConstructorsThisDemo
{
static void Main()
{
Rectangle rec = new Rectangle(14,12);
rec.PrintDetails();
}
}
partial struct Rectangle
{
private double width,height;
public Rectangle(double widthVal, double heightVal)
{
width = widthVal;
height = heightVal;
}
}
}
:ובקובץ נפרד
using System;
namespace abelski.csharp
{
partial struct Rectangle
{
public void PrintDetails()
{
Console.WriteLine("["+width+","+height+"]");
}
}
}
© 2009 Haim Michael
23
להלן הפלט של התכנית.
© 2009 Haim Michael
24
הגדרת מחלקה סטטית
כאשר המחלקה שאנו מגדירים לא כוללת דבר מלבד מתודות סטטיות ומשתנים סטטיים אז ניתן להגדירה כמחלקה
static כדי להפוך מחלקה למחלקה סטטית יש להוסיף את המילה. ממחלקה סטטית לא ניתן לייצור אובייקט.סטטית
. הדוגמה הבאה מציגה זאת.לשורת הכותרת שלה
using System;
namespace abelski.csharp
{
class ConstructorsThisDemo
{
static void Main()
{
double num1 = 12.4;
double num2 = 14.6;
double total;
total = Utils.add(num1,num2);
Console.WriteLine("total="+total);
}
}
static class Utils
{
public static double add(double numA, double numB)
{
return numA+numB;
}
public static double subtract(double numA, double numB)
{
return numA-numB;
}
}
}
© 2009 Haim Michael
25
הפלט שנקבל הוא:
© 2009 Haim Michael
26
Object המחלקה
: מחלקה זו כוללת את המתודות החשובות הבאות.Object כל מחלקה יורשת )ישירות או בעקיפין( מהמחלקה
ToString()
GetHashCode()
Equals()
Finalize()
GetType()
MemberWiseClone()
© 2009 Haim Michael
© Copyright 2025