2016-09-28 92 views
0

基本上我想在字符串達到特定長度時啓動事件。c#字符串長度事件

我有一個靜態字符串

Static String _Info; 

所以,我有我的代表有一個整數作爲參數!

public Delegate void ReachLengthHandler(int Length); 

和我的事件:

public event ReachLengthHandler ReachLengthEvent; 

以及方法保持addingSome信息到字符串:

public void AddInfo() 
    { 
    new Thread(() => 
    { 
    while(true) 
    _Info += ""; //Basically add the inputs of the user here ! 
    if (_Info.Length > 500) 
     { 
     if (ReachLengthEvent != null) 
      ReachLengthEvent(_Info.Length); 
     } 
    }).Start(); 

    } 

你覺得它做的這個活動以正確的方式或有更清潔的方式?

編輯: 我想這個事件,因爲我要保存這個字符串在一個數據庫表中的行,所以我不希望擴展行的可能大小!

+2

我投票關閉這一問題作爲題外話,因爲它屬於在代碼審查 –

+1

你有什麼與此事件呢?你能舉一個例子嗎? –

+1

爲什麼不將'_Info'封裝在屬性中,並且在更新字符串時讓它觸發一個真實的事件。 –

回答

1

正如一些評論所指出的,你可能試圖解決XY Problem的實例 - 但假設你沒有,你是不是在一個面向對象的方式接近的東西,開始與封裝。

這可能是一個開始,FWIW:

public class MaxLengthEventArgs : EventArgs 
{ 
    public MaxLengthEventArgs(string value) 
    { 
     LastAppended = value; 
    } 

    public string LastAppended { get; private set; } 
} 

public delegate void MaxLengthEventHandler(object sender, MaxLengthEventArgs args); 

public class StringAccumulator 
{ 
    protected StringBuilder Builder { get; private set; } 

    public StringAccumulator(int maxLength) 
    { 
     if (maxLength < 0) 
     { 
      throw new ArgumentOutOfRangeException("maxLength", "must be positive"); 
     } 
     Builder = new StringBuilder(); 
     MaxLength = maxLength; 
    } 

    public StringAccumulator Append(string value) 
    { 
     if (!string.IsNullOrEmpty(value)) 
     { 
      var sofar = value.Length + Builder.Length; 
      if (sofar <= MaxLength) 
      { 
       Builder.Append(value); 
       if ((OnMaxLength != null) && (sofar == MaxLength)) 
       { 
        OnMaxLength(this, new MaxLengthEventArgs(value)); 
       } 
      } 
      else 
      { 
       throw new InvalidOperationException("overflow"); 
      } 
     } 
     return this; 
    } 

    public override string ToString() 
    { 
     return Builder.ToString(); 
    } 

    public int MaxLength { get; private set; } 

    public event MaxLengthEventHandler OnMaxLength; 
} 

class Program 
{ 
    static void Test(object sender, MaxLengthEventArgs args) 
    { 
     var acc = (StringAccumulator)sender; 
     Console.WriteLine(@"max length ({0}) reached with ""{1}"" : ""{2}""", acc.MaxLength, args.LastAppended, acc.ToString()); 
    } 

    public static void Main(string[] args) 
    { 
     var acc = new StringAccumulator(10); 
     try 
     { 
      acc.OnMaxLength += Test; 
      acc.Append("abc"); 
      acc.Append("def"); 
      acc.Append("ghij"); 
      Console.WriteLine(); 
      acc.Append("ouch..."); 
      Console.WriteLine("(I won't show)"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 
     Console.ReadKey(); 
    } 
} 

另外,請記住,在.NET中的字符串是不可改變的。

使用字符串連接積累他們,你在

_Info += "" 

沒有...是不會很好地擴展(性能明智)。

「HTH,

+0

那麼,如果代碼必須讀取確切的長度並拋出異常,否則使用'string'作爲參數沒有多大意義。它應該是一個'char'來代替。 **至少,那裏有一些很好的技巧**。 – Phil1970

+0

@ Phil1970也許我在這個快速拍攝中錯過了/失敗,但是不是,當且僅當最後一次調用Append使累積字符串的最終長度完全等於MaxLength或者拋出如果最後一次調用會導致溢出(因此伴隨測試,順便說一句),這是一個例外。對於OP的興趣而言。這個問題,我的主要觀點是封裝。當然,我們可以將公共接口擴展爲追加char-by-char或int-by-int等,就像在底層StringBuilder的重載中所做的那樣。 – YSharp

0

通常事件處理程序與特定簽名一起使用。

public delegate void ReachLengthHandler(object sender, EventArgs args); 
class Program 
{ 
    public event ReachLengthHandler handler; 

    private const int Threshhold = 500; 

    public string Info 
    { 
     set 
     { 
      if (value.Length > Threshhold) 
      { 
       this.OnReachLength(null); 
      } 
     } 
    } 

    public void OnReachLength(EventArgs args) 
    { 
     this.handler?.Invoke(this, args); 
    } 
} 
+1

不要發送事件的空參數,因爲它與預期相反。如果沒有參數,則使用'EventArgs.Empty'。 – Phil1970