switch 문의 여러 사례


582

case value:반복해서 진술하지 않고 여러 사례 진술을 겪을 수있는 방법이 있습니까?

나는 이것이 효과가 있다는 것을 안다.

switch (value)
{
   case 1:
   case 2:
   case 3:
      // Do some stuff
      break;
   case 4:
   case 5:
   case 6:
      // Do some different stuff
      break;
   default:
       // Default stuff
      break;
}

하지만 다음과 같이하고 싶습니다.

switch (value)
{
   case 1,2,3:
      // Do something
      break;
   case 4,5,6:
      // Do something
      break;
   default:
      // Do the Default
      break;
}

이 언어가 다른 언어에서 생각하고 있습니까, 아니면 뭔가 빠졌습니까?


IF 문을 사용하지 않는 이유가 있습니까 (int 범위를 확인하는 경우)?
Eric Schoonover

2
네 charlse, 첫 번째 방법은 잘 작동합니다. 나는 여러 곳에서 사용했습니다. 내가 원하는 것보다 더 지저분하지만 유용합니다. 방금 그 정수를 예로 사용했습니다. 실제 데이터는 더 다양했습니다. if (1 || 2 || 3) {...} else if (4 || 5 || 6) {...}도 작동했지만 읽기가 더 어렵습니다.
theo

5
왜 후자가 전자보다 더 더러운 것으로 생각합니까? 후자는 다른 의미 ,와 다른 c 스타일 언어와 공유되지 않는 의미를 추가합니다 . 그것은 훨씬 더 나빠 보일 것입니다.
Jon Hanna

1
루비에서 2 번째 문법을 선택했을 것입니다. 그것이 그 언어로 작동하는 방식입니다 (스위치는 케이스가되고 케이스는 다른 경우가됩니다)
juanpaco

4
중요 사항 . C # v7부터 시작하는 스위치 케이스에서 범위가 지원됩니다. Steve G.의 답변을
RBT

답변:


313

언급 한 두 번째 방법에 대한 C ++ 또는 C #에는 구문이 없습니다.

첫 번째 방법에는 아무런 문제가 없습니다. 그러나 범위가 매우 큰 경우 일련의 if 문을 사용하십시오.


5
부가로 나는에 MSDN에 사용할 수있는 C # 언어 사양에 대한 링크를 추가하고 싶었 msdn.microsoft.com/en-us/vcsharp/aa336809.aspx
리차드 맥과이어에게

사용자는 if (또는 테이블 조회)를 사용하여 입력을 열거 형 세트로 줄이고 열거 형을 켤 수 있습니다.
Harvey

5
아마 VB.net에서 선택
조지 Birbilis

1
VB.net은 C #처럼 떨어지지 않는 것을 제외하고 다양한 사례 진술에 더 좋습니다. 조금, 조금주세요.
Brain2000

나는 이것이 더 이상 정확하지 않다고 생각합니다. stackoverflow.com/questions/20147879/…를 참조하십시오 . 또한이 질문에 대한 답변이 있습니다 stackoverflow.com/a/44848705/1073157
Dan Rayson

700

나는 이것이 이미 대답했다고 생각합니다. 그러나 다음을 수행하여 두 옵션을 구문 적으로 더 나은 방식으로 혼합 할 수 있다고 생각합니다.

switch (value)
{
    case 1: case 2: case 3:          
        // Do Something
        break;
    case 4: case 5: case 6: 
        // Do Something
        break;
    default:
        // Do Something
        break;
}

3
C #의 경우 '스위치'가 소문자 여야합니까?
Austin Harris

3
축소 된 코드는 문제의 첫 번째 예제로 길어집니다. 문제의 방식대로 할 수도 있습니다.
MetalPhoenix 2014

10
왜 귀찮게? Visual Studio 2013의 자동 들여 쓰기는이를 어쨌든 원래 질문의 형식으로 되돌립니다.
Gustav

14
@ T_D 실제로 질문에 대답하기 때문에 지원을 받고 있습니다. OP는 내가 뭔가를 놓치고 있다고 말했다. Carlos는 자신이없는 것에 대해 대답했다. 꽤 잘려서 말린 것 같습니다. 그가 422 공의를 가지고 싫어하지 마십시오.
Mike Devenney

8
@MikeDevenney 그런 다음 정답이 "아니오, c #에는 구문이 없습니다"라는 것을 알기 때문에 질문을 다르게 해석했습니다. 누군가가 "유리에 액체를 부을 수 있습니까?"라고 물으면 답은 "아니오"가 아니라 "거꾸로보고 상상력을 사용하면 액체를 부을 수 있습니다"가 아니라는 것입니다. 일반 구문을 사용하지만 형식을 잘못 지정하면 상상력이 다른 다른 구문처럼 보입니다. 잘만되면 당신은 나의 요점을 얻는다 : : P
T_D

74

이 구문은 Visual Basic Select ... Case Statement 에서 가져온 것입니다 .

Dim number As Integer = 8
Select Case number
    Case 1 To 5
        Debug.WriteLine("Between 1 and 5, inclusive")
        ' The following is the only Case clause that evaluates to True.
    Case 6, 7, 8
        Debug.WriteLine("Between 6 and 8, inclusive")
    Case Is < 1
        Debug.WriteLine("Equal to 9 or 10")
    Case Else
        Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

C #에서는이 구문을 사용할 수 없습니다. 대신 첫 번째 예제의 구문을 사용해야합니다.


49
이것은 내가 기본에 대해 놓친 몇 가지 중 하나입니다.
nickf

10
여기에 비주얼 베이직이 못 생겼으며 c #보다 다재다능한 소수의 디스플레이 중 하나가 있습니다. 이것은 귀중한 예입니다!
bgmCoder

이것은 꽤 괜찮습니다. 왜 이것이 C # 8.0에 추가되지 않았는지 궁금합니다. 꽤 좋을 것입니다.
Sigex

69

C # 7 (Visual Studio 2017 / .NET Framework 4.6.2에서 기본적으로 사용 가능)에서는 이제 switch 문 으로 범위 기반 전환이 가능 하며 OP 문제에 도움이됩니다.

예:

int i = 5;

switch (i)
{
    case int n when (n >= 7):
        Console.WriteLine($"I am 7 or above: {n}");
        break;

    case int n when (n >= 4 && n <= 6 ):
        Console.WriteLine($"I am between 4 and 6: {n}");
        break;

    case int n when (n <= 3):
        Console.WriteLine($"I am 3 or less: {n}");
        break;
}

// Output: I am between 4 and 6: 5

노트:

  • 괄호 ()에 필요하지 않은 when상태이지만, 비교 (들)을 강조하기 위해 본 실시 예에서 사용된다.
  • var대신에 사용될 수도 있습니다 int. 예를 들면 다음과 같습니다 case var n when n >= 7:..

3
C # 7.x 이상을 사용할 수있는 경우이 답변 (패턴 일치)은 일반적으로 다른 방법보다 훨씬 명확하므로 모범 사례가되어야합니다.
UndyingJellyfish

Enum 목록으로 이것을 달성 할 수있는 방법이 있습니까? 열거 형이 int에 매핑되는 곳은 어디입니까?
Sigex

33

다음과 같은 줄 바꿈을 생략 할 수 있습니다.

case 1: case 2: case 3:
   break;

그러나 나는 그 나쁜 스타일을 고려합니다.


20

.NET Framework 3.5의 범위는 다음과 같습니다.

MSDN의 열거 가능 범위

SWITCH 문은 "=="연산자를 사용한다고 말했듯이 "contains"및 IF 문과 함께 사용할 수 있습니다.

예를 들면 다음과 같습니다.

int c = 2;
if(Enumerable.Range(0,10).Contains(c))
    DoThing();
else if(Enumerable.Range(11,20).Contains(c))
    DoAnotherThing();

그러나 나는 우리가 더 재미있을 수 있다고 생각합니다 : 반환 값이 필요하지 않으며이 동작에는 매개 변수가 없으므로 쉽게 동작을 사용할 수 있습니다!

public static void MySwitchWithEnumerable(int switchcase, int startNumber, int endNumber, Action action)
{
    if(Enumerable.Range(startNumber, endNumber).Contains(switchcase))
        action();
}

이 새로운 방법을 사용한 예 :

MySwitchWithEnumerable(c, 0, 10, DoThing);
MySwitchWithEnumerable(c, 10, 20, DoAnotherThing);

값이 아닌 동작을 전달하므로 괄호를 생략해야합니다. 매우 중요합니다. 인수가있는 함수가 필요한 경우 유형을 Action로 변경하십시오 Action<ParameterType>. 반환 값이 필요한 경우을 사용하십시오 Func<ParameterType, ReturnType>.

C # 3.0 에서는 case 매개 변수가 동일하다는 사실을 캡슐화 하기 쉬운 Partial Application 이 없지만 약간의 도우미 메서드 (bit verbose, tho)를 만듭니다.

public static void MySwitchWithEnumerable(int startNumber, int endNumber, Action action){ 
    MySwitchWithEnumerable(3, startNumber, endNumber, action); 
}

다음은 새로운 함수형 반 입문이 이전 명령형 문보다 IMHO가 더 강력하고 우아하다는 예입니다.


3
좋은 선택. 한가지주의 할 점-Enumerable.Range에는 인수 int start와가 int count있습니다. 귀하의 예는 작성된 방식대로 작동하지 않습니다. 두 번째 인수가 마치 것처럼 작성합니다 int end. 예를 들어 - Enumerable.Range(11,20)11 20 20 개 11로 시작하는 번호, 그리고 숫자가 발생할 것이다
가브리엘 맥아담스

Enum으로 작업한다면 왜 그렇지 않습니까? if (Enumerable.Range (MyEnum.A, MyEnum.M) {DoThing ();} else if (Enumerable.Range (MyEnum.N, MyEnum.Z) {DoAnotherThing ();}
David Hollowell-MSFT

4
Enumerable.Range(11,20).Contains(c)에 해당 for(int i = 11; i < 21; ++i){ if (i == c) return true; } return false;하면 그냥 사용하는 동안, 시간이 오래 걸릴 것 넓은 범위이 있다면 ><신속하고 일정 시간이 될 것입니다.
존 한나

개선 : 이 상황에서는 MySwitchWithEnumerable반품 void이 약한 디자인입니다. 이유 : if-else의향을 숨기려는 일련의 독립적 인 진술 로 변환했습니다. 즉, 상호 배타적 인 것 action입니다. 하나만 실행됩니다. 대신 bool본문과 함께을 반환 if (..) { action(); return true; } else return false;하십시오. 그러면 호출 사이트에서 다음과 같은 의도를 보여줍니다 if (MySwitchWithEnumerable(..)) else (MySwitchWithEnumerable(..));. 이것이 바람직하다. 그러나이 간단한 경우에는 더 이상 원래 버전보다 크게 개선되지 않습니다.
ToolmakerSteve

15

완벽한 C # 7 솔루션은 다음과 같습니다.

switch (value)
{
   case var s when new[] { 1,2,3 }.Contains(s):
      // Do something
      break;
   case var s when new[] { 4,5,6 }.Contains(s):
      // Do something
      break;
   default:
      // Do the default
      break;
}

문자열에서도 작동합니다 ...

switch (mystring)
{
   case var s when new[] { "Alpha","Beta","Gamma" }.Contains(s):
      // Do something
      break;
...
}

이것은 각 switch 문으로 배열을 할당한다는 것을 의미합니다. 상수 변수로 사용하면 더 좋지 않을까요?
MaLiN2223

우아하지만 컴파일러가이 시나리오를 최적화하여 반복적 인 호출로 인해 항상 배열 구성의 오버 헤드가 발생하지 않도록하는 것이 좋습니다. 미리 배열을 정의하는 것은 선택 사항이지만 우아함을 많이 제거합니다.
mklement0

11

아래 코드 작동 하지 않습니다 .

case 1 | 3 | 5:
// Not working do something

이를 수행하는 유일한 방법은 다음과 같습니다.

case 1: case 2: case 3:
// Do something
break;

찾고있는 코드는 Visual Basic에서 작동 none하여 switch문장 의 옵션 또는 범위에서 쉽게 범위를 넣을 수 있습니다 .if else 블록 . 매우 극단적 인 시점에서 Visual Basic으로 .dll을 만들고 다시 가져 오는 것이 좋습니다. C # 프로젝트에.

참고 : Visual Basic과 동등한 스위치는 Select Case입니다.


7

다른 옵션은 루틴을 사용하는 것입니다. 사례 1-3이 모두 동일한 논리를 실행하는 경우 해당 논리를 루틴으로 랩핑하고 각 사례에 대해 호출하십시오. 나는 이것이 실제로 사례 진술을 제거하지는 않는다는 것을 알고 있지만, 좋은 스타일을 구현하고 유지 보수를 최소한으로 유지합니다 .....

[편집] 원래 질문과 일치하도록 대체 구현 추가 ... [/ 편집]

switch (x)
{
   case 1:
      DoSomething();
      break;
   case 2:
      DoSomething();
      break;
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}

Alt

switch (x)
{
   case 1:
   case 2:
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}

5

C #에서 스위치의 알려진 덜 알려진 측면 중 하나 는 operator = 에 의존하고 재정의 될 수 있으므로 다음과 같은 것을 가질 수 있다는 것입니다.


string s = foo();

switch (s) {
  case "abc": /*...*/ break;
  case "def": /*...*/ break;
}

4
다른 사람이 코드를 읽으려고하면 나중에 큰 문제가 될 수 있습니다.
Andrew Harry

5

gcc는 C 언어로의 확장을 구현하여 순차적 범위를 지원합니다.

switch (value)
{
   case 1...3:
      //Do Something
      break;
   case 4...6:
      //Do Something
      break;
   default:
      //Do the Default
      break;
}

편집 : 질문에 C # 태그가 나타 났으므로 gcc 답변이 도움이되지 않습니다.


4

C # 7에는 이제 패턴 일치가 있으므로 다음과 같은 작업을 수행 할 수 있습니다.

switch (age)
{
  case 50:
    ageBlock = "the big five-oh";
    break;
  case var testAge when (new List<int>()
      { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 }).Contains(testAge):
    ageBlock = "octogenarian";
    break;
  case var testAge when ((testAge >= 90) & (testAge <= 99)):
    ageBlock = "nonagenarian";
    break;
  case var testAge when (testAge >= 100):
    ageBlock = "centenarian";
    break;
  default:
    ageBlock = "just old";
    break;
}

3

실제로 GOTO 명령도 마음에 들지 않지만 공식 Microsoft 자료에 있으며 허용되는 구문은 다음과 같습니다.

스위치 섹션의 명령문 목록 끝점에 도달 할 수 있으면 컴파일 타임 오류가 발생합니다. 이것을 "통과 금지"규칙이라고합니다. 예

switch (i) {
case 0:
   CaseZero();
   break;
case 1:
   CaseOne();
   break;
default:
   CaseOthers();
   break;
}

스위치 섹션에 도달 가능한 엔드 포인트가 없으므로 유효합니다. C 및 C ++와 달리 스위치 섹션의 실행은 다음 스위치 섹션으로 넘어 질 수 없으며 예제

switch (i) {
case 0:
   CaseZero();
case 1:
   CaseZeroOrOne();
default:
   CaseAny();
}

컴파일 타임 오류가 발생합니다. 스위치 섹션을 실행 한 다음 다른 스위치 섹션을 실행하려면 명시적인 goto case 또는 goto default 문을 사용해야합니다.

switch (i) {
case 0:
   CaseZero();
   goto case 1;
case 1:
   CaseZeroOrOne();
   goto default;
default:
   CaseAny();
   break;
}

스위치 섹션에는 여러 레이블이 허용됩니다. 예

switch (i) {
case 0:
   CaseZero();
   break;
case 1:
   CaseOne();
   break;
case 2:
default:
   CaseTwo();
   break;
}

나는이 특별한 경우에 GOTO를 사용할 수 있다고 믿으며 실제로 넘어 질 수있는 유일한 방법입니다.

출처 : http://msdn.microsoft.com/en-us/library/aa664749%28v=vs.71%29.aspx


실제로 goto는 거의 항상 피할 수 있습니다 (여기서 "끔찍한"고 생각하지는 않지만 특정하고 구조적 인 역할을 채우고 있습니다). 귀하의 예에서, 케이스 본문을 함수로 묶었으므로 (좋은 것) 케이스 0이 될 수 있습니다 CaseZero(); CaseZeroOrOne(); break;. goto필요 하지 않습니다.
ToolmakerSteve

링크가 끊어졌습니다 ( "Visual Studio 2003 Retired Technical documentation" 리디렉션 ).
피터 Mortensen

2

C #에서 가장 많이 사용되지 않는 구문 중 하나를 어떻게 든 더 좋아 보이거나 더 잘 작동시킬 수있는 방법을 찾는 데 많은 작업이 진행된 것 같습니다. 개인적으로 switch 문을 사용할 가치가 거의 없다는 것을 알았습니다. 테스트하려는 데이터와 원하는 최종 결과를 분석하는 것이 좋습니다.

예를 들어 알려진 범위의 값을 빠르게 테스트하여 소수인지 확인한다고 가정 해 봅시다. 코드의 낭비 계산을 피하고 온라인에서 원하는 범위의 소수 목록을 찾을 수 있습니다. 방대한 switch 문을 사용하여 각 값을 알려진 소수와 비교할 수 있습니다.

또는 소수의 배열 맵을 만들어 즉시 결과를 얻을 수 있습니다.

    bool[] Primes = new bool[] {
        false, false, true, true, false, true, false,    
        true, false, false, false, true, false, true,
        false,false,false,true,false,true,false};
    private void button1_Click(object sender, EventArgs e) {
        int Value = Convert.ToInt32(textBox1.Text);
        if ((Value >= 0) && (Value < Primes.Length)) {
            bool IsPrime = Primes[Value];
            textBox2.Text = IsPrime.ToString();
        }
    }

문자열의 문자가 16 진수인지 확인하고 싶을 수도 있습니다. 엉뚱하고 다소 큰 switch 문을 사용할 수 있습니다.

또는 정규식을 사용하여 문자를 테스트하거나 IndexOf 함수를 사용하여 알려진 16 진 문자 문자열에서 문자를 검색 할 수 있습니다.

        private void textBox2_TextChanged(object sender, EventArgs e) {
        try {
            textBox1.Text = ("0123456789ABCDEFGabcdefg".IndexOf(textBox2.Text[0]) >= 0).ToString();
        } catch {
        }
    }

1에서 24 사이의 값에 따라 3 가지 다른 작업 중 하나를 수행한다고 가정하겠습니다. IF 문 집합을 사용하는 것이 좋습니다. 그리고 그것이 너무 복잡해지면 (또는 1에서 90 사이의 값에 따라 5 개의 다른 동작과 같이 숫자가 더 커짐) 열거 형을 사용하여 동작을 정의하고 열거 형의 배열 맵을 만듭니다. 그런 다음이 값을 사용하여 배열 맵에 색인을 작성하고 원하는 조치의 열거를 가져옵니다. 그런 다음 작은 IF 문 집합이나 매우 간단한 switch 문을 사용하여 결과 열거 형 값을 처리하십시오.

또한 값 범위를 동작으로 변환하는 배열 맵의 장점은 코드로 쉽게 변경할 수 있다는 것입니다. 유선 코드를 사용하면 런타임에 동작을 쉽게 변경할 수 없지만 배열 맵을 사용하면 쉽습니다.


람다 식 또는 대의원에 매핑 할 수도 있습니다
Conrad Frix

좋은 지적입니다. 하나의 사소한 의견 : 일반적으로 배열 맵보다 주어진 사례와 일치하는 값 목록을 유지 관리하는 것이 더 쉽다는 것을 알았습니다. 배열 맵의 문제점은 실수하기 쉽다는 것입니다. 예를 들어, true / falses의 소수 배열 맵 대신 소수 목록을 가지고 HashSet에로드하여 조회 성능을 향상시킵니다. 두 개 이상의 사례가 있더라도 일반적으로 하나의 사례를 제외하고 모두 작은 목록이므로 열거 형의 HashSet (약한 경우) 또는 코드의 다른 사례 목록에서 배열 맵을 빌드하십시오.
ToolmakerSteve

1

.NET 4.6.2를 사용하여 대화에 추가하기 위해 다음을 수행 할 수도있었습니다. 나는 코드를 테스트했고 그것은 나를 위해 일했다.

아래와 같이 여러 개의 "OR"문을 수행 할 수도 있습니다.

            switch (value)
            {
                case string a when a.Contains("text1"):
                    // Do Something
                    break;
                case string b when b.Contains("text3") || b.Contains("text4") || b.Contains("text5"):
                    // Do Something else
                    break;
                default:
                    // Or do this by default
                    break;
            }

배열의 값과 일치하는지 확인할 수도 있습니다.

            string[] statuses = { "text3", "text4", "text5"};

            switch (value)
            {
                case string a when a.Contains("text1"):
                    // Do Something
                    break;
                case string b when statuses.Contains(value):                        
                    // Do Something else
                    break;
                default:
                    // Or do this by default
                    break;
            }

이것이 .NET 버전이 아닌 C # 버전에 종속적이지 않습니까?
피터 모텐슨

1

매우 많은 양의 문자열 (또는 다른 유형) 사례가 모두 같은 일을하는 경우 string.Contains 속성과 결합 된 문자열 목록을 사용하는 것이 좋습니다.

따라서 큰 switch 문이 있다면 :

switch (stringValue)
{
    case "cat":
    case "dog":
    case "string3":
    ...
    case "+1000 more string": // Too many string to write a case for all!
        // Do something;
    case "a lonely case"
        // Do something else;
    .
    .
    .
}

다음과 같은 if문장 으로 바꾸고 싶을 수도 있습니다 .

// Define all the similar "case" string in a List
List<string> listString = new List<string>(){ "cat", "dog", "string3", "+1000 more string"};
// Use string.Contains to find what you are looking for
if (listString.Contains(stringValue))
{
    // Do something;
}
else
{
    // Then go back to a switch statement inside the else for the remaining cases if you really need to
}

이것은 모든 문자열 경우에 잘 맞습니다.



-5

이를 위해 goto 문을 사용합니다. 같은 :

    switch(value){
    case 1:
        goto case 3;
    case 2:
        goto case 3;
    case 3:
        DoCase123();
    //This would work too, but I'm not sure if it's slower
    case 4:
        goto case 5;
    case 5:
        goto case 6;
    case 6:
        goto case 7;
    case 7:
        DoCase4567();
    }

7
@scone goto는 절차 적 프로그래밍의 기본 원칙을 깬다 (이 중 c ++와 c #은 아직 뿌리를두고있다. 순수한 OO 언어가 아니다 (신께 감사하다). 절차 적 프로그래밍에는 언어 구조와 메소드 호출 규칙 (런타임 스택의 성장 및 축소 방식)에 따라 결정된 잘 정의 된 논리 흐름이 있습니다. goto 문은 기본적으로 임의의 점프를 허용하여이 흐름을 우회합니다.
samis

1
나는 그것이 좋은 스타일이라고 말하고 있지는 않지만 원래 질문이 요구 한 것을 수행합니다.
스콘

2
아니요, "원래 질문이 요구 한 것을하지 않습니다". 원래 질문에는 코드 가 그대로 작동했습니다 . 그들은 그것을 고칠 필요가 없었습니다. 그리고 그들이하더라도, 이것은 끔찍한 제안입니다. 그 적은 간결하고 사용 goto. 더구나, gotoOP에 명시된 원래 구문이 작동하기 때문에을 완전히 불필요하게 사용하는 것입니다. 문제는 대체 사례를 제공 하는 더 간결한 방법 이 있는지 여부였습니다 . 사람들이 몇 년 전에 답변 한 것처럼 , 여러 사례를 한 줄에 기꺼이 담아 내고 case 1: case 2:자동 스타일 편집기가 허용하는 경우에는 그렇습니다 .
ToolmakerSteve

goto가 잘못되었다고 판단되는 유일한 이유는 일부 사람들이 논리 흐름을 따르기가 어렵다는 것을 알기 때문입니다. .Net MSIL (어셈블 된 객체 코드)은 빠르기 때문에 goto를 사용하지만 .Net 코드를 작성하고 수행하지 않고 성능을 발휘할 수 있다면 사용하지 않는 것이 좋습니다. 따라서 @와 같은 사람들은 화를 내지 않습니다. ToolmakerSteve의 설득력있는 답변입니다.
dynamiclynk

@ wchoward-답장을 더 자세히 읽으십시오. 내 불만은 goto 사용에 관한 것이 아닙니다 . 나는 질문 에 이미 그대로 작동하는 코드를 보여 주었기 때문에 반대 했고,이 대답은 a) 작동 코드를 가져 와서 더 장황하고 덜 구조화 되어 이익을 얻지 못합니다 .b) 질문에 대답하지 않습니다.
ToolmakerSteve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.