Kategori arşivi: .NET

.NET özellikle 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]
“Reflection” kullanırken “ref” parametreler kullanmak yazısına devam et

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 :)