Unsafe.As Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
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 |
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
Ö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 TTo
bir 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
türünde TTo
bir 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").