C # 메서드 명명 규칙 : ToSomething 대 AsSomething


82

비즈니스 로직 객체에 대한 확장 메서드를 작성하면서 변환 메서드의 이름을 바꾸는 문제에 도달했습니다. someObject.ToAnotherObject()널리 사용되는 object.ToString().

그러나 예를 들어 LINQ는 두 변형을 혼합하여 차이점을 찾을 수 없습니다. ToDictionary(), ToList(), AsParallel(), AsQueryable(), ...

이 두 가지 명명 규칙의 차이점은 무엇이며 내 클래스에 사용할지 여부를 결정하려면 무엇을 알아야합니까?

답변:


91

ToDictionary그리고 ToList접두어 To가 반드시 원래의 수집 또는 속성의 구조 정체성을 보존하지 않기 때문에.

  • 를로 변환하면 완전히 새로운 구조의 컬렉션 List<T>이 Dictionary<K, V>생성됩니다.
  • 변형 HashSet<T>(A) 내로하면 List<T>세트의 고유성 속성을 제거한다.

접두사가 붙은 메서드 As는 이러한 작업 을 수행하지 않습니다. 단순히 원본 컬렉션 의 대체 보기 를 제공합니다 . 그들은 그것을 풍부하게합니다.


41
그래서, 사과에 나는 부를 수 .AsCleanApple()난 단지 그것을 세척 할 필요가 있기 때문에, 그리고 .ToFruitSalad()내 칼이 apple‽의 구조 변경 때문에
— Physikbuddha

3
@Physikbuddha 기본적으로 그렇습니다.
— MKII

38
@Physikbuddha는 같은 날 것으로 보인다 AsCleanApple것이다 변경 사과에 대해 뭔가. 더 나은 비유는 다음과 같습니다AsFruit
— dcastro

4
.AsCleanAppleSource()사과의 원천이었던 것을 깨끗한 사과의 원천으로 바꾸는 것입니다. 필요한 경우 세척 단계를 추가하지만 아마도 아무것도하지 않을 수도 있습니다. 사과는 이미 깨끗하다고 ​​알려져 있습니다. .ToPunnet()그 소스에 액세스하여 사과의 punnet을 제공합니다.
— Jon Hanna

2
이것은 엄격하게 사실이 아니지만 일반적으로 "AsXXX ()"를 캐스트로, "ToXXX ()"를 변환으로 생각할 수 있습니다.
— nateirvin

26

Linq에서 ToXXX메서드는 모두 쿼리를 실행하고 결과에서 새 개체를 만드는 반면 AsXXX메서드는 어떤 방식 으로든 다른 새 쿼리를 생성합니다. 그것은 동일한 개체 수 있지만 (다른 인터페이스를 통해 액세스 할 수 있습니다 AsEnumerable()이 수행) 또는 새로운 객체가 될 수 달라져 기능 (다른 방법 그들은 단지 주어진 객체를 반환 할 경우 몇 가지 검사를 볼 수 있지만 예를 들어,이 작업을 수행 할 AsQueryable()것입니다 이미 source구현되어 있으면 반환 IQueryable<T>하거나 EnumerableQuery<TElement>그렇지 않으면 새로 만듭니다 ).


that alters how the functionality- how불필요하거나 진술의 다음 부분이 있어야합니까?
— Kapol

@Kapol 아니요, 작성과 입력을 동시에하여 발생한 오타입니다.
— Jon Hanna

나는 이것이 정답이라고 생각합니다. 즉, 원래 인스턴스의 활성 대 정적 투영입니다. ToXXX()원본과 관계없이 데이터를 투영합니다. AsXXX()원본과 적극적인 관계를 유지합니다 (적어도 우리가 논의중인 Enumerable / Queryable 예제에서).
— Tim Medora

ToXXX execute the query및에 대한 +1 AsXXX produce a new query. 내가 LINQ에서 읽은 것에서 옳게 들리며 MSDN은 ToXXX 에 대해 확인하는 것처럼 보이지만 모든 AsXXX 메서드가 지연된 실행 인지 여부에 대한 소스가 있는지 궁금합니다 .
— brichins

1
@brichins는 우리 중 누구라도 AsXXXLinq에 내재 된 것 (예 : Entity Framework AsParallel에서 AsNoTracking제공하는 PLinq에 의해 추가 된 것 , 등등). 확실히 linq의 핵심은 Queryable및 로 정의 된 것이며이 Enumerable두 클래스는 모두 해당 규칙을 따릅니다. 대부분의 추가 사항은 "모두"가 정확할 수있는 정도까지 적용되지만 항상 정확하다고 보장하기에는 너무 개방적입니다 (단절이 디자인 결함이라고 생각하지만).
— Jon Hanna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.