Aracılığıyla paylaş


OpCodes.Constrained Alan

Tanım

Sanal yöntem çağrısının yapıldığı türü kısıtlar.

public: static initonly System::Reflection::Emit::OpCode Constrained;
public static readonly System.Reflection.Emit.OpCode Constrained;
 staticval mutable Constrained : System.Reflection.Emit.OpCode
Public Shared ReadOnly Constrained 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çim Derleme Biçimi Tarif
FE 16 <T> Kısıtlı. thisType türü Tkısıtlanmış bir tür üzerinde sanal yöntem çağırın.

constrained ön ekine yalnızca callvirt yönergesinde izin verilir.

MSIL yığınının bu noktadaki durumu aşağıdaki gibi olmalıdır:

  1. ptryönetilen bir işaretçi yığına gönderilir. ptr türü, thisTypeiçin yönetilen bir işaretçi (&) olmalıdır. Bunun, thisTypebaşvurusu bekleyen, eklenmemiş bir callvirt yönergesinden farklı olduğunu unutmayın.

  2. argN aracılığıyla arg1 yöntem bağımsız değişkenleri, tıpkı eklenmemiş bir callvirt yönergesinde olduğu gibi yığına gönderilir.

constrained ön eki, callvirt yönergelerin thisType değer türünden veya başvuru türünden bağımsız olarak tekdüzen bir şekilde yapılmasına izin verecek şekilde tasarlanmıştır.

bir callvirtmethod yönergesi constrainedthisTypetarafından ön eklendiğinde yönerge aşağıdaki gibi yürütülür:

  • thisType bir başvuru türüyse (değer türünün aksine) ptr başvurulmaz ve methodcallvirt 'bu' işaretçisi olarak geçirilir.

  • thisType bir değer türüyse ve thisTypemethod uygularsa, ptrthisTypetarafından method uygulanması için callmethod yönergesine 'bu' işaretçisi olarak değiştirilmeden geçirilir.

  • thisType bir değer türüyse ve thisTypemethod uygulamazsa ptr başvurulmaz, kutulanır ve callvirtmethod yönergesine 'bu' işaretçisi olarak geçirilir.

Bu son durum yalnızca Object, ValueTypeveya Enum üzerinde method tanımlandığında ve thisTypetarafından geçersiz kılınmadığında oluşabilir. Bu durumda, kutulama özgün nesnenin bir kopyasının yapılmasına neden olur. Ancak, Object, ValueTypeve Enum yöntemlerinin hiçbiri nesnenin durumunu değiştirmediğinden, bu olgu algılanamaz.

constrained ön eki, genel kod oluşturan IL oluşturucularını destekler. Normalde callvirt yönergesi değer türlerinde geçerli değildir. Bunun yerine, IL derleyicilerinin ptr türüne ve çağrılan yönteme bağlı olarak derleme zamanında yukarıda özetlenen 'bu' dönüştürmeyi etkili bir şekilde gerçekleştirmesi gerekir. Ancak, ptr derleme zamanında bilinmeyen genel bir tür olduğunda, derleme zamanında bu dönüşümü yapmak mümkün değildir.

constrained opcode, IL derleyicilerinin bir sanal işleve ptr değer türünden veya başvuru türünden bağımsız olarak tekdüzen bir şekilde çağrı yapmasını sağlar. thisType genel bir tür değişkeni olduğu durum için tasarlanmış olsa da, constrained ön eki genel olmayan türler için de çalışır ve değer türleri ile başvuru türleri arasındaki ayrımı gizleyen dillerde sanal çağrı oluşturmanın karmaşıklığını azaltabilir.

constrained ön ekinin kullanılması, değer türleriyle ilgili olası sürüm oluşturma sorunlarını da önler. constrained ön eki kullanılmazsa, bir değer türünün System.Object yöntemini geçersiz kılıp geçersiz kılmadığına bağlı olarak farklı IL belirtilmelidir. Örneğin, bir değer türü V Object.ToString() yöntemini geçersiz kılarsa, callV.ToString() yönergesi gönderilir; aksi takdirde, box yönergesi ve callvirtObject.ToString() yönergesi gönderilir. Geçersiz kılma daha sonra kaldırılırsa eski durumda ve daha sonra bir geçersiz kılma eklenirse ikinci durumda bir sürüm oluşturma sorunu ortaya çıkabilir.

constrained ön eki, arabirim yöntemini uygulayan değer türü yöntemi MethodImplkullanılarak değiştirilebileceği için, değer türlerinde arabirim yöntemlerini çağırmak için de kullanılabilir. constrained ön eki kullanılmazsa, derleyici derleme zamanında değer türünün yöntemlerinden hangisinin bağlanacağını seçmeye zorlanır. constrained ön ekini kullanmak, MSIL'in derleme zamanında değil, çalışma zamanında arabirim yöntemini uygulayan yönteme bağlanmasına olanak tanır.

Aşağıdaki Emit yöntemi aşırı yüklemesi constrained opcode'unu kullanabilir:

Şunlara uygulanır