You can look at the difference via a simple example:
void Main()
{
var f = F.Foo;
var b = F.Bar;
}
public class F
{
public const string Foo = "F";
public static readonly string Bar = "B";
}
Will yield the following IL:
IL_0001: ldstr "F"
IL_0006: stloc.0 // f
IL_0007: ldsfld UserQuery+F.Bar
IL_000C: stloc.1 // b
IL_000D: ret
The const value of Foo is "baked" at compile to the call site, that is why you see a ldstr of the value "F" itself, while a static field emits a ldsfld, which loads the field at runtime, and then assigned it to the local variable b.
Making a field both static and const is a compile time error. Both const and static are defined on the type, not the instance. More so, a static field can be set at run-time, while const must be known at compile-time.
If you want to set a bunch of constant values that won't change at run time, going with a const should be fine. But you have to remember, that if you change a const value, it isn't enough to compile the source holding the consts, you'll have to re-compile anyone who consumes that const as well.