Câu trả lời dưới đây được viết từ nhiều năm trước và được cập nhật theo thời gian. Kể từ C # 7, bạn có thể sử dụng khớp mẫu:
if (animal is Dog dog)
{
// Use dog here
}
Lưu ý rằng dog
vẫn còn trong phạm vi sau if
tuyên bố, nhưng không được chỉ định chắc chắn.
Không, không có. Nó thành ngữ hơn để viết điều này mặc dù:
Dog dog = animal as Dog;
if (dog != null)
{
// Use dog
}
Cho rằng "như tiếp theo là" hầu như luôn được sử dụng theo cách này, có thể có ý nghĩa hơn khi có một toán tử thực hiện cả hai phần trong một lần. Điều này hiện không có trong C # 6, nhưng có thể là một phần của C # 7, nếu đề xuất khớp mẫu được triển khai.
Vấn đề là bạn không thể khai báo một biến trong phần điều kiện của if
câu lệnh 1 . Cách tiếp cận gần nhất tôi có thể nghĩ là:
// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
...
}
Điều đó thật khó chịu ... (Tôi vừa mới thử nó, và nó vẫn hoạt động. Nhưng làm ơn, làm ơn đừng làm điều này. Ồ, và bạn có thể tuyên bố dog
sử dụng var
tất nhiên.)
Tất nhiên bạn có thể viết một phương thức mở rộng:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
T t = value as T;
if (t != null)
{
action(t);
}
}
Sau đó gọi nó bằng:
animal.AsIf<Dog>(dog => {
// Use dog in here
});
Ngoài ra, bạn có thể kết hợp cả hai:
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);
}
}
Bạn cũng có thể sử dụng phương thức mở rộng mà không có biểu thức lambda theo cách sạch hơn vòng lặp for:
public static IEnumerable<T> AsOrEmpty(this object value)
{
T t = value as T;
if (t != null)
{
yield return t;
}
}
Sau đó:
foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
// use dog
}
1 Bạn có thể gán giá trị trong các if
câu lệnh, mặc dù tôi hiếm khi làm như vậy. Điều đó không giống như khai báo các biến mặc dù. Nó không phải là quá bất thường đối với tôi để làm điều đó trong while
khi đọc các luồng dữ liệu. Ví dụ:
string line;
while ((line = reader.ReadLine()) != null)
{
...
}
Ngày nay, tôi thường thích sử dụng một trình bao bọc cho phép tôi sử dụng foreach (string line in ...)
nhưng tôi xem ở trên là một mẫu khá thành ngữ. Nó thường không hay khi có các tác dụng phụ trong một điều kiện, nhưng các lựa chọn thay thế thường liên quan đến sao chép mã và khi bạn biết mẫu này, thật dễ dàng để có được đúng.
bool
kiện sẽ là gì?