OpCodes.Readonly Alan

Tanım

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:

  1. Ç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çin ldelema ö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 nedenle readonly bu durumda bir çalışma dışıdır.

  2. 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, , ldfldastfld, callveyaconstrained callvirt yönergelerinin ldfldparametresi olarak.

  • Yönergenin pointerldobj veya yönergelerden birinin ldind parametresi olarak.

  • Yönergenin source parametresi cpobj olarak.

, initobj, veya işlemleri ya da mkrefany yönergeler dahil olmak üzere stobjdiğ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 mbir 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:

Şunlara uygulanır