TIM Corey 1 : 문자열에 올바른 초기화 방법은?

앞으로 가끔씩 TimCorey 아저씨의 강좌를 한개씩 스터디 해볼까 합니다.
단 제가 실력이 미천해서 제대로 이해 못했을수도 있고 비정기적이고
언제 그만둘지도 모릅니다 ^^;

오늘 주제
“문자열을 올바르게 초기화하려면 어떻게 해야 할까요? null, string.Empty, 빈 따옴표 또는 기본값이어야 할까요? 이 주제에 대해 꽤 많은 혼란이 있으므로 다양한 옵션을 살펴 보겠습니다.”

출처 : https://youtu.be/sh-1rNVfvhM

string? test1 = null;
string? test2 = default;

string? test3 = string.Empty;
string? test4 = "";

Console.WriteLine(test1);
Console.WriteLine(test2);
Console.WriteLine(test3);
Console.WriteLine(test4);

문자열의 초기화 방법은 현재 기준으로 이렇게 4가지 방법이 있다고 합니다.
실행결과입니다.
image

당연히 빈문자열이 나오지만
null 체크를 해보면

Console.WriteLine(test1==null?"Null":"Value");
Console.WriteLine(test2 == null ? "Null" : "Value");
Console.WriteLine(test3 == null ? "Null" : "Value");
Console.WriteLine(test4 == null ? "Null" : "Value");

image

이렇게
null,default 는 null 이고
string.empty, “” 는 값이 들어있습니다.

짧은 tip 같은 강좌라 뭐가 옮다 틀리다는 언급하지 않았지만
timcorey 님은 “” 선호한다고 하십니다.
강의 마지막에도 시청자들에게 선호하는 초기화 방법을 물어보셨습니다.

6개의 좋아요

저는 string.Empty 를 선호합니다.

string? 으로 선언하지 않아도 되고, static 이라 생성 단계도 생략되고, 무엇보다 GC가 호출되지 않아서입니다.

2개의 좋아요

강좌 감사합니다! ^^

저는 ""을 선호하는 편입니다. 물론 Empty 패턴은 다른 곳에서도 왕왕 사용되므로 내가 만들어서 사용할 때는 IHaveEmpty 라는 인터페이스를 정의한 후 Empty를 사용하기도 합니다.

var mypet = new MyPet();
mypet.Print();

mypet.Animal = new Animal(AnimalKind.Dog, "CoCo");
mypet.Print();



class MyPet
{
    public Animal Animal { get; set; } = Animal.Empty;

    public void Print()
    {
        if (Animal.Kind is AnimalKind.Unselected)
            Console.WriteLine("No Pets.");
        else
            Console.WriteLine($"I have a {Animal.Kind} named '{Animal.Name}'.");
    }
}


interface IHaveEmpty<T>
{
    static abstract T Empty { get; }
}

record Animal : IHaveEmpty<Animal>
{
    public static Animal Empty { get; } = new Animal(AnimalKind.Unselected, "");

    public AnimalKind Kind { get; }
    public string Name { get; }

    public Animal(AnimalKind kind, string name)
    {
        Kind = kind;
        Name = name;
    }
}

enum AnimalKind
{
    Unselected,

    Dog,
    Cat,
    Pig
}

| 출력

No Pets.
I have a Dog named 'CoCo'.
1개의 좋아요

string.empty나 ""는 기능상의 차이가 아니라 개발자의 의도를 표현하는 방법이라고 봐야겠죠.
즉, 3자 입장에서 코드 중간에서 string.empty와 ""를 보게됐을때의 혼란을 줄이기 위한 방법이죠.

test3 = string.Empty; // 개발자가 빈 값을 설정했구나
test4 = “”; // 빈 값을 설정한거야? 아니면 깜빡하고 값을 빼먹은거야?

5개의 좋아요

저는 if문을 어떻게 쓸것인가에 초점을 두는 편이라…ㅎㅎ

  1. str == “”
  2. string.IsNullOrWhiteSpace(str)

둘 중에 간편한걸 고민하다가 언제부턴가 Extension 하나 만들어서

if(str.IsEmpty())
이렇게 쓰기로 쇼부봤습니다^^;

2개의 좋아요