프로그래밍 학습/C#
volatile 한정자와 접근 한정자(access modifier) 확인하기
cocodv1
2023. 12. 26. 13:08
- System.Reflection : 메타데이터를 검사하여 관리 코드에서 어셈블리, 모듈, 멤버, 매개 변수 및 기타 엔터티에 대한 정보를 검색하는 형식이 포함 된 네임스페이스입니다.
- 메타데이터: 데이터에 대한 데이터, 데이터에 관한 구조화된 데이터라는 의미입니다.
volatile 한정자
- 해당 변수가 컴파일러 최적화에 의해 재배치되지 않도록 지정, 해당 변수를 항상 메모리에서 읽거나 쓰도록 보장
접근 한정자 확인하기
class Program
{
private int number = 3;
public string word = "Test";
protected double primeNumber = 0.1;
public static void Main(string[] args)
{
Program pg = new Program();
// 접근 한정자를 확인
FieldInfo fieldInfo = pg.GetType().GetField("number", BindingFlags.NonPublic | BindingFlags.Instance);
DisplayAccessModifier(fieldInfo);
fieldInfo = pg.GetType().GetField("word", BindingFlags.NonPublic | BindingFlags.Instance);
DisplayAccessModifier(fieldInfo);
fieldInfo = pg.GetType().GetField("primeNumber", BindingFlags.NonPublic | BindingFlags.Instance);
DisplayAccessModifier(fieldInfo);
}
static void DisplayAccessModifier(FieldInfo fieldInfo)
{
if (fieldInfo != null)
{
Console.WriteLine($"변수명: {fieldInfo.Name}");
Console.WriteLine($"접근 한정자: {GetAccessModifier(fieldInfo)}");
Console.WriteLine();
}
else
{
Console.WriteLine("정보를 찾을 수 없습니다.");
}
}
static string GetAccessModifier(FieldInfo fieldInfo)
{
if (fieldInfo.IsPrivate)
{
return "private";
}
else if (fieldInfo.IsPublic)
{
return "public";
}
else if (fieldInfo.IsFamily)
{
return "protected";
}
else
{
return "unknown";
}
}
}
⁉️ 위 코드에서 public은 구분하지 못하는 문제가 발생하는데
이유는 BindingFlags에 Public이 따로 존재하기 때문이다.
public string word를 확인하는 코드에 BindingFlags.Public만 추가하면 간단히 해결된다.
fieldInfo = pg.GetType().GetField("word", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
DisplayAccessModifier(fieldInfo);
