using System; using System.Text; using System.Timers; using Developpez.Dotnet.Properties; namespace Developpez.Dotnet { /// /// Représente une chaîne de caractères à durée de vie limitée. /// Lorsque la durée de vie expire, la chaîne de caractères est vidée. /// La durée de vie est réinitialisée à chaque ajout de caractère. /// public class TemporaryString { #region Fields /// /// Durée de vie par défaut. /// private static readonly double _DEFAULTLIFETIME = 1000; /// /// Instance du Timer. /// private Timer _Timer; /// /// Chaîne de caractères. /// private StringBuilder _Value; /// /// Evènement levé lorsque la durée de vie a expiré. /// La chaîne de caractère est vidée. /// public event EventHandler Reset; /// /// Evènement levé lorsqu'un caractère a été ajouté à l'instance. /// La durée de vie est réinitialisée. /// public event EventHandler CharAdded; #endregion #region Constructors /// /// Intialise une nouvelle instance de la classe avec la durée de vie par défaut. /// public TemporaryString() : this(TemporaryString._DEFAULTLIFETIME, string.Empty) { } /// /// Intialise une nouvelle instance de la classe avec la durée de vie donnée. /// /// Durée de vie (en millisecondes). public TemporaryString(double lifeTime) : this(lifeTime, string.Empty) { } /// /// Intialise une nouvelle instance de la classe avec la valeur initiale donnée. /// /// Valeur initiale. public TemporaryString(string value) : this(TemporaryString._DEFAULTLIFETIME, value) { } /// /// Intialise une nouvelle instance de la classe /// avec la durée de vie et la valeur initiale données. /// /// Durée de vie. /// Valeur initiale. public TemporaryString(double lifeTime, string value) { if (lifeTime <= 0) throw new ArgumentOutOfRangeException("lifeTime", ExceptionMessages.NegativeLifeTime); if (value == null) throw new ArgumentNullException("value"); this._Timer = new Timer(lifeTime); this._Value = new StringBuilder(value); this._Timer.Elapsed += new ElapsedEventHandler(this._Timer_Elapsed); this._Timer.Enabled = true; this._Timer.AutoReset = false; } #endregion /// /// Elapsed timer event. /// /// Source object. /// Elapsed event arguments. private void _Timer_Elapsed(object sender, ElapsedEventArgs e) { this._Value.Length = 0; // Stop the timer : this._Timer.Stop(); EventHandler handler = Reset; // NOTE : Make a temporary copy of the event to avoid possibility of a race condition // if the last subscriber unsubscribes immediately after the null check and before the event is raised. if (handler != null) handler(this, new EventArgs()); } #region Public methods /// /// Ajoute un caractère à la fin de la chaîne. /// /// Le caractère Unicode à ajouter. public void Append(char value) { this._Value.Append(value); // Reset the timer : this._Timer.Stop(); this._Timer.Start(); EventHandler handler = CharAdded; // NOTE : Make a temporary copy of the event to avoid possibility of a race condition // if the last subscriber unsubscribes immediately after the null check and before the event is raised. if (handler != null) handler(this, new EventArgs()); } /// /// Ajoute un tableau de caractères à la fin de cette instance. /// /// Le tableau de caractères Unicode à ajouter. public void Append(char[] value) { foreach (var c in value) this.Append(c); } /// /// Ajoute une chaîne de caractères à la chaîne courante. /// /// Chaîne de caractères à ajouter à la chaîne courante. public void Append(string value) { foreach (char c in value) this.Append(c); } /// /// Retourne une chaîne de caractères représentant l'instance courante. /// /// Une chaîne de caractères représentant l'instance courante. public override string ToString() { return this._Value.ToString(); } #endregion } }