Recently had a discussion with a fellow dev regarding the difference between typeof(T).Name and nameof(T).
It is a lot more performant to use nameof keyword if you are just trying to get the string name of type as opposed to typeof(T).Name.
Let's look at an following example.
Given a simple C# console app as follows:
| 
1 
2 
3 
4 
5 
6 
7 
8 | 
classProgram 
{ 
    staticvoidMain(string[] args) 
    { 
        Console.WriteLine(typeof(Program).Name); 
        Console.WriteLine(nameof(Program)); 
    } 
} | 
 
 
 
 
The compiler generates the following IL:
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 | 
.method privatehidebysig staticvoidMain(string[] args) cil managed 
{ 
  .entrypoint 
   
  .maxstack  8 
  IL_0000:  nop 
  IL_0001:  ldtoken    typeof_nameof.Program 
  IL_0006:  call       class[mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle) 
  IL_000b:  callvirt   instance string[mscorlib]System.Reflection.MemberInfo::get_Name() 
  IL_0010:  call       void[mscorlib]System.Console::WriteLine(string) 
  IL_0015:  nop 
  IL_0016:  ldstr      "Program" 
  IL_001b:  call       void[mscorlib]System.Console::WriteLine(string) 
  IL_0020:  nop 
  IL_0021:  ret 
}  | 
 
 
 
 
Notice nameof is turned into a string "Program"? while typeof(Program).Name generated code to execute get_Name(). typeof is definitely a runtime evaluation.
Naturally string literal requires almost zero calculation at runtime therefore it is a more performant one.  In conclusion, we should favor it over typeof(T).Name