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çimlendir Derleme Biçimi Description
FE 16 <T> Kısıtlı. thisType Türü kısıtlanmış Tbir türdeki sanal yöntemi çağırın.

Ön constrained eke yalnızca bir callvirt yönergede izin verilir.

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

  1. Yönetilen işaretçi, ptryığına gönderilir. türü ptr için yönetilen bir işaretçi (&) thisTypeolmalıdır. Bunun, başvurusunun beklendiği, eklenmemiş callvirt bir yönerge durumundan thisTypefarklı olduğunu unutmayın.

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

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

bir callvirtmethod yönerge ön ekine eklendiğinde constrainedthisTypeyönerge aşağıdaki gibi yürütülür:

  • Bir başvuru türüyse thisType (değer türünün aksine) ptr başvurusu kaldırılmıştır ve öğesine 'this' işaretçisi callvirtmethodolarak geçirilir.

  • bir değer türüyse ve uygularsa thisTypemethodptr, tarafından thisTypeuygulanması method için bir callmethod yönergeye 'bu' işaretçisi olarak değiştirilmemiş olarak geçirilir.thisType

  • Bir değer türüyse ve thisType uygulanmıyorsa thisTypeptrmethod, başvurulmaz, kutulanır ve yönergeye callvirtmethod 'bu' işaretçisi olarak geçirilir.

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

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

İşlem kodu, constrained IL derleyicilerinin bir değer türünden veya başvuru türünden ptr bağımsız olarak bir sanal işleve tekdüzen bir şekilde çağrı yapmasını sağlar. Genel bir tür değişkeninin olduğu thisType durum için tasarlanmış olsa da, constrained ön ek 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.

Ön ekin constrained kullanılması, değer türleriyle ilgili olası sürüm oluşturma sorunlarını da önler. constrained Ön ek kullanılmıyorsa, 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 bir callV.ToString() yönerge yayılır; belirtilmezse bir box yönerge ve yönerge callvirtObject.ToString() yayılır. 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.

Ön constrained ek, arabirim yöntemini uygulayan değer türü yöntemi kullanılarak MethodImpldeğiştirilebildiği için, değer türlerinde arabirim yöntemlerini çağırmak için de kullanılabilir. constrained Ön ek kullanılmazsa, derleyici derleme zamanında değer türünün yöntemlerinden hangisine bağlanacağını seçmeye zorlanır. ön ekini constrained 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öntem aşırı yüklemesi opcode'unu constrained kullanabilir:

Şunlara uygulanır