public static bool IsLeapYear(int year)
{
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
The first boolean expression uses the remainder operator to check if the year is evenly divided by 4.
- If the year is not evenly divisible by
4, then the chain will "short circuit" due to the next operator being a logical AND (&&), and will returnfalse. - If the year is evenly divisible by
4, then the year is checked to not be evenly divisible by100. - If the year is not evenly divisible by
100, then the expression istrueand the chain will "short-circuit" to returntrue, since the next operator is a logical OR (||). - If the year is evenly divisible by
100, then the expression isfalse, and the returned value from the chain will be if the year is evenly divisible by400.
| year | year % 4 == 0 | year % 100 != 0 | year % 400 == 0 | is leap year |
|---|---|---|---|---|
| 2020 | true | true | not evaluated | true |
| 2019 | false | not evaluated | not evaluated | false |
| 2000 | true | false | true | true |
| 1900 | true | false | false | false |
The chain of boolean expressions is efficient, as it proceeds from testing the most likely to least likely conditions.
Shortening
When the body of a function is a single expression, the function can be implemented as an expression-bodied member, like so
public static bool IsLeapYear(int year) =>
year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
or
public static bool IsLeapYear(int year) => year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
4th Sep 2024
·
Found it useful?