답변:
그것은 C # 8의 빈 속성 패턴입니다 null
. 모든 값 유형 또는 참조 유형과 일치합니다. Panagiotis Kanavos가 주석에서 언급했듯이 이것은 value is object
오랫동안 C #에 있었던 좋은 이전 검사 와 같습니다 .
일반적으로 속성을 지정하면 일치하거나 일치하지 않습니다. 이 난해한 예는 다음을 보여줍니다.
if (value is { Length: 2 })
{
// matches any object that isn't `null` and has a property set to a length of 2
}
속성 패턴은 switch
표현식 과 같은 경우 다른 패턴과 비교할 때 가장 잘 작동하고 가장 명확 합니다.
s
확실히 null이 아닙니다. is {}
줄임말 is object
이며 문자열 을 객체로 캐스트 할 수 있습니다.
!
, !!
, ?
그리고 ??
전후의 특성은 다른 것을 의미한다. 구문 설탕은 언제 하이 엔드입니까?
value != null
가요?
Daniel의 대답은 옳지 만 빈 속성 패턴이 사용되는 이유 에 대한 컨텍스트를 추가하는 것이 도움 이 될 수 있습니다. 몇 가지 유효성 검사가 필요한이 예제 컨트롤러 방법을 고려하십시오.
public async Task<IActionResult> Update(string id, ...)
{
if (ValidateId(id) is { } invalid)
return invalid;
...
}
위 ValidateId()
의 경우 null 또는의 인스턴스를 반환 할 수 BadObjectRequestResult
있습니다. 전자가 반환되면 유효성 검사가 성공하고의 나머지 본문으로 이동 Update
합니다. 후자가 반환되면 is {}
이다 진정한 (의 예 물론 인스턴스 BadObjectRequestResult
이다가 object
), 및 유효성 검사가 실패합니다.
이 중에서도 변수 이름을 제공하여 invalid
즉시 반환 할 수 있습니다. 그렇지 않으면 약간 더 자세한 코드가 필요합니다.
public async Task<IActionResult> Update(string id, ...)
{
var invalid = ValidateId(id);
if (invalid != null)
return invalid;
...
}
하나는 더 읽기 쉬운 지 다른 쪽은 독자에게 달려 있든, 빈 속성 패턴을 사용할 수있는 한 가지 방법을 제시했습니다.
is object invalid
하지 않아야합니다.is {} invalid
IActionResult
는 (기술적으로 Task<IActionResult>
) 반품 이 필요 하기 때문에이 경우 작동하지 않습니다 . 우리는 당신의 스타일로 갈 경우,이 if
같은 결과를 가지고 있지만 invalid
될 것입니다 object
,이 컴파일되지 않도록.