.NET

.NET specially C#..

“Reflection” kullanırken “ref” parametreler kullanmak

Önceki bloğumda yazdığım bir yazıyı gelen sorular üzerine buraya da yazdım. Daha Önceden okumuş arkadaşlara verdiğim rahatsızlıktan Ötürü Özür dilerim.. :)

Bugün bir arkadaşımdan email aldım, kendisi “reflection” kullanırken nasıl parametrelerden birini veya birkaçını “ref” olarak nasıl geçebileceğini soruyordu. İnternet üzerinden araştırdığı sÖyledi fakat bulamamış, kendisine emaille yardımcı oldum.

Zamanım da var enerjim de bir yazı da buraya yazayım dedim.. iyi demiş miyim ? :)

Elimizde Deneme2 adlı bir namespace mevcut olsun, hatta bu ayrı bir proje olsun; (hedef namespace)
[csharp]
namespace Deneme2
{
public class Aha
{
public Aha(int a)
{
Console.WriteLine(“Aha.Const = ” + a.ToString());
}
public void ToString(ref int sayi)
{
Console.WriteLine(“Aha.ToString” + sayi.ToString());
sayi = 10;
}
}
}
[/csharp]
Continue reading…

C# SharpZipLib Örneği

Merhabalar,

Geçtiğimiz dÖnemde, var olan Attachment’ları “zip” ile sıkıştırıp kullanıcıya download ettirme gibi bir Özellik istendi. Hani bir benzeri ‘google’ da var ya işte o :). Güzel bir Özellik ama hepsi google’ın suçu rahat rahat yaymak varken, oturduk bununla uğraştık.

Üstelik .NET 2.0’da gelen sınıfın birden fazla dosyayı aynı output dosyası içerisinde birleştirme gibi bir Özelliği olmadığını Öğrenince daha bi moralim bozuldu ama yapacak birşey yok iş iştir :). Diyerek SharpZipLib adlı ‘Open Source’ bir kütüphane buldum. Aslına bakılırsa bayağı ünlü ve kullanılan bir kütüphaneymiş, üstelik iyi bir iş çıkarmışlar. Fakat bununla beraber hafızada hali hazırda yer alan stream’leri kullanan adam gibi Örnek de bulamadım. İyice uyuz oldum kısaca :). Ben uyuz oldum siz olmayın diye de bu yazıyı yazmaya karar verdim. İyi etmiş miyim :)

[csharp]
MemoryStream outStream = null;
try
{
outStream = new MemoryStream(); // Oluşturulacak output dosya memory’e yazılacağı için MemoryStream oluşturulur.
using (ZipOutputStream s = new ZipOutputStream(outStream)) // Bu outStream’e yazılacak olan ZipOutputStream oluşturulur.
{
s.SetLevel(0); // 0..9’a kadar değer alır, 0: Sadece aynı dosyaya koyma, 9: Yüksek seviyeli sıkıştırma

for (MyFile myFile in myFiles)
{
// Yeni bir Zip dosya parçası yaratılır.
ZipEntry entry = new ZipEntry(myFile.FileName);
entry.DateTime = myFile.UploadDt;
entry.Size = myFile.Size;
s.PutNextEntry(entry); // Yaratılan bu Zip dosya parçası, ‘s’ adlı output nesnesine verilir.

byte[] content = myFile.Content; // Content’ dosyanın byte’larının yer aldığı diziyi saklayan property’dir.
s.Write(content, 0, content.Length); // Dosya’dan okunan content bilgisi zip output stream’e yazılır.
}
s.Finish(); // Her zip output stream kapatılmak zorundadır. CRC kontrollerinde hata verebilir(miş).

s.Close(); // Kendisine constructor’da parametre olarak geçilen Stream üzerindeki lock’ı kaldırması için kullanılır.
}
// outStream.ToArray(); ile byte[] elde edilebilir ve istenildiği gibi kullanıcıya download ettirilebilir.
}
finally // Her durumda memory’de yer alan outStream’i kapatması istenir.
{
if (outStream != null)
outStream.Close();
}
[/csharp]

GÖrüldüğü gibi memory’de bu işlemleri yapmak son derece basit. Eğer bir dosyadan okuma ile bu işlemi yapacaksanız “buffer” mekanizmasını kullanmanızı yani, dosyayı küçük küçük parçalarla outputStream’e yazmanızı tavsiye ederim. Bu işlemde bu modeli kullanmamamın nedeni, zaten hafızada olan bir nesnenin küçük parçalar taşınmasının mantıksızlığından Ötürüdür.

Kolay gelsin :)