이상한 반환 구문 문
나는 이것이 이상하게 들릴 수 있지만 인터넷 에서이 구문을 검색하는 방법도 모르고 정확히 무엇을 의미하는지 확실하지 않습니다.
그래서 몇 가지 MoreLINQ 코드를 살펴본 후이 방법을 발견했습니다.
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
return _(); IEnumerable<TSource> _()
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
}
}
이 이상한 반환 진술은 무엇입니까? return _();
?
이것은 로컬 기능을 지원하는 C # 7.0입니다 ....
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
if (source == null) throw new
ArgumentNullException(nameof(source));
if (keySelector == null) throw
new ArgumentNullException(nameof(keySelector));
// This is basically executing _LocalFunction()
return _LocalFunction();
// This is a new inline method,
// return within this is only within scope of
// this method
IEnumerable<TSource> _LocalFunction()
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
}
}
현재 C # Func<T>
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
if (source == null) throw new
ArgumentNullException(nameof(source));
if (keySelector == null) throw
new ArgumentNullException(nameof(keySelector));
Func<IEnumerable<TSource>> func = () => {
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
};
// This is basically executing func
return func();
}
트릭은 _ ()가 사용 된 후에 선언된다는 것입니다.
로컬 기능의 실제 사용
위의 예는 인라인 메서드를 사용할 수있는 방법에 대한 데모 일 뿐이지 만 메서드를 한 번만 호출하려는 경우에는 쓸모가 없습니다.
But in example above, as mentioned in comments by Phoshi and Luaan, there is an advantage of using local function. Since function with yield return will not be executed unless someone iterates it, in this case method outside local function will be executed and parameter validation will be performed even if no one will iterate the value.
Many times we have repeated code in method, lets look at this example..
public void ValidateCustomer(Customer customer){
if( string.IsNullOrEmpty( customer.FirstName )){
string error = "Firstname cannot be empty";
customer.ValidationErrors.Add(error);
ErrorLogger.Log(error);
throw new ValidationError(error);
}
if( string.IsNullOrEmpty( customer.LastName )){
string error = "Lastname cannot be empty";
customer.ValidationErrors.Add(error);
ErrorLogger.Log(error);
throw new ValidationError(error);
}
... on and on...
}
I could optimize this with...
public void ValidateCustomer(Customer customer){
void _validate(string value, string error){
if(!string.IsNullOrWhitespace(value)){
// i can easily reference customer here
customer.ValidationErrors.Add(error);
ErrorLogger.Log(error);
throw new ValidationError(error);
}
}
_validate(customer.FirstName, "Firstname cannot be empty");
_validate(customer.LastName, "Lastname cannot be empty");
... on and on...
}
Consider the simpler example
void Main()
{
Console.WriteLine(Foo()); // Prints 5
}
public static int Foo()
{
return _();
// declare the body of _()
int _()
{
return 5;
}
}
_()
is a local function declared within the method containing the return statement.
참고URL : https://stackoverflow.com/questions/45323628/odd-return-syntax-statement
'development' 카테고리의 다른 글
ASP.NET MVC Html.DropDownList SelectedValue (0) | 2020.08.16 |
---|---|
인터페이스가 다른 인터페이스를 구현할 수없는 이유는 무엇입니까? (0) | 2020.08.16 |
UTF-8“가변 너비 인코딩”은 어떻게 작동합니까? (0) | 2020.08.16 |
setRetainInstance (true) 추가 이해 (0) | 2020.08.16 |
Java에는 C #의 ref 및 out 키워드와 같은 것이 있습니까? (0) | 2020.08.16 |