> ## Documentation Index
> Fetch the complete documentation index at: https://ancplua.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Banned APIs

> Legacy APIs banned by default with modern alternatives.

The SDK enforces modern API usage via [BannedApiAnalyzers](https://github.com/dotnet/roslyn-analyzers/blob/main/src/Microsoft.CodeAnalysis.BannedApiAnalyzers/BannedApiAnalyzers.md).

## DateTime

Use `TimeProvider` for testability.

| Banned                  | Use instead                       |
| ----------------------- | --------------------------------- |
| `DateTime.Now`          | `TimeProvider.System.GetUtcNow()` |
| `DateTime.UtcNow`       | `TimeProvider.System.GetUtcNow()` |
| `DateTimeOffset.Now`    | `TimeProvider.System.GetUtcNow()` |
| `DateTimeOffset.UtcNow` | `TimeProvider.System.GetUtcNow()` |

## Guard Clauses

Use SDK's `Throw` utilities.

| Banned                                        | Use instead                  |
| --------------------------------------------- | ---------------------------- |
| `ArgumentNullException.ThrowIfNull()`         | `Throw.IfNull()`             |
| `ArgumentException.ThrowIfNullOrEmpty()`      | `Throw.IfNullOrEmpty()`      |
| `ArgumentException.ThrowIfNullOrWhiteSpace()` | `Throw.IfNullOrWhiteSpace()` |

## File System Times

Use UTC variants to avoid timezone bugs.

<Expandable title="15 banned methods">
  | Banned                          | Use instead              |
  | ------------------------------- | ------------------------ |
  | `FileSystemInfo.CreationTime`   | `CreationTimeUtc`        |
  | `FileSystemInfo.LastAccessTime` | `LastAccessTimeUtc`      |
  | `FileSystemInfo.LastWriteTime`  | `LastWriteTimeUtc`       |
  | `File.GetCreationTime()`        | `GetCreationTimeUtc()`   |
  | `File.GetLastAccessTime()`      | `GetLastAccessTimeUtc()` |
  | `File.GetLastWriteTime()`       | `GetLastWriteTimeUtc()`  |
  | `File.SetCreationTime()`        | `SetCreationTimeUtc()`   |
  | `File.SetLastAccessTime()`      | `SetLastAccessTimeUtc()` |
  | `File.SetLastWriteTime()`       | `SetLastWriteTimeUtc()`  |
  | `Directory.GetCreationTime()`   | `GetCreationTimeUtc()`   |
  | `Directory.GetLastAccessTime()` | `GetLastAccessTimeUtc()` |
  | `Directory.GetLastWriteTime()`  | `GetLastWriteTimeUtc()`  |
  | `Directory.SetCreationTime()`   | `SetCreationTimeUtc()`   |
  | `Directory.SetLastAccessTime()` | `SetLastAccessTimeUtc()` |
  | `Directory.SetLastWriteTime()`  | `SetLastWriteTimeUtc()`  |
</Expandable>

## String Comparison

Use `Ordinal` for performance; `InvariantCulture` has overhead.

| Banned                                        | Use instead         |
| --------------------------------------------- | ------------------- |
| `StringComparison.InvariantCulture`           | `Ordinal`           |
| `StringComparison.InvariantCultureIgnoreCase` | `OrdinalIgnoreCase` |
| `StringComparer.InvariantCulture`             | `Ordinal`           |
| `StringComparer.InvariantCultureIgnoreCase`   | `OrdinalIgnoreCase` |

## Explicit Parameters

Require explicit intent, no implicit defaults.

| Banned                    | Fix                                     |
| ------------------------- | --------------------------------------- |
| `Enum.TryParse()`         | Add `ignoreCase` parameter              |
| `Math.Round()`            | Add `MidpointRounding` parameter        |
| `MathF.Round()`           | Add `MidpointRounding` parameter        |
| `new CultureInfo(string)` | `CultureInfo.GetCultureInfo()` (cached) |

## Legacy Types

| Banned           | Use instead                   |
| ---------------- | ----------------------------- |
| `Tuple<T1, ...>` | Value tuples: `(string, int)` |

## Opt-out

```xml theme={null}
<PropertyGroup>
  <IncludeDefaultBannedSymbols>false</IncludeDefaultBannedSymbols>
</PropertyGroup>
```
