Attualmente sto affrontando un nuovo problema con gli operatori. Usando il seguente codice, voglio fare un output che sarebbe lo stesso di quando si usa la coppia if ... else
in C#.Riflessione C#: se ... altro?
var method = new DynamicMethod("dummy", null, Type.EmptyTypes);
var g = method.GetILGenerator();
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Call, typeof(String).GetMethod("op_Equality", new Type[]{typeof(string), typeof(string)}));
g.Emit(OpCodes.Ldc_I4, 0);
g.Emit(OpCodes.Ceq);
g.Emit(OpCodes.Brtrue_S,);
var action = (Action)method.CreateDelegate(typeof(Action));
action();
Console.Read();
Le mie domande sono:
- Come posso ottenere l'indirizzo di un'istruzione di passare come parametro per i codici operativi di filiale?
- C'è qualche differenza tra il
BR
eBR_S
,Brtrue
eBrtrue_S
,Brfalse
eBrfalse_S
e le istruzioni simili?
Grazie.
Come altri hanno già menzionato, le versioni "_S" delle istruzioni derivano un offset di 1 byte anziché di 4 byte. Se sai che il tuo ramo sarà sempre all'interno dell'intervallo disponibile (da -128 byte a +127 byte), otterrai un codice più compatto usandoli, tuttavia se proverai a utilizzarli per passare a un'etichetta con un offset esterno questo intervallo, verrà generata un'eccezione durante la creazione del delegato. – Iridium