이 5가지 C# 지침(선임 개발자가 밝힌)은 코딩 스타일을 변경합니다.

코딩 방법을 배우는 것은 어려울 수 있지만 경험이 많은 개발자의 조언을 따르면 코딩의 기본 사항을 빠르고 쉽게 마스터하는 데 도움이 될 수 있습니다. 선임 개발자가 공개한 이 5가지 C# 지침은 코드 작성 방식을 바꿀 것입니다. 이 기사는 오늘 프로처럼 코딩을 시작하는 방법을 보여줍니다!

이 지침은 혼자서 엄청난$140M in its latest round of investment을 올린 거대한 기술 회사인 의 선임 소프트웨어 엔지니어가 제공합니다!


LINQ '쿼리' 구문에서 임시 변수 정의



이 첫 번째 지침인 Milan은 LINQ "쿼리"구문에서 임시 변수를 정의할 가능성이 있다고 설명합니다.

그가 개발자들과 이야기해 왔지만 그들 중 많은 사람들이 이 기능을 전혀 몰랐기 때문에 궁금합니다. 그리고 이러한 이유로 그는 그것을 설명하기로 결정했습니다.

"Using the let keyword, you can define a temporary value in your LINQ queries. You can use it for further calculation or return this value as a result."



from user in _dbContext.Set<User>().AsNoTracking()
where user.Id == userId
let name = $"{user.FirstName} {user.LastName}"
let hasFirstName = !string.IsNullOrEmpty(user.FirstName)
let hasLastName = !string.IsNullOrEmpty(user.LastName)
select new
{
    user.Id,
    Name = name,
    ProfileComplete = hasFirstName && hasLastName
}


그가 말하는 또 다른 요점은 EF Core(Entity) 쿼리를 작성할 때 사용된 절( let )도 적절한 SQL로 변환된다는 것입니다.

또한 이를 테스트하고 생성된 SQL을 검사할 것을 권장합니다.

"Not everything is supported like with in-memory LINQ."



📚여기에서 그의 설명을 읽을 수 있습니다.


값을 계산하는 Switch 문



그는 또한 C#으로 깔끔한 코드를 작성할 때 모범 사례를 공유하기로 결정했습니다. 개인적으로 이런 경우를 꽤 많이 봐왔기 때문에 꼭 한번 보시길 추천드립니다.

Milan은 C# 8부터 switch 식을 사용하여 switch 명령어를 대체할 수 있다고 말합니다.

나쁜 방법:

switch (DateTime.Now.DayOfWeek)
{
    case DayOfWeek.Monday:
    case DayOfWeek.Tuesday:
    case DayOfWeek.Wednesday:
    case DayOfWeek.Thursday:
    case DayOfWeek.Friday:
        return "Not Weekend";
    case DayOfWeek.Saturday:
    case DayOfWeek.Sunday:
        return "Weekend";
    default:
        throw new ArgumentOutOfRangeException();
}


좋은 방법:

DateTime.Now.DayOfWeek switch
{
    not (DayOfWeek.Saturday or DayOfWeek.Sunday) => "Not Weekend",
    DayOfWeek.Saturday or DayOfWeek.Sunday => "Weekend",
    _ => throw new ArgumentOutOfRangeException()
}


또한 그는 개선의 여지가 있다고 말합니다.

"Also, beginning with C# 9, we can add logical pattern matching operators into the mix for even more flexibility."



📚여기에서 그의 설명을 읽을 수 있습니다.


Lazy-thread-safe-Singleton 구현 만들기



여기에서 Lazy-thread-safe-Singleton 구현을 만드는 방법에 대한 질문이 발생합니다.

Milan에 따르면 이를 수행하는 다양한 방법이 있지만 스레드로부터 안전한 구현을 위해 동시 액세스를 방지하기 위해 항상 잠금에 의존해야 합니다.

Milan은 이 방법을 사용하려면 잠금 장치에 대한 상당히 고급 지식이 필요하다고 경고합니다.

"However, we can utilize the Lazy class to "lazily" instantiate an instance of a class."



public sealed class Singleton
{
    private static readonly Lazy<Singleton> LazyInstance =
    new Lazy<Singleton>(() => new Singleton());
    private Singleton()
    { 
    }     
    public static Singleton Instance => LazyInstance.Value;
}


마지막으로 그는 동시성이 중요하지 않다고 말합니다.

"Lazy is also thread-safe by default, so you don't have to "think" about concurrency."



📚여기에서 그의 설명을 읽을 수 있습니다.


로컬 함수 생성 및 사용



로컬 함수가 무엇인지 모르는 사람들을 위해 로컬 함수를 사용하면 이전에 정의된 메서드의 본문 내부에 메서드를 선언할 수 있습니다. 이 기능은 C# 7에 추가되었으며 Milan은 이를 명확하게 설명하기로 결정했습니다.

"Local functions are only visible inside the scope of their containing member. Usually, you would define and use them inside of another function."



public IEnumerable<string> CapitalizeFirstLetter(IEnumerable<string> enumerable)
{
    if (!enumerable.Any())
    {
        throw new ArgumentException("The sequence is empty.");
    }
    return enumerable.Select(CapitalizeFirstLetterLocal);
    static string CapitalizeFirstLetterLocal(string input) =>
       input switch
       {
            null or "" => throw new ArgumentNullException(nameof(input)),
            _ => string.Concat(input[0].ToString().ToUpper(), input.AsSpan(1))
       };
}


Milan이 추가한 또 다른 사항은 로컬 함수가 인스턴스 멤버에 액세스할 수 없는 한 정적일 가능성도 있다는 것입니다.

"It is interesting to combine local functions with iterators.
Iterators are lazy be design. But you may want to perform an argument check eagerly, which is where local functions can be helpful."



📚여기에서 그의 설명을 읽을 수 있습니다.


반복자 블록과 로컬 함수 결합



로컬 기능을 계속합시다! 이번에 Milan은 열렬한 인수 확인을 하면서 반복자 블록으로 게으른 평가를 달성할 가능성이 있음을 공유하고 싶었습니다.

"Notice that the local function uses the "yield return" statement, which executes when enumeration happens. If the iterator block is inside of "ReadFileLineByLine" directly, you will get the exception only when enumerating the results."



public IEnumerable<string> ReadFileLineByLine(string fileName)
{    
    if (string.IsNullOrEmpty(fileName))
    {
        throw new ArgumentNullException(nameof(fileName));
    }
return ReadFileLineByLineImpl();
IEnumerable<string> ReadFileLineByLineImpl()
    {
        foreach (var line in File.ReadAllLines(fileName))
        {
            yield return line;
        }
    }
}


이 모범 사례를 통해 예외가 발생하기 전에 감지할 수 있습니다.

"The exception will throw as soon as "ReadFileLineByLine" is invoked."



📚여기에서 그의 설명을 읽을 수 있습니다.


이러한 지침을 공유하고 훌륭하고 훌륭한 C# 개발자 커뮤니티에 가치를 제공한 Milan Jovanović에게 다시 한 번 감사드립니다. 당신이 그들을 좋아한다면 나는 그가 항상 활동하고 많은 귀중한 C# 콘텐츠를 업로드하기 때문에 당신을 추천할 것입니다!

좋은 웹페이지 즐겨찾기