C# 11: 파일 로컬 타입 (file access modifier)
C#에 어떤 Type (class, struct, enum 등)에 대한 접근 권한을 제한하기 위해 public, internal, protected, private 등의 access modifier를 사용한다. C# 11 에서 'file' 이라는 새로운 access modifier 키워드가 등장하였다. 'file' access modifier는 한 파일 안에서만 접근할 수 있는 접근 제한자로서, 한 파일 내에서만 사용되는 로컬 타입을 정의할 때 유용하다. 특히, 이 기능은 (Source generator를 통해) 소스 코드를 자동 생성할 때 파일 범위로 타입을 제한해서 다른 파일의 타입과의 타입 충돌을 방지할 때 유용할 수 있다.
예를 들어, 아래 예제처럼 file 접근 제한자를 사용한 클래스 LocalData는 그 파일 내에서만 접근이 허용되고, 다른 파일에서는 그 클래스의 존재를 알지 못한다. 이 말은 다시말해 다른 파일에서 (public 으로) LocalData 클래스를 정의해도 서로 충돌(type name collision)이 발생하지 않는다는 의미이다.
예를 들어, 아래 예제처럼 file 접근 제한자를 사용한 클래스 LocalData는 그 파일 내에서만 접근이 허용되고, 다른 파일에서는 그 클래스의 존재를 알지 못한다. 이 말은 다시말해 다른 파일에서 (public 으로) LocalData 클래스를 정의해도 서로 충돌(type name collision)이 발생하지 않는다는 의미이다.
예제
// 파일1.cs : file access modifier 사용.
// 로컬 파일에서만 사용
file class LocalData
{
public int Id { get; set; }
public string Data { get; set; }
public override string ToString()
{
return $"{Id}: {Data}";
}
}
public class PublicData
{
public string GetSample()
{
var localData = new LocalData { Id = 1, Data = "Test" };
string data = localData.ToString();
return data;
}
}
// 파일2.cs : 동일 클래스명 LocalData에 대해 public 사용.
// 컴파일에 문제 없음
public class LocalData
{
public int Id { get; set; }
public string Data { get; set; }
}
// 로컬 파일에서만 사용
file class LocalData
{
public int Id { get; set; }
public string Data { get; set; }
public override string ToString()
{
return $"{Id}: {Data}";
}
}
public class PublicData
{
public string GetSample()
{
var localData = new LocalData { Id = 1, Data = "Test" };
string data = localData.ToString();
return data;
}
}
// 파일2.cs : 동일 클래스명 LocalData에 대해 public 사용.
// 컴파일에 문제 없음
public class LocalData
{
public int Id { get; set; }
public string Data { get; set; }
}