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 dil (MSIL) derleme biçiminin yanı sıra kısa bir başvuru özeti listelenmiştir:

Format Derleme Biçimi Açıklama
FE 16 <T> Kısıtlı. thisType Türü kısıtlanmış Tbir tür üzerinde bir sanal yöntem ç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 (thisType) olmalıdır. Bunun, başvurusu beklenen, eklenmemiş callvirt bir yönerge durumundan thisTypefarklı olduğunu unutmayın.

  2. aracılığıyla arg1 yöntem bağımsız değişkenleriargN, 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 başvuru türünden callvirt bağımsız olarak tekdüzen bir şekilde yapılmasına izin verecek thisType şekilde tasarlanmıştır.

bir callvirtmethod yönergenin ön eki 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şvurulmaz ve öğesine 'bu' işaretçisi callvirtmethodolarak geçirilir.

  • Bir değer türüyse ve thisType uygularsa thisTypemethod, ptr tarafından uygulanması callmethodiçin bir methodthisType yönergeye 'bu' işaretçisi olarak değiştirilmemiş olarak geçirilir.

  • Bir değer türüyse ve thisType uygulanmıyorsa thisTypemethodptr 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 Objectgeçersiz kılınmayabilir.ValueTypeEnumthisType Bu durumda, kutulama özgün nesnenin bir kopyasının yapılmasına neden olur. Ancak, , yöntemlerinin ObjectValueTypeEnum hiç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 türüne ve çağrılan yöntemine bağlı olarak derleme zamanında yukarıda özetlenen 'bu' dönüştürmeyi etkili bir şekilde gerçekleştirmesi ptr gerekir. Ancak, derleme zamanında bilinmeyen genel bir tür olduğunda ptr , derleme zamanında bu dönüşümü yapmak mümkün değildir.

opcode constrained , IL derleyicilerinin bir sanal işleve değer türünden veya başvuru türünden ptr bağımsız olarak tekdüzen bir şekilde çağrı yapmasını sağlar. Genel tür değişkeninin olduğu thisType duruma yönelik 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ı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, bir callV.ToString() yönerge yayılır; yoksa 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 hangi değer türünün yöntemlerine 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