OpCodes.Readonly Alan
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Sonraki dizi adresi işleminin çalışma zamanında hiçbir tür denetimi gerçekleştirmediğini ve sessizliği kısıtlanmış bir yönetilen işaretçi döndürdüğünü belirtir.
public: static initonly System::Reflection::Emit::OpCode Readonly;
public static readonly System.Reflection.Emit.OpCode Readonly;
staticval mutable Readonly : System.Reflection.Emit.OpCode
Public Shared ReadOnly Readonly As OpCode
Alan Değeri
Açıklamalar
Aşağıdaki tabloda yönergenin onaltılık ve Microsoft ara dil (MSIL) derleme biçiminin yanı sıra kısa bir başvuru özeti listelenmiştir:
| Format | Derleme Biçimi | Açıklama |
|---|---|---|
| FE 1E | Sadece okunabilir. | Sonraki dizi adresi işleminin çalışma zamanında hiçbir tür denetimi gerçekleştirmediğini ve kısıtlanmış mutability ile yönetilen bir işaretçi döndürdüğünü belirtin. |
Bu ön ek yalnızca yönergeden ldelema hemen önce görüntülenebilir ve dizilerdeki özel Address yönteme çağrılar. Sonraki işlem üzerindeki etkisi iki kattır:
Çalışma zamanında hiçbir tür denetimi işlemi gerçekleştirilmez. Normalde başvuru türü dizilerinde kullanıldığında ve
ldelemayönergeleri içinstelemörtük tür denetimi olduğunu unutmayın. Değer sınıfları için hiçbir zaman bir çalışma zamanı türü denetimi yoktur, bu durumdareadonlybir no-op.Doğrulayıcı, işlem adresinin sonucunu kısıtlanmış mutability ile yönetilen bir işaretçi olarak ele alır.
Tanımlama türü değerin sessize alınıp alınamayacağını denetlediğinden işaretçinin kısıtlanabilirliğe sahip olduğu söylenir. Hiçbir genel alanı veya değeri güncelleştiren yöntemleri kullanıma sunan değer sınıfları için işaretçi salt okunurdur (bu nedenle ön ekin adı). Özellikle, ilkel türleri temsil eden sınıflar (örneğin, System.Int32) sessizleştiricileri kullanıma sunmaz ve bu nedenle salt okunur olur.
Bu şekilde kısıtlanmış bir yönetilen işaretçi yalnızca aşağıdaki yollarla kullanılabilir:
object, ,ldfld,ldfldastfldveyacallyönergelerininconstrained callvirtparametresi olarak.Yönergenin
pointerldobjveya yönergelerdenldindbirinin parametresi olarak.Yönergenin
sourceparametresicpobjolarak.
, stobj, veya işlemleri ya da initobj yönergeler dahil olmak üzere mkrefanydiğer tüm işlemlere stind izin verilmez.
Ön ekin readonly amacı, bir öğeyi genel koddaki bir diziden getirirken tür denetiminden kaçınmaktır. Örneğin, dizinin arr[i].m() öğe türünün yöntemiyle arrbir arabirime sahip olması kısıtlanmış genel bir tür olduğu ifadesim, aşağıdaki MSIL'ye derlenebilir.
ldloc arr
ldloc i
readonly.
ldelema !0 // Loads the pointer to the object.
… // Load the arguments to the call.
constrained. !0
callvirt m
readonly Ön ek olmadan yönerge, ldelema !0'ın bir başvuru türü olduğu durumda bir tür denetimi gerçekleştirir. Bu tür yalnızca verimsiz olmakla kalmaz, aynı zamanda sembolik olarak da yanlıştır. için tür denetimi ldelema tam bir eşleşmedir ve bu çok güçlüdür. Dizi !0 türünde alt sınıflar tuttuysa, yukarıdaki kod tür denetiminde başarısız olur.
Hem değer türleri hem de başvuru türleri için çalışan bir tanıtıcıya sahip olmak için arr[i] öğenin kendisi yerine dizi öğesinin adresi getirilir ve böylece yönergeye constrained callvirt geçirilebilir.
Genel olarak, dizinin bir başvuru türünün öğelerini tarayarak çalışma zamanı denetimini atlamak güvenli olmaz. Güvenli olmak için, bu işaretçi aracılığıyla dizide hiçbir değişiklik yapılmadığından emin olmak gerekir. Doğrulayıcı kuralları bunu güvence altına alır. Kısıtlı yönetilen işaretçi, örnek yönteminin nesnesi olarak geçirilebilir, bu nedenle değer türleri için salt okunur konuşmaz, ancak değer türleri için tür güvenliği sorunu yoktur.
Aşağıdaki Emit yöntem aşırı yüklemesi, opcode'unu readonly kullanabilir: