我在网上发现了这种模式,除了这种模式之外,我还测试了几种模式,但它们都失败了,但只有成功才会失败。
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.");
}
}
答案 0 :(得分:6)
问题不在正则表达式的模式中,如果正则表达式匹配,则在无限循环中调用setter。只需调用你的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.");
}
}
}
在调试器中逐步执行代码会清楚地显示问题。
答案 1 :(得分: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 :(得分:0)
Vache右边有无限循环,并且在他的例子中正确包含了属性的支持字段。
作为一般规则,特别是如果使用MVVM等模式,您的setter应检查值更改以避免无限循环。 Microsoft文档中使用的示例位于BindableBase。
e.g。
if(_address != value)
_address = value;
或:
if(_address == value)
return;
_address = value;