Soran Yansıması sonucu ne olur Sistem üzerine yazmak için API.String.Boş?
Bu kod rastladım:
static void Main()
{
typeof(string).GetField("Empty").SetValue(null, "evil");//from DailyWTF
Console.WriteLine(String.Empty);//check
//how does it behave?
if ("evil" == String.Empty) Console.WriteLine("equal");
//output:
//evil
//equal
}
ve hatta mümkünse bu kod parçası derlemek için nasıl acaba. Benim akıl:
String.Empty
imkansız olması gereken salt okunur bu nedenle değişiyor Senior ve "" veya benzer bir hata. atanamaz statik salt okunur Bir alan ile bitmelidir derleme
Temel Sınıf Kütüphanesi derlemeler efsunlu ve saldırı tam da bu tür önlemek için imzalı falan vardır diye düşündüm. Bir dahaki sefere birisi Sistem değişebilir.Güvenlik.Kriptografi ya da başka bir önemli sınıf.
Temel Sınıf Kütüphanesi derlemeler NGEN sonra tarafından derlenen düşündüm .NET yükleme bu nedenle String sınıfı alanı değiştirmek için gelişmiş hack gerektirir ve çok daha zor olmalı.
Ve henüz bu kod derlenir ve çalışır. Biri benim akıl ile sorunun ne olduğunu açıklayabilecek olan var mı?
CEVAP
Statik salt okunur bir alan atanamaz
Bu atama değilsin. System.Reflection
ad kamu görevleri diyorsun. Bundan şikayet derleyici için bir sebep yok.
Ayrıca, typeof(string).GetField("Empty")
işine yarayacağını değişkenler girilen kullanıcı tarafından yerine başka emin yolu için derleyici söylemek her zaman olup olmadığını tartışmaya GetField
son "Empty"
.
Reflection
alan initonly
işaretli ve çalışma zamanında bir hata atmak olduğunu görmek istiyorsun sanırım. O, henüz beyaz kutu testi için beklediğiniz anlayabiliyorum, initonly
alanlar için yazılı Bazı uygulama var hatta.
NGEN hiçbir etkisi olmaz bu nedenle burada herhangi bir kod, veri değiştirme sadece sen değilsin. Veri hafızada saklanır .Başka bir dil gibi NET. Yerel programlar dize sabitleri gibi şeyler için salt okunur bellek bölümleri kullanabilirsiniz, ama dize için işaretçi genellikle hala yazılabilir ve burada neler olduğunu.
Kodunuzu tam güven ile çalışan bu şüpheli şekilde yansıma kullanmak için olması gerektiğini unutmayın. Ayrıca, değişiklik yalnızca etkileyen bir program, bu değil, herhangi türden bir güvenlik açığı olarak mi diyorsun (eğer çalışan zararlı kod içinde sürecinize tam güvenin, bu tasarım kararı, güvenlik sorunu değil, yansıma).
Daha fazla mscorlib.dll
içinde initonly
alanların değerlerini küresel değişmezler olduğunu unutmayın .NET çalışma zamanı. Onları kırdıktan sonra bile sabit kod Sistemi geçerli değerini incelemek için, çünkü kırık olup olmadığını güvenilir bir şekilde test edebilirsiniz.String.Boş da değişmezler ihlal ettin çünkü kırıldı. Sistem değişmezler ihlal etmeden ve hiçbir şey güvendi.
İçeride bu değerler belirterek .NET teknik özellikler, performans iyileştirmeleri bir sürü uygulamak için derleyici sağlar. Sadece basit bir açıklama
s == System.String.Empty
ve
(s != null) && (s.Length == 0)
eşdeğerdir, ama ikincisi çok daha hızlı (nispeten konuşma).
Ayrıca derleyici belirleyebilirsiniz
if (int.Parse(s) > int.MaxValue)
hiçbir zaman doğru değildir, ve başka blok için koşulsuz bir sıçrama oluşturmak (hala Int32.Parse
aynı durum davranışı için aramak, ama karşılaştırma kaldırılabilir).
System.String.Empty
da yoğun SERUM uygulamaları içinde kullanılır. Eğer üzerine yazarsanız,bu tarz çılgınlıklar, programınız dışında sızıntı hasar dahil olabilir(örneğin dize manipülasyon kullanılarak inşa edilmiş olan bir dosyaya yazabilirsiniz... dize sonları, yanlış dosyanın üzerine yaz)
Ve davranışı kolayca arasında farklılık gösterebilir .NET sürümleri. Normalde yeni optimizasyon imkanları bulunan, JİT derleyici (ve eğer olsaydı bile, dahil uygulanan önce gelen yüklemeleri olabilir) önceki sürümleri için backported anlamıyorlar. Özellikle. String.Empty
ile ilgili iyileştirmeler arasında observably farklıdır .NET 2.x ve Mono ve .NET 4.5 .
Metin için string dosyası yazmak ve he...
Bu tip 'genel tür parametre olara...
Nasıl objective-c iPhone resim üzerine...
Geçersiz kılınmış bir Sistem için en i...
C string int dönüştürmek için en kolay...