我在网络上找到了这种模式,除了这种模式外,我还测试了几次,它们都失败了,但它们仅在成功中失败。
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.");
}
}
问题不在正则表达式的模式中,这是,如果将正则匹配您在无限循环中称为固定器。您只需致电您的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.");
}
}
}
在调试器中逐步浏览您的代码会清楚地显示出该问题。
在此行中,您可以调用设置方法并输入无限循环:
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.");
}
}
vache与无限循环合适,并正确地包含了该属性的背景字段。
作为一般规则,尤其是在使用MVVM之类的模式时,您的设定器应检查一个值更改以避免无限循环。Microsoft文档中使用的一个示例是在BindableBase中。
,例如
if(_address != value)
_address = value;
或:
if(_address == value)
return;
_address = value;