팁 (조언)
소프트웨어 개발이 새로운가요? 바로 전처리기 지시문이 필요하지 않습니다. 먼저 시작 자습서에 초점을 맞추고 프로젝트에 조건부 컴파일 또는 빌드 구성이 필요한 경우 여기로 돌아오세요.
다른 언어로 경험하신 적 있나요? C/C++ 또는 다른 언어의 조건부 컴파일에 익숙한 #ifdef 경우 C# 전처리기 지시문도 비슷하게 작동합니다. 필요한 구문을 앞서 훑어보세요.
C# 전처리기 지시문은 앱을 빌드할 때 다르게 포함, 제외 또는 처리할 코드를 컴파일러에 알려줍니다. 이 지침은 결과 프로그램을 변경할 수 있습니다. 전처리기 지시문은 항상 #로 시작하고, 앞의 공백을 무시하여 독립된 줄에 나타나야 합니다. 지시문 뒤에 후행 주석을 추가할 수 있습니다.
언어 참조는 사용 가능한 모든 지시문을 문서화하지만 세 그룹은 일상적인 사용을 다룹니다.
-
파일 기반 앱 (
#:) - 파일 기반 앱을 구성합니다. -
조건부 컴파일(
#if/#elif/#else/#endif) - 빌드 구성 또는 대상 프레임워크에 따라 코드를 포함하거나 제외합니다. -
경고 표시 안 함(
#pragma warning) - 특정 컴파일러 경고를 표시하지 않거나 복원합니다.
파일 기반 앱 지시문
C# 14부터 파일 기반 앱 은 다음 두 가지 추가 지시문을 사용합니다.
-
#!- Unix(예: )에서 직접 파일을 실행할 수 있도록 하는./Program.cs줄입니다. 이렇게 하려면 파일()에chmod +x <file>권한을 설정해야 합니다. -
#:- 단일 파일 프로그램에 대한 패키지, SDK 설정 및 기타 옵션을 구성하는 빌드 시스템 지시문입니다.
NuGet 패키지를 추가하는 데 사용합니다 #:package . 예를 들어, 다음 파일 기반 앱은 Spectre.Console 패키지를 사용하여 스타일 출력을 렌더링합니다.
#!/usr/bin/env dotnet
#:package Spectre.Console@*
AnsiConsole.MarkupLine("[bold green]Hello[/] from a file-based app!");
정확한 버전을 @ 지정할 수 있거나 최신 버전을 가져오는 데 @* 사용할 수 있습니다. 여러 #:package 지시문을 추가하여 더 많은 패키지를 포함합니다.
#:package Serilog@3.1.1
다른 #: 지시문을 사용하면 프로젝트를 참조하거나 MSBuild 속성을 설정하거나 SDK를 변경할 수 있습니다.
#:project ../SharedLibrary/SharedLibrary.csproj
#:property PublishAot=false
#:sdk Microsoft.NET.Sdk.Web
지시문의 전체 목록은 파일 기반 앱 및 언어 참조를 참조하세요.
조건부 컴파일
기호가 정의되었는지 여부에 따라 코드를 포함하거나 제외하려면 ,#if를 #elif#else 사용합니다#endif. 가장 일반적인 기호는 DEBUG (디버그 빌드에 대해 자동으로 설정) 및 다음과 같은 NET10_0_OR_GREATER대상 프레임워크 기호입니다.
static void ConfigureLogging()
{
#if DEBUG
Console.WriteLine("Debug logging enabled — verbose output active.");
#else
Console.WriteLine("Release logging — errors only.");
#endif
}
빌드 시스템은 디버그 구성에서 빌드할 때 기호를 정의 DEBUG 합니다. 직접 정의할 필요가 없습니다. 대상 프레임워크 기호와 마찬가지로 NET10_0_OR_GREATERNET8_0_OR_GREATER 다중 대상 프로젝트에서 다른 .NET 버전에 맞게 조정되는 코드를 작성할 수 있습니다.
기호를 논리 연산 && 자와 결합할 수 있습니다. (및), || (또는) 및 ! (not):
static void ShowPlatformInfo()
{
#if NET10_0_OR_GREATER
Console.WriteLine("Running on .NET 10 or later.");
#elif NET8_0_OR_GREATER
Console.WriteLine("Running on .NET 8 or 9.");
#else
Console.WriteLine("Running on an older .NET version.");
#endif
}
파일 맨 위에 #define를 사용하여 자신의 기호를 정의하십시오. 프로젝트 파일의 속성을 사용하여 전체 프로젝트에 대한 기호를 DefineConstants 정의할 수도 있습니다.
경고 표시 안 함
#pragma warning disable를 사용하여 특정 컴파일러 경고를 표시하지 않도록 설정하고, #pragma warning restore를 사용하여 다시 표시되도록 설정합니다. 항상 억제 범위를 가능한 한 좁게 설정하십시오.
static void ProcessData()
{
try
{
// Some operation that might fail
var data = File.ReadAllText("config.json");
Console.WriteLine($"Config loaded: {data.Length} characters");
}
#pragma warning disable CS0168 // Variable is declared but never used
catch (FileNotFoundException ex)
#pragma warning restore CS0168
{
// Fall back to defaults — the exception details aren't needed here
Console.WriteLine("Config file not found, using defaults.");
}
}
팁 (조언)
모든 경고를 사용하지 않도록 설정하는 대신 항상 경고 번호(예: CS0168)를 지정합니다. 이 방법은 억제 대상을 유지하고 경고가 표시되지 않는 이유를 분명히 합니다.
관련 콘텐츠
.NET