为什么字段初始值设定项中的 func<> 是静态的?
Why is func<> in field initializer static?
在实现 IDataErrorInfo 时,以下代码可以毫无问题地编译和运行:
public string Error
{
get { return null; }
}
public string this[string columnName]
{
get
{
switch (columnName)
{
case "MemberId": return validate(MemberId, 0, RegexLibrary.NonEmptyRegex);
case "PolicyType": return validate(PolicyType, 1, RegexLibrary.NonEmptyRegex);
case "EffectiveDateFrom": return validate(EffectiveDateFrom, 2, RegexLibrary.DateRegex);
case "EffectiveDateTo": return validate(EffectiveDateTo, 3, RegexLibrary.DateRegex);
case "Phone": return validate(Phone, 4, RegexLibrary.PhoneRegex);
case "CompanyName": return validate(CompanyName, 5, RegexLibrary.NonEmptyRegex);
}
// string.Empty is no error.
return string.Empty;
}
}
public string validate(string column, int position, string regex)
{
string invalid = string.Format("{0} is invalid.", column);
if (column == null)
{
SetErrorStatus(1, position);
return invalid;
}
Match match = Regex.Match(column, regex);
if (!match.Success)
{
SetErrorStatus(1, position);
return invalid;
}
SetErrorStatus(0, position);
return string.Empty;
}
但是,如果 validate(...) 定义为这样的函数:
Func<string, int, string, string> validate = (column, position, regex) =>
{
string invalid = string.Format("{0} is invalid.", column);
if (column == null)
{
SetErrorStatus(1, position);
return invalid;
}
Match match = Regex.Match(column, regex);
if (!match.Success)
{
SetErrorStatus(1, position);
return invalid;
}
SetErrorStatus(0, position);
return string.Empty;
};
编译器将 validate(...) 函数定义为静态的。为什么?
TIA
在那种情况下,validate
不是方法而是字段。该字段是一个实例成员。分配给该字段的对象是引用匿名方法的委托。该方法没有理由成为实例成员,因为它没有对当前实例进行任何引用。因此,您有一个引用静态方法的实例字段。
编译器在调用 class 而不是实例时生成 static
方法这一事实是编译器的 实现细节 ,它可能会发生变化,实际上 已经随着 Roslyn 的发布而改变。您可以看到 并看到现在,编译器甚至为非捕获委托生成显示 class。
虽然我不明白这与在 class 中将任何内容声明为 static
有什么关系。
在实现 IDataErrorInfo 时,以下代码可以毫无问题地编译和运行:
public string Error
{
get { return null; }
}
public string this[string columnName]
{
get
{
switch (columnName)
{
case "MemberId": return validate(MemberId, 0, RegexLibrary.NonEmptyRegex);
case "PolicyType": return validate(PolicyType, 1, RegexLibrary.NonEmptyRegex);
case "EffectiveDateFrom": return validate(EffectiveDateFrom, 2, RegexLibrary.DateRegex);
case "EffectiveDateTo": return validate(EffectiveDateTo, 3, RegexLibrary.DateRegex);
case "Phone": return validate(Phone, 4, RegexLibrary.PhoneRegex);
case "CompanyName": return validate(CompanyName, 5, RegexLibrary.NonEmptyRegex);
}
// string.Empty is no error.
return string.Empty;
}
}
public string validate(string column, int position, string regex)
{
string invalid = string.Format("{0} is invalid.", column);
if (column == null)
{
SetErrorStatus(1, position);
return invalid;
}
Match match = Regex.Match(column, regex);
if (!match.Success)
{
SetErrorStatus(1, position);
return invalid;
}
SetErrorStatus(0, position);
return string.Empty;
}
但是,如果 validate(...) 定义为这样的函数:
Func<string, int, string, string> validate = (column, position, regex) =>
{
string invalid = string.Format("{0} is invalid.", column);
if (column == null)
{
SetErrorStatus(1, position);
return invalid;
}
Match match = Regex.Match(column, regex);
if (!match.Success)
{
SetErrorStatus(1, position);
return invalid;
}
SetErrorStatus(0, position);
return string.Empty;
};
编译器将 validate(...) 函数定义为静态的。为什么?
TIA
在那种情况下,validate
不是方法而是字段。该字段是一个实例成员。分配给该字段的对象是引用匿名方法的委托。该方法没有理由成为实例成员,因为它没有对当前实例进行任何引用。因此,您有一个引用静态方法的实例字段。
编译器在调用 class 而不是实例时生成 static
方法这一事实是编译器的 实现细节 ,它可能会发生变化,实际上 已经随着 Roslyn 的发布而改变。您可以看到
虽然我不明白这与在 class 中将任何内容声明为 static
有什么关系。