다음을 통해 공유


최상위 문(statement) - Main 메서드가 없는 프로그램

팁 (조언)

소프트웨어 개발이 새로운가요? 먼저 시작하기 자습서부터 시작하세요. 이러한 자습서에서는 최상위 문을 사용하므로 기본 사항에 대해 이미 잘 알고 있습니다.

메서드의 대안을 찾고 계십니까 Main? 명시적 메서드 접근 방법에 대해서는 Main 메서드 진입점을 참조하세요.

새 앱에는 최상위 문을 사용하세요. 최상위 문을 사용하여 파일의 루트에 직접 실행 코드를 작성할 수 있습니다.

다음은 전체 C# 프로그램인 Program.cs 파일입니다.

Console.WriteLine("Hello World!");

dotnet new console을 사용하여 새 콘솔 앱을 만들 때 기본적으로 최상위 문을 사용합니다. 소규모 유틸리티 및 Azure Functions에서 전체 애플리케이션에 이르기까지 모든 크기의 프로그램에 적합합니다. 명시적 Main 메서드를 사용하는 기존 애플리케이션이 있는 경우 변환할 필요가 없습니다. 두 스타일 모두 동등한 코드로 컴파일됩니다.

다음 섹션에서는 최상위 문으로 수행할 수 있는 작업과 수행할 수 없는 작업에 대한 규칙을 설명합니다.

진입점 규칙

애플리케이션에는 진입점이 하나만 있어야 합니다. 프로젝트에는 최상위 문이 있는 파일이 하나만 있을 수 있지만 최상위 문이 없는 소스 코드 파일 수는 있을 수 있습니다. 메서드를 명시적으로 작성할 Main 수 있지만 진입점으로 작동할 수는 없습니다. 최상위 문이 있는 프로젝트에서는 하나 이상의 -main 메서드가 있더라도 Main 컴파일러 옵션을 사용하여 진입점을 선택할 수 없습니다.

컴파일러는 최상위 문이 있는 프로젝트에서 프로그램 진입점으로 작용하는 메서드를 생성합니다. 메서드의 서명은 최상위 문에 await 키워드 또는 return 문이 포함되어 있는지 여부에 따라 달라집니다. 다음 표에서는 편의를 위해 테이블의 메서드 이름을 Main 사용하여 메서드 서명의 모양을 보여줍니다.

최상위 코드에는 다음이 포함됩니다. 암시적 Main 서명
awaitreturn static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
await 또는 return 없음 static void Main(string[] args)

C# 14부터 프로그램은 단일 파일에 프로그램이 포함된 파일 기반 앱일 수 있습니다. 명령을 사용하거나 Unix의 파일 이름(예dotnet <file.cs>: )을 직접 사용하여 파일 ./file.cs 실행합니다. 후자는 지시문을 첫 번째 줄로 포함하고 #!/usr/bin/env dotnet 실행 권한(chmod +x <file>)을 설정해야 합니다.

using 지시문

최상위 문을 using 포함하는 단일 파일의 경우 다음 예제와 같이 지시문이 해당 파일에서 먼저 와야 합니다.

using System.Text;

StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");

foreach (var arg in args)
{
    builder.AppendLine($"Argument={arg}");
}

Console.WriteLine(builder.ToString());

return 0;

네임스페이스 및 형식 정의

최상위 문장은 암시적으로 전역 네임스페이스에 속합니다. 최상위 문이 있는 파일에는 네임스페이스 및 형식 정의도 포함될 수 있지만 최상위 문 뒤에 와야 합니다. 예시:

MyClass.TestMethod();
MyNamespace.MyClass.MyMethod();

public class MyClass
{
    public static void TestMethod()
    {
        Console.WriteLine("Hello World!");
    }
}

namespace MyNamespace
{
    class MyClass
    {
        public static void MyMethod()
        {
            Console.WriteLine("Hello World from MyNamespace.MyClass.MyMethod!");
        }
    }
}

args

최상위 수준의 문은 앱이 시작할 때 전달된 명령줄 인수에 액세스하기 위해 args 변수를 참조할 수 있습니다. args 변수는 null된 적이 없지만 명령줄 인수가 제공되지 않았을 경우 Length는 0입니다. 예시:

if (args.Length > 0)
{
    foreach (var arg in args)
    {
        Console.WriteLine($"Argument={arg}");
    }
}
else
{
    Console.WriteLine("No arguments");
}

await 및 종료 코드

비동기 메서드를 호출하는 데 사용합니다 await . 최상위 코드에 await포함된 경우 컴파일러는 을 반환 Task하는 진입점을 생성합니다. 런타임은 Task를 모니터링하여 모든 비동기 작업이 완료될 때까지 프로세스를 유지합니다. 예시:

Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");

애플리케이션이 종료되면 종료 코드를 반환하려면 문을 사용합니다 return . 컴파일러는 코드에 Task<int>await가 둘 다 포함되어 있을 때 return을(를) 반환하고, int만 포함되어 있을 때 return을(를) 반환하는 진입점을 생성합니다. 예시:

string? s = Console.ReadLine();

int returnValue = int.Parse(s ?? "-1");
return returnValue;