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 dili (MSIL) derleme biçiminin yanı sıra kısa bir başvuru özeti listelenmiştir:
Biçimlendir | Derleme Biçimi | Description |
---|---|---|
FE 1E | Readonly. | 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
stelem
yönergeleri içinldelema
örtük bir 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 nedenlereadonly
bu durumda bir çalışma dışıdır.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 kapatılıp kapatılamayacağını denetlediğinden işaretçinin kısıtlanmış değişebilirliğe sahip olduğu söylenir. Hiçbir ortak 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ıdır). Özellikle, ilkel türleri temsil eden sınıflar (örneğin, System.Int32) mutator'ları 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
, ,ldflda
stfld
,call
veyaconstrained callvirt
yönergelerininldfld
parametresi olarak.Yönergenin
pointer
ldobj
veya yönergelerden birininldind
parametresi olarak.Yönergenin
source
parametresicpobj
olarak.
, initobj
, veya işlemleri ya da mkrefany
yönergeler dahil olmak üzere stobj
diğer tüm işlemlere stind
izin verilmiyor.
Ön ekin readonly
amacı, genel koddaki bir diziden öğe getirirken tür denetiminden kaçınmaktır. Örneğin, dizinin arr
öğe türünün yöntemiyle m
bir arabirime sahip olması kısıtlanmış genel bir tür olduğu ifadesiarr[i].m()
, aşağıdaki MSIL'e 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 denetimin verimli olmamasıyla kalmaz, aynı zamanda ad açısından da yanlıştır. için tür denetimi ldelema
, çok güçlü olan tam bir eşleşmedir. 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ündeki öğeleri içerip tutmadığının çalışma zamanı denetimini atlanması güvenli olmaz. Güvenli olmak için, dizide bu işaretçi aracılığıyla hiçbir değişiklik yapılmadığından emin olmak gerekir. Doğrulayıcı kuralları bunu güvence altına alır. Kısıtlanmış yönetilen işaretçi, örnek yönteminin nesnesi olarak geçirilebilir, bu nedenle değer türleri için salt okunur olarak 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: