2014-02-07 32 views
0

我在網絡上發現了這種模式,除了這種模式外,我還測試了幾個,它們都失敗了,但它們只在成功時失敗。正則表達式不起作用。獲取堆棧溢出錯誤

public string Address { 
     get 
     { 
      return this.Address; 
     } 
     private set 
     { 
      string emailPattern = @"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*" 
           + "@" 
           + @"((([\-\w]+\.)+[a-zA-Z]{2,4}))" 
           + "|" 
           + @"(([0-9]{1,3}\.){3}[0-9]{1,3}))\z"; 

      if (Regex.IsMatch(value, emailPattern)) 
      { 
       this.Address = value; 
      } 
      else 
      { 
       throw new Exception(value + " doesn't seem to be a valid email address."); 
      } 
     } 

回答

6

的問題不是在正則表達式的模式,那就是,如果正則表達式匹配,你打電話給你的二傳手在一個無限循環。您只需調用您的getter即可獲得相同的問題。使用背景字段來避免這種情況。

private string _address; 
public string Address 
{ 
    get 
    { 
     return _address; 
    } 
    private set 
    { 
     string emailPattern = @"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*" 
          + "@" 
          + @"((([\-\w]+\.)+[a-zA-Z]{2,4}))" 
          + "|" 
          + @"(([0-9]{1,3}\.){3}[0-9]{1,3}))\z"; 

     if (Regex.IsMatch(value, emailPattern)) 
     { 
      _address = value; 
     } 
     else 
     { 
      throw new Exception(value + " doesn't seem to be a valid email address."); 
     } 
    } 
} 

在調試器中單步執行代碼會清楚地顯示出問題。

0

在這一行有啊再調用set方法進入一個無限循環:

this.Address = value; 

你需要在一個私人屬性設置:

private string _address = string.empty 

public string Address { 
     get 
     { 
      return _address; 
     } 
     private set 
     { 
      string emailPattern = @"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*" 
           + "@" 
           + @"((([\-\w]+\.)+[a-zA-Z]{2,4}))" 
           + "|" 
           + @"(([0-9]{1,3}\.){3}[0-9]{1,3}))\z"; 

      if (Regex.IsMatch(value, emailPattern)) 
      { 
       _address = value; 
      } 
      else 
      { 
       throw new Exception(value + " doesn't seem to be a valid email address."); 
      } 
     } 
+2

吸氣將挑起'StackOverflowException'以及! – Vache

+0

是的,它真的,對不起,我只看着二傳手 –

0

瓦謝權與無限循環和在他的例子中正確地包含了該屬性的後臺字段。

作爲一般規則,特別是如果使用諸如MVVM之類的模式,您的設置者應檢查值更改以避免無限循環。 Microsoft文檔中使用的示例是BindableBase

例如

if(_address != value) 
    _address = value; 

或:

if(_address == value) 
    return; 
_address = value; 
+0

這確實是一個很好的練習,但是由於他沒有後場,而且他的價值從未真正設置過,所以它不會在這裏拯救他。 – Vache

+0

正確的先生!我已經相應地更新了我的答案。 – HockeyJ