최상의 답변
구문 설탕 또는 구문 설탕은 언어에서 제공하는 시각적 또는 논리적 “바로 가기”입니다. 일반적인 상황에서 작성해야하는 코드의 양을 줄입니다.
예를 들어, 조건에 의존하는 값으로 변수를 설정할 때 “설탕”이 적은 더 간단한 언어로 할 수 있습니다. 이 :
int a;
if(SomeFunction() == 2)
a = 4;
else
a = 9;
이렇게 간단한 작업을 수행하기에는 약간의 차이가 있습니다. 더 간단한 언어로 개발자는 종종 “Inline If”함수를 만들어이 논리를 더 간결한 것으로 래핑합니다.
public T Iif
{
if(condition) return ifTrue;
return ifFalse;
}
...
//usage
int a = Iif(SomeFunction() == 2, 4, 9);
이제 실제 사용이 훨씬 더 간결합니다. C #을 포함한 많은 최신 언어는 “삼항 조건 연산자”의 형태로 언어 사양에 다음과 같은 연산을 직접 통합합니다.
int a = SomeFunction() == 2 ? 4 : 9;
이 연산자는 조건부 연산을 위해 언어로 제공되는 “구문 설탕”입니다.
이제이 조건부 변수 설정의 일반적인 하위 사례는 값을 생성하는 수단에 대한 첫 번째 선택입니다. 변수가 null로 평가되도록 설정하려면 대체 수단을 사용해야합니다. 예 :
MyClass theClass = GetMyClass();
if(theClass == null)
theClass = FailSafeMyClassGetter();
나쁘지는 않지만 개선 할 수 있습니다.
MyClass theClass = GetMyClass() ?? FailSafeMyClassGetter();
“??” 연산자는 “null-coalescing operator”로 알려져 있으며 기본적으로 null이 아닌 왼쪽에서 오른쪽으로 읽은 첫 번째 값을 생성합니다.
최근에 C #이 얻은 또 다른 하나는 “auto-property”입니다. 간단히 말해서 C #에는 “속성”이라는 것이 있습니다. 단순한 필드보다 더 복잡한 유효성 검사 또는 계산 논리를 수행 할 수 있지만 GetX () 및 SetX를 사용하는 대신 멤버가 필드 인 것처럼 액세스 할 수있는 개체의 “데이터 멤버”를 나타내는 코드 블록 쌍 () 메서드 호출을 사용하므로 “데이터에 액세스 할 때와 작업을 수행 할 때 코드를 쉽게 구분할 수 있습니다. 일관성 및 유지 관리를 위해 공개적으로 볼 수있는 데이터 멤버를 구현할 때 필드 대신 속성을 사용하는 것이 C #의 모범 사례”입니다. . 그러나 10 개 중 9 번은 속성이 개인 필드 변수를 “래핑”하기 만하므로 모범 사례에 따라 간단한 데이터 값에 대한 속성 구현은 다음과 같습니다.
private int \_myIntProperty;
public int MyIntProperty
{
get
{
return \_myIntProperty;
}
set
{
\_myIntProperty = value;
}
}
보기 흉하고 매우 반복적이며 실제로 필요한 것보다 훨씬 더 많은 코드 라인이 있습니다. 이러한 간단한 경우에는 필드를 사용하는 것이 좋습니다. 나중에 속성이 실제로 필요하다고 결정한 경우 코드베이스에 미칠 수있는 유혹과 해로운 영향을 줄이기 위해 C #의 디자이너는 C # 3.0에 구문 설탕을 포함했습니다. 사양 :
public int MyIntProperty { get; set; }
이 속성 선언은 위 선언과 동일하게 취급되지만 훨씬 빠르고 쉽게 작성할 수 있습니다. 이것들로 가득 찬 클래스는 예전 방식보다 “유지 관리도 훨씬 쉽습니다.
이것은 C #에서 사용할 수있는”구문 설탕 “의 몇 가지 예일뿐입니다. 기타 :
* 변수 유형 추론-var someInt = 5;
-컴파일러가 초기 할당에서 선언 된 지역 변수의 유형을 결정할 수 있으므로 명시 적으로 지정합니다 (유형을 변경해야하는 경우 변경).
* yield return
-많은 .NET 프로그래밍에는 개체 컬렉션이 포함됩니다. 동일한 각 요소에 대해 반복적 인 작업을 수행합니다. foreach
<와 같은 다양한 내장 루프를 허용하는 IEnumerable
인터페이스를 구현하는 것은 상당히 복잡한 프로세스였습니다. / div>가 작동하려면 컬렉션 반복을 처리하기 위해 IEnumerator
를 구현 한 두 번째 클래스 전체가 필요합니다. yield return
키워드는 다음을 극적으로 단순화했습니다. 반복기 논리 자체를 컬렉션의 자체 GetEnumerator () 메서드 내에서 정의 할 수 있습니다.
* async
/ await
-마찬가지로 점점 더 많은 프로그래밍 작업을 “비동기 적으로”실행해야합니다. 응용 프로그램의 다른 “스레드”로 작업하므로 프로그램 작업을 최신 PC의 여러 프로세서로 분할 할 수 있으며 응용 프로그램의 사용자 인터페이스는 UI를 다시 그리고 수행하라는 OS의 요청에 “응답”을 유지합니다. 다른 시각적 작업. 스레딩의 개념은 이해하기 어렵지 않지만 C # 4.0까지는 기본적으로 메서드를 둘로 분할해야했습니다. 한 메서드는 비동기 작업을 시작한 다음 백그라운드 스레드가 작업을 완료하면 두 번째 메서드가 호출됩니다. 더 이상은 없어; 이 두 가지 새로운 키워드를 사용하면 비동기 작업을 수행하는 함수를 매우 동 기적으로 보이는 방식으로 정의 할 수 있으며 컴파일러는 코드를 빌드 할 때 백그라운드에서 메서드 분할을 수행합니다.
Answer
구문 설탕에 대한 공식적인 정의가 없습니다. 이것은 모호한 개념입니다.
가장 널리 사용되는 정의의 구문 설탕은 컴파일러에 의해 즉시 더 원시적이고 번거로운 형식으로 변환되는 추가 구문이지만 프로그래머가 특정 공통 명령을 표현할 때 “더 달콤한”경험을 할 수 있습니다.
이 정의의 문제점은 “추가”구문이 그다지 의미있는 설명이 아니라는 것입니다. 예를 들어 Haskell 언어 보고서는 더 간단한 구문으로 번역하여 특정 구문 요소 (do-blocks 및 목록 이해)를 명시 적으로 정의합니다. 이것은 구문 설탕의 매우 명확한 사례이며, 프로그램 작성을 용이하게하기 위해서만 존재하며, 프로그램을 기호 트리로 변환하는 데있어 심오한 의미가 아닙니다.
다른 경우에는, 예를 들어 Python의 데코레이터는 코드없이 동등한 코드를 작성하는 방법으로 설명되는 경우가 많지만 내가 아는 한 명시 적으로 말하지 않았습니다. 데코레이터를 중간 표현으로 직접 컴파일하지 말고 이러한 방식으로 미리 번역해야합니다.” 파이썬의 일부 구현은 그렇게하기로 선택할 수 있지만 다른 구현은 중간 표현의 기능으로 데코레이터를 추가했을 수 있습니다.