아래 답변은 몇 년 전에 작성되었으며 시간이 지남에 따라 업데이트되었습니다. C # 7부터 패턴 일치를 사용할 수 있습니다.
if (animal is Dog dog)
{
// Use dog here
}
주의 dog
애프터 범위에 여전히 if
문,하지만 확실히 할당되지 않습니다.
아닙니다. 이것을 작성하는 것이 관용적입니다.
Dog dog = animal as Dog;
if (dog != null)
{
// Use dog
}
"다음에 if"가 거의 항상 이런 식으로 사용 된다는 것을 감안할 때 , 한 번에 두 부분을 모두 수행하는 연산자가있는 것이 더 합리적 일 수 있습니다. 패턴 일치 제안 이 구현 된 경우 현재 C # 6에는 없지만 C # 7에 포함될 수 있습니다 .
문제는 명령문 1 의 조건 부분에서 변수를 선언 할 수 없다는 것 입니다. 내가 생각할 수있는 가장 가까운 접근법은 다음과 같습니다.if
// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
...
}
그것은 단지 불쾌합니다 ... (방금 시도했지만 작동합니다. 그러나 제발, 제발, 제발하지 마십시오. 아, 물론 dog
사용하여 선언 할 수 있습니다 var
.)
물론 확장 방법을 작성할 수 있습니다.
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
T t = value as T;
if (t != null)
{
action(t);
}
}
그런 다음 전화하십시오.
animal.AsIf<Dog>(dog => {
// Use dog in here
});
또는 두 가지를 결합 할 수 있습니다.
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
// EVIL EVIL EVIL
for (var t = value as T; t != null; t = null)
{
action(t);
}
}
for 루프보다 깔끔한 방식으로 람다식이없는 확장 메서드를 사용할 수도 있습니다.
public static IEnumerable<T> AsOrEmpty(this object value)
{
T t = value as T;
if (t != null)
{
yield return t;
}
}
그때:
foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
// use dog
}
1 거의 사용하지 않지만 명령문에 값을 지정할 수 있습니다 if
. 그러나 변수 선언과는 다릅니다. 데이터 스트림을 읽을 때 가끔 그렇게하는 것은 끔찍한 일 이 아닙니다 while
. 예를 들면 다음과 같습니다.
string line;
while ((line = reader.ReadLine()) != null)
{
...
}
요즘에는 일반적으로 래퍼를 사용하여 사용할 수 foreach (string line in ...)
있지만 위의 내용을 꽤 관용적 인 패턴으로 생각합니다. 그것은이다 일반적으로 조건 내에서 부작용을 가지고 좋은 아니지만, 대안은 일반적으로 코드 중복을 포함, 당신은이 패턴을 알고있을 때 그것을 바로 얻을 쉽습니다.
bool
조건이 될?