Aracılığıyla paylaş


Unsafe.As Yöntem

Tanım

Aşırı Yüklemeler

As<T>(Object)

Verilen nesneyi belirtilen türe dönüştürür.

As<TFrom,TTo>(TFrom)

Verilen yönetilen işaretçiyi türündeki TTobir değere yeni bir yönetilen işaretçi olarak yeniden yorumlar.

As<T>(Object)

Kaynak:
Unsafe.cs
Kaynak:
Unsafe.cs
Kaynak:
Unsafe.cs

Verilen nesneyi belirtilen türe dönüştürür.

public:
generic <typename T>
 where T : class static T As(System::Object ^ o);
public static T? As<T> (object? o) where T : class;
public static T As<T> (object o) where T : class;
static member As : obj -> 'T (requires 'T : null)
Public Shared Function As(Of T As Class) (o As Object) As T

Tür Parametreleri

T

Nesnenin atılacağı tür.

Parametreler

o
Object

Yayın için nesne.

Döndürülenler

T

Özgün nesne, verilen türe yayın.

Açıklamalar

Bu API, çalışma zamanının normal tür güvenlik denetimlerini engelleyerek verilen türe bir nesne atamak için kullanılır. Atamanın yasal olduğundan emin olmak çağıranın sorumluluğundadır. Hiçbir InvalidCastException şey atılmayacak.

davranışı Unsafe.As<T>(o) yalnızca tipik "güvenli" atama işleminin (T)o başarılı olması durumunda iyi tanımlanmıştır. Aksi takdirde başarısız olabilecek atamaları aşmak için bu API'nin kullanılması desteklenmez ve çalışma zamanı tutarsızlığıyla sonuçlanabilir.

Doğru kullanımın uygulanmasına yardımcı olmak için geliştiriciler, aşağıdaki örneklerde gösterildiği gibi kodlarında standart bir atama veya yalnızca hata ayıklama onayı kullanmayı göz önünde bulundurabilir.

void ReinterpretCastAndUse_Sample1(object o)
{
  // Assume that we know through some other means that 'o' is a string,
  // and we want our library's debug builds to verify this.
  // One way to do this is through a standard-style cast.
  // A standard-style cast will throw InvalidCastException at runtime if the cast fails.
  // n.b. Casts of null objects to reference types will succeed.

#if DEBUG
  string s = (string)o;
#else
  string s = Unsafe.As<string>(o);
#endif

  DoSomethingWith(s);
}

void ReinterpretCastAndUse_Sample2(object o)
{
  // Another way to check this is through a debug-only assert.
  // Failed assertions will trigger attached debuggers or terminate the application immediately.
  // Calls to Debug.Assert are removed from release builds.

  Debug.Assert(o is null or string, "Unsafe.As call below is illegal!");
  string s = Unsafe.As<string>(o);

  DoSomethingWith(s);
}

Şunlara uygulanır

As<TFrom,TTo>(TFrom)

Kaynak:
Unsafe.cs
Kaynak:
Unsafe.cs
Kaynak:
Unsafe.cs

Verilen yönetilen işaretçiyi türündeki TTobir değere yeni bir yönetilen işaretçi olarak yeniden yorumlar.

public:
generic <typename TFrom, typename TTo>
 static TTo % As(TFrom % source);
public static ref TTo As<TFrom,TTo> (ref TFrom source);
static member As : 'From -> 'o
Public Shared Function As(Of TFrom, TTo) (ByRef source As TFrom) As TTo

Tür Parametreleri

TFrom

Yeniden yorumlanması için yönetilen işaretçinin türü.

TTo

Yönetilen işaretçinin istenen türü.

Parametreler

source
TFrom

Yeniden yorum yapmak için yönetilen işaretçi.

Döndürülenler

TTo

türünde TTobir değerin yönetilen işaretçisi.

Açıklamalar

Bu API kavramsal olarak C++'ın reinterpret_cast<>öğesine benzer. Atamanın yasal olduğundan emin olmak çağıranın sorumluluğundadır. Çalışma zamanı denetimi gerçekleştirilmeyecek.

Yalnızca yönetilen işaretçi yeniden yorumlanır. Başvuruda bulunan değerin kendisi değişmeden kalır. Aşağıdaki örneği inceleyin.

int[] intArray = new int[] { 0x1234_5678 }; // a 1-element array
ref int refToInt32 = ref intArray[0]; // managed pointer to first Int32 in array
ref short refToInt16 = ref Unsafe.As<int, short>(ref refToInt32); // reinterpret as managed pointer to Int16
Console.WriteLine($"0x{refToInt16:x4}");

Bu programın çıkışı, geçerli makinenin bitiş değerine bağlıdır. Büyük endian mimarilerde bu kod çıkışını alır 0x1234. Küçük endian mimarilerde bu kod çıkışını alır 0x5678.

Yönetilen işaretçiyi daha dar bir türden daha geniş bir türe atarken, çağıranın işaretçiye başvurmanın sınır dışı erişime neden olmadığından emin olması gerekir. Çağıran, sonuçta elde edilen işaretçinin başvuruda bulunan tür için düzgün bir şekilde hizalandığından da sorumludur. Hizalama varsayımları hakkında daha fazla bilgi için bkz. ECMA-335, Sn. I.12.6.2 ("Hizalama").

Şunlara uygulanır