עבור לתוכן

C# - יצירת EVENT

Featured Replies

פורסם

יש לי תוכנה שאליה אני מצרף קבצים, את הקבצים אני קורא אחד אחרי השני, מידי פעם כאשר הקובץ הבא שאמור להיקרא ולהיכנס לעבודה יגיע עם דיליי מסויים של כמה שניות אני רוצה שטיימר יכנס לפעולה ויספור אחורנית (יציג את הספירה בלייבל)

לשם כך ב-CLASS שמריץ את הקבצים יצרתי פרופרטי מסוג double שמציין את מספר הזמן בשניות מתי הקובץ הבא יגיע ואבנט:


public event EventHandler _largeWait;
public double _delayTime;


public double _Delay
{
get { return _Delay; }


set
{
_Delay = value;


if (value > 5 && _largeWait != null)
{
_largeWait(this, EventArgs.Empty);
}
}
}

בתוך ה-CLASS איך שהקובץ הבא יגיע בדיליי מסויים שהחלטתי (מעל 5 שניות) אני מכניס ערך למשתנה ה-double:


if (delayTime > 5000)
{
_Delay = delayTime;
_largeWait += (s, e) =>
{
if (_largeWait != null)
{
_largeWait(s, e);
}
};


}

ובת'רד הראשי (אני עובד על Winform):


public void method()
{
ClassName._largeWait += (s, e) =>
{
timer.Tag = s;
timer.Start();
};
}

הבעיה שלי היא שבתוך ה-CLASS בדוגמא השנייה איפה שאני מכניס את הערך למשתנה ה-double זה נכנס לרקורסיה ואין לי מושג למה.

פורסם

כי יש לך רקורסיה ב-get/set של Delay_ - אתה לא משתמש בכלל ב-delayTime.

חוץ מזה, טיפ קטן: הקונבנציה היא קו התחתון למשתנים פרטיים. Delay_ הוא לא פרטי, ולכן לא צריך להיות לו קו תחתון.

פורסם
  • מחבר

מה אני אמור לעשות שם ?

פורסם

שים לב שהגישה ל-Delay_ ניגשת ל-Delay_. זו הרקורסיה שלך. הפתרון: Delay_ לא צריך להשתמש ב-Delay_, אלא באיבר הפרטי של המחלקה שנועד להחזיק את הערך.

פורסם
  • מחבר

אז בעצם הפיתרון הוא ליצור member של ה-class ולהשתמש בו ?

פורסם
שים לב שהגישה ל-Delay_ ניגשת ל-Delay_. זו הרקורסיה שלך. הפתרון: Delay_ לא צריך להשתמש ב-Delay_, אלא באיבר הפרטי של המחלקה שנועד להחזיק את הערך.
שניצל, אני לא זוכר מה בדיוק MS עשו שם, אבל יש משהו ב dotNet 4 שלא מצריך אותך להשתמש בשדות אמיתיים כשאתה משתמש ב get-set.

אני חושב שהתחביר הוא פשוט עם המילה השמורה value במקום _Delay, אבל שווה לבדוק את זה...בכל מקרה הרעיון הוא להחליף את השורה הקיימת ב - קוד טפשי שנמחק

ואני מאמין ההחלפה ב:

get;

תספיק.

פורסם
  • מחבר

אוקיי יצרתע עוד משתנה ועכשיו זה נראה ככה:


public event EventHandler _largeWait;
public double _num;
public double _delayTime;


public double _Delay
{
get { return _Delay; }


set
{
_num = value;


if (value > 5 && _largeWait != null)
{
_largeWait(this, EventArgs.Empty);
}
}
}

ו:


if (delayTime > 3000)
{
_num = delayTime;
_largeWait += (s, e) =>
{
if (_largeWait != null)
{
_largeWait(s, e);
}
};
}

עכשיו התוכנית לא נופלת אבל לפונקציה שנקראת method (בדוגמא האחרונה בהודעה שלי) זה לא נכנס

פורסם

קודם כל, תיקנת רק את הבעיה ב-set, ולא ב-get.

חוץ מזה, לא ברור לי בכלל איפה אתה מפעיל את קטע הקוד השני שכתבת כאן, ומתי אתה ומה הוא בכלל אמור לעשות. מה הלוגיקה שלך כאן?

שניצל, אני לא זוכר מה בדיוק MS עשו שם, אבל יש משהו ב dotNet 4 שלא מצריך אותך להשתמש בשדות אמיתיים כשאתה משתמש ב get-set.

ואני מאמין ההחלפה ב:

get;

תספיק.

זה עובד רק אם המימוש שלך הוא דיפולטי. כלומר, את הקוד הזה:

private double _delay;
public double Delay {
get { return _delay; }
set { _delay = value; }
}

אפשר להחליף בזה:

public double Delay {
get;
set;
}

ברגע שאתה רוצה להוסיף קוד נוסף ל-get/set אז אי אפשר להשתמש במימוש הדיפולטי.

פורסם
  • מחבר

אז אם אני רוצה להוסיף קוד

ל-get/set

מה הפיתרון ?

פורסם

מה זאת אומרת? בדיוק מה שעשית. אני רק הערתי על מה ש-binyamin18 אמר.

פורסם
  • מחבר

תודה רבה הצלחתי

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים