December 1, 2008
@ 01:49 AM
Şu sıralar C# 3.0 ve LINQ ile ilgili  birçok dökümanda pek rastlamadığım bir anahtar kelimeyi (keyword) paylaşmak istedim.
Eğer LINQ ifadeleriniz içinde bir değişkene ihtiyacınız olursa - kimsenin ihtiyacı olmuyor da ondan mı kullanmıyor nedir ? ;) -
let ile tanımlayabiliriz  - bu let bir yerlerden tanıdık geliyor mu ne :)) -

Misal ;

string[] bolumler = { "matematik", "fizik", "kimya" };
Random r = new Random();

var sonuc = from c in new[]{ new {Ad="ali",Yas=21},
                                        new {Ad="murat",Yas=22},
                                        new {Ad="ismail",Yas=25}}

let bolum = bolumler[r.Next(0,bolumler.Length)]
select new
{
    Person = c,
    Bolum = bolum
};

foreach (var s in sonuc)
    listBox1.Items.Add(s.Person.Ad + " " + s.Bolum);




 
Categories: C# | Code

Diyelim ki bir uygulama geliştirdiniz. Belirli uzantıdaki dosyalar üzerinde işlem yapıyor. Ve kullanıcı bu uzantıdaki dosyaya tıkladığında uygulamanızın otomatik olarak açılmasını sağlamak istiyorsanız aşağıdaki kod işinize yarayacaktır.

RegistryKey key = Registry.ClassesRoot.CreateSubKey(".dna");
key.SetValue(null, "DnaFile.dna");
RegistryKey subkey = Registry.ClassesRoot.CreateSubKey("DnaFile.dna");
subkey.CreateSubKey("DefaultIcon").SetValue(null, @"%SystemRoot%\system32\msxml3.dll,0");
RegistryKey hedekey = subkey.CreateSubKey(@"shell\open\command");
hedekey.SetValue(null, "\"C:\\dna210506\\dnaPad\\dnaPad\\bin\\Debug\\dnaPad.exe\" \"%1\"");

subkey.CreateSubKey("DefaultIcon").SetValue(null, @"%SystemRoot%\system32\msxml3.dll,0");

kod ile *.dna uzantılı dosyanın kendisine özel bir icona sahip olmasını sağlıyor.

Yukardaki kod ile *.dna uzantılı dosyaya tıklandığında C:\...\dnaPad.exe yolundaki dnaPad.exe windows tarafından otomatik olarak çalıştırılır. Peki dosyayı uygulamaya parametre olarak windows geçiriyor da biz nasıl alacağız ?
Çözüm : string[] args = Environment.GetCommandLineArgs();
args[1] size ilgili dosyayı verecektir.


 
Categories: Code

C# 3.0'ın getirdiği güzel özelliklerden birisi olan İsimsiz Tipler'in bazı kısıtlamaları bulunmakta. Özellikle de metodlara parametre olarak geçirilme konusunda sıkıntı yaratıyor. Örneğin

static void Main(string[] args)
{
    var
v = new
    {
       
Ad = "oğuz",
        No = 44,
        Miktar = 122.2
    };
    BirDost(v);
}

şeklindeki bir tipi metoda parametre olarak geçirmek isteyelim.Amacımız bu tipin özelliklerindeki - property - değerleri almak ve işlem yapmak olsun.

public static void BirDost(var belirsizTip)
{
...
}

hmmm..işler düşündüğümüz gibi gitmeyecek ve derleyici şöyle bir  hata verecek.

Error 1 The contextual keyword 'var' may only appear within a local variable declaration

Tamam o zaman herşey object'tir mantığından yola çıkarak metodumuzu aşağıdaki gibi değiştirelim.

public static void BirDost(object belirsizTip)
{
 // belirsizTip. (???)
}

Tamam oldu gibi..Ama belirsizTip nesnesi üzerinden Ad,No,Miktar gibi özelliklere nasıl erişebilir ki? Seni seviyorum .NET diyerek biraz reflection uyguluyoruz ve sonuç.

public static void BirDost(object belirsizTip)
{
   
Type t = belirsizTip.GetType();
    PropertyInfo[] ps = t.GetProperties();

   
foreach (PropertyInfo p in ps)
    {
       
Console.WriteLine(p.Name + " => " + p.GetValue(belirsizTip,null));
    }
}

Artık isimsiz tiplerimizi gönül rahatlığı ile - çok mu duygusal oldu nedir? - metodlara parametre olarak aktarbiliriz ;)


 
Categories: C# | Code

November 3, 2008
@ 12:04 AM
Birçoğuz biliyoruz ki, kimi zaman belirli bir classdan çalışma zamanında sadece tek bir nesne oluşturulmasını isteriz. Aynı sınıfa ait ikinci bir nesne oluşmasını engellemek isteriz. Bu durumda Singleton Tasarım Kalıbını (Alper Hoca'nın kulakları çınlasın)  uygularız. Fakat birçok class için bu durum geçerli ise her defasında bunu uygulamak bizim gibi üşengeç programcılar için can sıkıcı hal alır. Çözüm ise,
    
class GenericSingleton<T> where T : class, new()
{
    private static object lockObject = new object();
    private static T m_Instance;

    public static T GetInstance()
    {
        if( m_Instance != null)
            return m_Instance;
        lock ( lockObject)
        {
            if (m_Instance == null)
            {
                m_Instance = new T();
            }            
        }
        return m_Instance;
    }
}

Bu generics süper bişi! - ben bu lafı bir yerden hatırlıyorum ama -


 
Categories: C# | Code

September 22, 2008
@ 01:06 PM

C# 2.0 ile birlikte gelen isimsiz metodları  (anonymous methods) hepimiz biliyoruz. Peki ya bu isimsiz metod kendi kendini - recursive - nasıl çağıracak ? Malum adı üstünde metodun ismi yok.
Aşağıda isimsiz bir metodun - klasik faktöryel hesaplayan -  kendi kendini nasıl çağırdığına dair kodu inceleyebilirsiniz.

delegate T Func<T>( T a );

static void Main( string[] args )
{

    Func<int> f = delegate( int a )
    {

        MethodBase m = new StackTrace().GetFrame(0).GetMethod();
        return a > 1 ? a * (int)m.Invoke(null, new object[] { a - 1 }) : a;

    };
    Console.WriteLine(f(4));
}

Sevgili DnaPromat sınıfı öğrencileri ile yaptığımız diğer güzel bir yaklaşım.

Hedele d = null;
d = delegate(int x)
{
   
Console.WriteLine(x);
   
if (x == 0 || x == 1)
       
return 1;

    return x * d(x - 1);
};
Console.WriteLine(d(5));


 
Categories: Code

1.YOL Extension metodları ve lambda expression kullanarak

foreach (IGrouping<string, string> group in Directory.GetFiles(Path.GetTempPath()).GroupBy(file => Path.GetExtension(file)))
{
    listBox1.Items.Add("--- " + group.Key + " ---");
    foreach (string file in group)
    {
        listBox1.Items.Add(file);
    }
}

2.YOL LINQ Expression Kullanarak

var sonuc = from c in Directory.GetFiles(Path.GetTempPath())
                
group new
                        
{
                             DosyaAd = c
                         }
                 by Path.GetExtension(c);

foreach (var  group in sonuc)
{
    listBox1.Items.Add("--- "+group.Key+" ---");
    foreach (var s in group)
       
listBox1.Items.Add(s.DosyaAd);
}

3.YOL LINQ Expression Kullanarak (Tipler Biliniyor)

IEnumerable<IGrouping<string,string>> sonuc = from c in Directory.GetFiles(Path.GetTempPath())
                                                               
group c
                                                               
by Path.GetExtension(c);

foreach (IGrouping<string,string> group in sonuc)
{
   
listBox1.Items.Add(group.Key);
   
foreach (string file in group)
       
listBox1.Items.Add(file);
}


 
Categories: C# | Code

August 5, 2008
@ 11:22 AM
C# 3.0 dili ile birlikte gelen yeni özellikleri şimdiye kadar duymayan kalmadı denebilir. Gerek seminerler olsun gerekse Türkçe içerikli makalelerde bunlara değinildi.
Yeniliklerden birisi olan Lambda Expressionlar ile artık C# 3.0 bir "fonksiyonel programlama dilidir" diyebiliriz. İlerki zamanlarda bunlarla ilgili kod örneklerine de yer vereceğim.

Belirsiz Tiplerle (Anonymous Types) ilgili bir örnek kod olarak belirsiz tiplerden oluşan bir dizi nasıl oluştururuz buna bakalım.

	  var bilinmeyenTipdenDizi = new[] 
          {
              new {Ad="oguz",Soyad="yagmur"},
              new {Ad="sefer",Soyad="algan"},
          };

          foreach (var bilinmeyenTip in bilinmeyenTipdenDizi)
          {
              MessageBox.Show(bilinmeyenTip.Ad +" " + bilinmeyenTip.Soyad);
          }
Burda dikkat edilecek nokta dizinin bilinmeyen tipli elemanlarının aynı imzaya sahip olması. Nihayetinde bildiğimiz gibi belirsiz tiplerde IL de belirli bir tipe dönüştürülüyor ;)




 
Categories: C# | Code

Orta çaplı ya da büyük boyutlu uygulamalarda genellikle uygulama birçok kişi ya da birden fazla takım tarafından geliştirilmekte ve kayank kod kontrolü programları ile ( source safe, cvs, svn gibi ) projelerini yönetmektedirler.Asp.net uygulamalarında, web.config dosyasında  kişilerin ya da takımların kendilerine özel appSettings altında tutacak değerleri veya connectionStrings altında tutacak farklı veritabanı bağlantı bilgileri olabilir. Kimi durumlarda "check out" edilen web.config üzerinde degişiklik yapıldıkdan sonra ( ki bu bazen ekleme bazen de düzenleme olabilir ) "check in" yapılarak tekrar güncellenir. Bu kimi durumlarda birçok hataya ve aksaklığa neden olabiliyor. Bu durumda ilk akla gelen çözüm tüm uygulamada ortak kullanılacak değerler web.config dosyasına konur, test amaçlı, kişiye özel ya da takıma özel kısımlar ise harici bir dosyada tutulara web.config dosyası ile ile ilişkilendirilebilir.

Örneğin A takımının tüm projeden bağımsız kendisine özel bazı değerleri ve yine kendisine özel veritabanı bağlantısı bilgilerini harici olarak tutmak istediğini ama tüm projedeki ortak değerleri ve veritabanı bağlantı bilgilerini de kulanmak istediğini düşünelim. Bu durumda kendisine ait özel verileri web.config haricinde başka bir dosyada tutup, web.config dosyasında da bazı düzenlemelerden sonra diğer takım arkadaşlarının ya da aynı web.config'i kullanan diğer takımların başını ağrıtmayacaktır :)

Resimden de görüldüğü gibi projeme connectionstring lerimi ve appsetting lerimi yerleştirmek için iki ayrı dosya ekledim ( dosya isim ve uzantilarında zorunluluk yoktur. )

Ateam_local_connections.config dosyasının içeriği aşağıdaki gibi;

<connectionStrings>
  <add name="Atakiminaozelbaglanti" connectionString="Atakimi baglanti bilgileri..."/>
</connectionStrings>

Ateam_local_settings.config dosyasının içeriği de

<appSettings>
  <add key="Atakiminaozel" value="beniAtakimiOkur"/>
  <add key="exts" value="jpg,png"/>
</appSettings>

gibidir. web.config dosyamızı da aşağıdaki gibi düzenledikten sonra test edebiliriz.

<appSettings file="Ateam_local_settings.config">
    <add key="globalValue" value="Beni herkes bilir!"/>
</appSettings>
<connectionStrings  configSource="Ateam_local_connections.config">
</connectionStrings>

bu kısımda dikkat edilecek nokta connectionStrings kısmına eğer harici bir dosya kullanacağınızı tanımlarsanız <connectionStrings> tagları arasına başka bir connectionstring tanımlaması yapamıyor oluşunuzdur.

Test kodumuz aşağıdaki gibidir.

    protected void Page_Load(object sender, EventArgs e)
    {
        //genel appSettings okunuyor
        Response.Write(ConfigurationManager.AppSettings["globalValue"]);
        
        //A takimina ozel degerler okunuyor
        Response.Write("<br>"+ConfigurationManager.AppSettings["Atakiminaozel"]);

        //A takimina ozel connectionString okunuyor
        Response.Write("<br>"+ConfigurationManager.ConnectionStrings["Atakiminaozelbaglanti"].ConnectionString);
    }
 

Saç baş yolduran problemsiz çalışma ortamları dilerim :)


 
Categories: Asp.net | Code | Inceleme

HttpHandler ile sunucuya gelen istekler üzerine işlemler yapabiliyoruz. Eğer belirli bir uzantı üzerinde işlem yapmak istersek ilk akla gelen HttpHandler yazıp uzantıya özel işlemlerimizi yapmaktır. Eğer aynı uzantıya göre birden fazla tanımlanmış HttpHandler'lardan birisinin çalışması istendiğinde (örneğin bir aspx sayfasına gelen isteğe göre birden fazla httphandler tanımlanmış olabilir) ise HttpHandlerFactory ile bunu kolayca halledebiliyoruz. (Factory Design Pattern 'in iyi bir örneği) Örneğin bir site yaptık http://hede/musteriler/x.aspx 'e bir istek geldiğinde ilgili HttpHandler'im, http://hede/urunler/z.aspx 'e bir istek geldiğinde ise birbaşka ilgili HttpHandler'in devreye girmesini isteyebiliriz.

Bu durumu incelemj  için aşağıdaki örneği inceleyebiliriz.

public class Customers : IHttpHandler
   {

       public bool IsReusable
       {
           get { return true; }
       }

       public void ProcessRequest(HttpContext context)
       {
           context.Response.Write("müşteriler sayfaları");
       }
   }
public class Products : IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("ürünler sayfaları");
        }
    }

 

Görüldüğü gibi iki adet httphandler'imiz var. Birisi müşteriler ile iglili aspx sayfaları üzerinde diğeri de ürünlerle ilgili sayfalar üzerinde işlem yapmak amacı ile tasarlanmış httphandler'larımız. Şimdi bizim işimiz gelen isteğe göre hangi httphandler'i devreye sokacağımıza karar vermek.Bu durumda yapacağımız bir IHttpHandlerFactory arayüzünü implemente etmiş sınıf hazırlamak. Örnek aşağıdaki gibidir.

public class facto : IHttpHandlerFactory
    {
        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            if (url.Contains("/musteriler/"))
                return new Customers();
            else if (url.Contains("/urunler/"))
                return new Products();
            else
                return new DefaultHttpHandler();
        }
        public void ReleaseHandler(IHttpHandler handler)
        {

        }
    }

Bu interface'i uygulamadığımızda iki metodu implemente etmemiz gerekecek. GetHandler metodu bir aspx (Web.config içinde gerekli ayarlamaların yapıldığını düşünerek) sayfasına istek geldiğinde ilgili HttpHandler'i oluşturup geriye bu nesneyi döndürmeye yarıyor.

Web.config dosyamızda aşağıdaki gibi HttpHandler'imizi eklemeliyiz.

<httpHandlers>
   <add path="*.aspx" type="hndLib.facto" verb="*"/>
</httpHandlers>
      
httphandlerfactory.rar (12,46 KB) (ilgili örnek ektedir)
 
Categories: Asp.net | Code | Inceleme

Oluşturduğumuz assemblyleri Global Assembly Cache'e (GAC) yüklemek için gerek gacutil konsol uygulamasını gerekse de Control Panel\Administrative Tools altındaki Microsoft .NET Framework 2.0 Configuration aracını kullanarak manuel yükleme işlemini gerçekleştirebiliyoruz.

Peki bu işlemi yardımcı araçlar ile manuel olarak değil de bazı ihtiyaçlardan dolayı :) programatik olarak gerçekleştirmek isteyebilirsiniz. Reflector ile biraz .NET'i kurcaladığımda - eh! .net framework kendi içinde böyle bir desteği mutlaka sağlıyordur mantığından yola çıkarak - aşağıdaki resimden de görebileceğiniz GacUtil isimli bir sınıf ile karşılaştım.



Aşağıdaki basit bir reflection işlemi ile kendi assembly'imizi GAC'a yükleyebiliriz.

   1:  namespace BTAkademi.TestCodes
   2:  {
   3:      class Program
   4:      {
   5:          static void Main(string[] args)
   6:          {
   7:              //GAC'dan System.Web dll'i yükleniyor
   8:              Assembly asm = Assembly.Load(@"System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
   9:   
  10:              // Type bilgisi alınıyor
  11:              Type t = asm.GetType("System.Web.Configuration.GacUtil");
  12:              // Metodu invoke edebilmek için GacUtil türünden nesne oluşturuluyor
  13:              object o = Activator.CreateInstance(t);
  14:   
  15:              //Metod bilgisi alınıyor
  16:              MethodInfo mi = o.GetType().GetMethod("GacInstall");
  17:   
  18:              //metod çağrılıyor
  19:              mi.Invoke(o, new object[] { "C:\\gacTest.dll" });
  20:   
  21:          }
  22:      }
  23:  }


Not : GAC'a yüklenmek istenen assembly'nin public key token'a sahip olması gerekmektedir.

 

13/7/2008 tarihli düzenleme :

try
{
    System.EnterpriseServices.Internal.Publish gac = new System.EnterpriseServices.Internal.Publish();
    gac.GacInstall(yuklenecekassemblyadi);
}
catch (System.Security.SecurityException se)
{

}

şeklinde de yüklenebiliniyormuş :))) Eh azmetmek gibisi yok.


 
Categories: .NET | C# | Code | Inceleme

C# 3.0 ile birlikte gelen yeniliklerden, otomatik özellikler ile artık kolay ve hızlı bir biçimde standart özellikler (property) tanımlayabiliyoruz.

Örneğin;

class Person
{
   public int No { get; set; }
   public string Ad { get; set; }
   public FizikselOzellik Ozellik { get; set; }
}

class FizikselOzellik
{
   public int Kilo { get; set; }
   public int Boy { get; set; }
   public string Cinsiyet { get; set; }
}

gibi. Aslında IL kodlarını incelersek, derleyicinin C# 2.0 daki gibi (arka planda bir field oluşturup, get ve set erişimcilerini otomatik kendisi yazıyor) özellik tanımladığını görebiliriz. Yeni gelen diğer bir özellik ise Nesneye Ilk Değerini verme ile ilgili. Aşağıdaki sentaks ile artık nesneleri oluştururken özelliklerine de ilk değerlerini vererek nesneyi oluşturabiliriz.


Person nesnemiz içerisinde özellik olarak FizikselOzellik isimli başka bir nesne içeriyor. Bu durumda da aşağıdaki sentaks ile Person nesnemize ilk değerini verebiliriz.,

Person p = new Person {
               
Ad="oguz",No=169,
               Ozellik = new FizikselOzellik{Kilo=120,Boy=173,Cinsiyet="E"}
};

Görüldüğü gibi C# 3.0 ile gelen yenilikleri dili kullanmayı daha hızlı, zevkli ve kolay bir hale getiriyor ;)

 
Categories: C# | Code

Linq To SQL de, bir nesne ( Personel ) yüklendiğinde ( from c in DB.Personels select c ) ilişkili olduğu ( Telefon ) tablodaki veriler ( Personele ait Telefonlar )
belleğe yüklenmezler. Aşağıdaki resime bakacak olursak ;




kisi nesnesine ait Ad özelliğinin değeri okunmak istendiğinde zaten bellekte olduğu için yeniden bir işlem yapılmamakta. Ama bu kisi nesnesine ait telefonlar - tablolar arasında ilişki olduğunu biliyoruz - Telefons isimli bir koleksiyon türünden özellik  ile ifade ediliyor. Bu kişiye ait telefon bilgilerinden ilkine erişmek istediğimizde kisi nesnesine ait telefon bilgilerini alıp nesneyle ilişkilendirmek için ikinci bir T-SQL sorgusu veritabanı sunucusuna gönderiliyor. Aslında performans açısından bakıldığında istenen durum budur.

Peki ama ben kisi nesnesini oluşturduğumda buna ait telefon bilgileri de - dikkat edin o kişiye ait adres bilgileri de olabilir ama biz sadece telefon bilgilerinin de - tamamen belleğe yüklensin ikinci bir select işlemi yapılmasın istersek. Bu durumda kodumuza  aşağıdaki gibi eklemeler yapmamız  gerekecektir.



Görüldüğü gibi DataLoadOptions sınıfı ile  nesnenin ilişkili olduğu verilerin de nesne ile birlikte belleğe yüklenmesini sağlayabiliyoruz.  LoadWith Generic metoduna tip olarak Kisi sınıfını verip, lambda Expression ile de Kisi türünden bir nesne yüklendiğinde buna ait telefon bilgilerinin de yüklenmesini ( c => c.Telefons ) belirtebiliyoruz (Immediately Load). DataContext nesnemizin de LoadOptions özelliğine değeri atayarak şekilde görüldüğü gibi iki ayrı select sorgusu ile istediğimiz senaryoyu gerçeklemiş olduk.

 
Categories: C# | Code | Inceleme

February 8, 2008
@ 03:07 PM
İki tabloyu birlikte sorgulamak için inner join kullanırız. Bunu Linq To Sql ile yaparken aşağıdaki gibi bir Linq Query yazarak çözüyoruz
(Kisi, Telefon ve Adres tablolarımız olduğunu, bir kişinin de birden çok adresi ve telefonu olduğunu düşünüyoruz )
Bu sorgu sonucunda bana kişiler tablosundaki isimler ve bunlara ait telefon numaraları gelecektir.

from kisi in Kisis
join tlf in Telefons
on kisi.ID equals tlf.KisiID
select new
{
    Ad = kisi.Ad,
    Tlf = tlf.Numara
}

T-Sql çıktısı
SELECT [t0].[Ad], [t1].[Numara] AS [Tlf]
FROM [Kisi] AS [t0]
INNER JOIN [Telefon] AS [t1] ON [t0].[ID] = [t1].[KisiID]

Lambda Expression
Kisis.Join ( Telefons, kisi => kisi.ID, tlf => tlf.KisiID, (kisi, tlf) => new { Ad = kisi.Ad, Tlf = tlf.Numara } )



Senaryomuzu değiştirelim ;
Kişiler tablosundaki tüm kayıtlat gelsin, telefon numarası olmayanlar da gelsin telefonu yoksa null değer gelsin. Bunun içinde Left Outer Join ile çözeriz. Linq sorugumuzu şu şekilde değiştirmemiz yeterli olacaktır.

from kisi in Kisis
join tlf in Telefons
on kisi.ID equals tlf.KisiID into data
from x in data.DefaultIfEmpty()
select new
{
   Ad = kisi.Ad,
   Tlf = x.Numara
}

T-SQL çıktısı

SELECT [t0].[Ad], [t1].[Numara] AS [Tlf]
FROM [Kisi] AS [t0]
LEFT OUTER JOIN [Telefon] AS [t1] ON [t0].[ID] = [t1].[KisiID]

Lambda Expression
Kisis
.GroupJoin (
Telefons,
kisi => kisi.ID,
tlf => tlf.KisiID,
(kisi, data) =>
new
{
kisi = kisi,
data = data
}
)
.SelectMany (
temp0 => temp0.data.DefaultIfEmpty (),
(temp0, x) =>
new
{
Ad = temp0.kisi.Ad,
Tlf = x.Numara
}
)

 
 
Categories: C# | Code

January 30, 2008
@ 11:21 PM
Linq to Sql de veritabanı sunucusuna giden sorguları SQL Profiler ile izleriz. Fakat daha kolay bir yol var. Aşağıdaki resim gayet açıklayıcı ;)
Tek yapmamız gereken DataContext türünden nesnemizin Log özelliğine istediğimiz çıktıyı vermek olacaktır.



Eğer kodumuzu aşağıdaki gibi düzenlersek bu defa da üretilen T-SQL istediğimiz herhangi bir fiziksel dosyaya kaydedilecektir.

testDataContext db = new 
db.Log = new StreamWriter("C:\\l2s.log"); var v = from p in db.Persons where p.Surname == "asma" select p.Name; Text = v.First(); db.Log.Close();
l2s.log dosyasının içeriği aşağıdaki gibidir.

SELECT TOP (1) [t0].[Name]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[Surname] = @p0
-- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [asma]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8

 
Categories: .NET | C# | Code | Inceleme

January 15, 2008
@ 08:47 PM

Değerli Arkadaşlar, biliyorsunuz bu ay sonunda Visual Studio.NET 2008 ve SQL Server 2008 in lansmanı yapılacak. SQL Server 2008 ile güzel bir yeniliği sizlerle paylaşmak istiyoruz. Veri tabanında BLOB (Binary Large Object) nesnelerini özellikle veritabanında dosya tutmak istediğimizde kullanıyoruz.  Özellikle iş akışı ve döküman yönetimi sistemlerinde veritabanında dosya tutmaya başladığımızda veritabanı gün geçtikçe dosya sistemi gibi büyümeye başlıyor, ve yedekleme işlemi işkenceye dönmeye başlıyordur. SQL Server 2008 dosya sistemi ve ilişkisel veritabanı sistemini kullanarak hibrid bir model sunuyor bizlere. Yani 2008 den itibaren artık BLOB işlemleri veritabanında bir kolon şeklinde tanımalanabilecek ancak istersek dosya içeriğini file system'de tutabileceğiz. Böylece ilişkisel veri modelinden vazgecmeden geniş binary içerkli dosyaları fiziksel olarak diskte saklayabileceğiz.  Veritabanı ise fiziksel dosya sistemine bir nevi referans gibi çalışacak. Bu işlem tamamen opsiyonel olacağı için eski mantıklada çalışmak mümkün olabilecek.


 
Categories: .NET | Code

Msdn'de soldaki TreeView'de StackTrace sınıfını incelemek isterken hemen altında bulunan StopWatch sınıfı isminden dolayı baya bir gözüme battı. Neymiş diye incelerken çoğumuzun bir kodun ne kadar süre çalıştığını test etmek için DateTime.Now ile o anki zaman değerini alıp kod bitiminde Datetime.Now ile zaman değerinden bir önceki değeri çıkarma işlemini yaparız. StopWatch sınıfı ile çok daha hassas ve kesin ( Daha alt sistem API'lerini kullandığınu söyledi google ;) ) değer alabiliyormuşuz. Kullanımına dair örnek kod aşağıda.

private void button1_Click(object sender, EventArgs e)
{
   System.Diagnostics.Stopwatch diff = new System.Diagnostics.Stopwatch();
   diff.Start();
   for (int i = 0; i < 2000000; i++)
   {
      int x = i >> 2 << 22 >> 222 << 2222 >> 22222 << 222222;
   }
   diff.Stop();
   label1.Text = diff.Elapsed.ToString();
}       

DateTime ile aynı kodu şu şekilde test ettim.

long t = DateTime.Now.Ticks;
for (int i = 0; i < 2000000; i++)
{
   int x = i >> 2 << 22 >> 222 << 2222 >> 22222 << 222222;
}
long t1 = DateTime.Now.Ticks;
label1.Text = (t1 -t).ToString();

Sonuç ya 0 (yazı ile sıfır) ya da 156250 iken aynı kodu StopWatch sınıfını kullanarak test ettiğimde 28400 ile 28800 arasında sonuçlar verdi.
 
Categories: C# | Code | Inceleme

September 20, 2007
@ 11:12 PM

Küçük bir ayrıntı olmasına karşın kullanışlı bir özellik. Aşağıdaki kodu test ederken label'lara tıkladığınızda aralarındaki farkı anlayacaksınız. (AssociatedControlId özelliği verilmiş label'a tıkladığınızda textbox kontrolü focus'lanacaktır)

<asp:Label id="label" AssociatedControlId="textbox" Text="Ad" runat="server" /><asp:TextBox id="textbox" runat="server" /><br />

<asp:Label id="label1" Text="Soyad" runat="server" /><asp:TextBox id="textbox1" runat="server" />

Render işleminde sonra çıkan sonuç ise şöyle :

<label for="textbox" id="label">Ad</label>
<input name="textbox" type="text" id="textbox" /><br />
<span id="label1">Soyad</span>
<input name="textbox1" type="text" id="textbox1" />


 
Categories: Asp.net | Code

July 22, 2007
@ 02:45 AM
Bir mail ile gelen soru üzerine verdiğim cevabımı buraya da yazayım dedim. Az çok - istesek de istemesek de - asp.net uygulamarında javascript kodları ile haşır neşir oluyoruz.
Şimdi çok basit bir örnek ile giriş yapalım. Bir aspx sayfası bir button ve bir textbox. Button'a tıklağımızda textbox'a birşey yazsın istiyoruz.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function Yaz()
{
var txt = document.getElementById('txt');
txt.value = "BT Akademi";
}

</script>
</head>
<body>
<form id="form1" runat="server">
<input id="Button1" type="button" value="button" onclick="Yaz()" />
<asp:TextBox ID="txt" runat="server"></asp:TextBox>
</form>
</body>
</html>

Görüldüğü gibi zor bir tarafı yok daha önce ilgilenenler için. getElementById javascript fonksiyonuna butona tıklandığında içerisine "BT Akademi" yazmasını istediğimiz kontrolümüzün ( dikkat edin bu kontrol asp.net webserver kontrolü) ID'sini veriyoruz.Şimdi ise aynı olayı bir User Control içersinde gerçekleştirelim. Öncelikle çok basit bir user kontrol oluşturacağız ve bunu asp.net sayfamıza ekleyeceğiz. Bakalım neler oluyor.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucTest.ascx.cs" Inherits="ucTest" %>
<script type="text/javascript">
function Yaz()
{
var txt = document.getElementById('ucTxt');
txt.value = "BT Akademi";
}

</script>

<asp:TextBox ID="ucTxt" runat="server"></asp:TextBox>
<br />
<input id="ucBtn" type="button" value="Uc Tıkla" onclick="Yaz()" />

Dikkat ediniz. Yukardaki kodlar ucTest isimli user kontrolümüzün kodlarıdır.Bu user kontrolü asp.net sayfasına ekleyip sayfamızı çalıştırdığımızda hata alacağız. Nedeni ise: Javascipt kodumuza baktığımızda direk ucTxt yazdığımızı fark edeceksiniz. Bu user kontrol render edildiğinde html çıktısına bakacak olursak bizim ucTxt Textbox kontrolümüzün adının "UcTest1_ucTxt" şekline dönüştürüldüğünü yani ,ilk olarak user kontrolünün adı (UcTest1) , araya "_" eklenmiş ve sonra da  kontrolün adı (ucTxt) eklenmiştir. Oysaki biz javascript kodunda kontrolümüzün adını "ucTxt" olarak belirtmiştik. Şimdi hatamızın kaynağını bulduk. Çözüm :

1- javascipt kodunu bu bilgiler ışığında şu şekilde güncelleyebiliriz.

var txt = document.getElementById('UcTest1_ucTxt');

Pek iyi bir fikir değil gibi. Çözüm müdür? Evet. Ama kontrolümüzün ismi değiştiğinde gidip js kodları ile de oynamak gerekiyor.

2- En iyisi biz bu oluşacak yeni ismi küçük bir kod ile asp.net ten alalım ve js kodumuz ile bir daha hiç uğraşmayalım...user kontrol eklendiğinde
ilgili kontrolün ismini hiç düşünmeyelim ve kendisinden alalım. İşte asp.net webserver kontrolümüzün ClientID özelliği sayfa render edildikten sonra kontrolün clientdaki id sini bize verecektir.Son olarak js kodunu aşağıdaki gibi değiştirirsek sorun hallolacaktır.

<script type="text/javascript">
function Yaz()
{
var txt = document.getElementById('<%=ucTxt.ClientID %>');
txt.value = "BT Akademi";
}
</script>


Örnek uygulamayı indirebilirsiniz WebSite4.zip (2,34 KB)

 
Categories: Asp.net | Code | Inceleme

.Net Akademi eğitiminden bir ders çalışması...

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Collections;

namespace sortedbyProperty
{
    class Program
    {
        static void Main(string[] args)
        {
            HedeColl h = new HedeColl();

            h.Add(new Ogrenci(2, "ali", DateTime.Now.AddDays(10)));
            h.Add(new Ogrenci(21, "ahmet", DateTime.Now.AddDays(1)));
            h.Add(new Ogrenci(12, "mehmet", DateTime.Now.AddDays(122)));

            h.Sortla("Tarih",BuyukKucuk.Buyuk);

            foreach (Ogrenci o in h)
            {
                Console.WriteLine(o);
            }
        }
    }


    enum BuyukKucuk
    {
        Buyuk,
        Kucuk
    }
    class HedeColl : List<Ogrenci>
    {
        public HedeColl()
        {
          
        }

        public void Sortla(string pad, BuyukKucuk siralama)
        {
            this.Sort(

                delegate(Ogrenci o1, Ogrenci o2)
                {
                    PropertyInfo prop1 = o1.GetType().GetProperty(pad);
                    PropertyInfo prop2 = o2.GetType().GetProperty(pad);

                    object v1 = prop1.GetValue(o1, null);
                    object v2 = prop2.GetValue(o2, null);

                    int val = Comparer.Default.Compare(v1, v2);
                    if (siralama == BuyukKucuk.Kucuk)
                        return val;
                    else
                        return -val;
                }
            );
        }
    }

    class Ogrenci
    {
        private int _no;
        public int No
        {
            get { return _no; }
            set { _no = value; }
        }

        private string _ad;
        public string Ad
        {
            get { return _ad; }
            set { _ad = value; }
        }

        private DateTime _tarih;
        public DateTime Tarih
        {
            get { return _tarih; }
            set { _tarih = value; }
        }

        public Ogrenci(int a, string b, DateTime d)
        {
            Ad = b;
            No = a;
            Tarih = d;
        }

        public override string ToString()
        {
            return String.Format("Ad :{0} No : {1} Tarih : {2}", Ad, No, Tarih);
        }

    }
}


 
Categories: C# | Code

BT Akademi'nin değerli eğitmenlerinden Özcan Değirmenci'nin BT Akademi'de verdiği WinForm 2.0 Akademideki örnekleri incelerken  bol bol  StructLayout  attribute'leri ile  karşılaşıyorum . Malum  Windows API seviyesinde kod  yazmayan  geliştiricilerin pek ihtiyaç duymadığı hatta birçoğunun haberi dahi olmadığı ama kontrol geliştiren, ciddi manada detaylı windows uygulamaları geliştirenlerin - örneğin .NET Framework'ün desteklemediği sistem fonksiyonlarının kullanıldığı - sıklıkla kullandığı bu attrribute sayesinde class'ların yada structların - kısaca Type'ların - memory'de istenilen şekilde yerleşmesini sağlayabiliyoruz.

Herhangi bir Type bildirimi yapıldığında CLR performans sağlanması adına bu Type'ın üye elemanlarının memory'deki yerleşim düzenini kendisi ayarlamaktadır. Bu şekilde hem daha az memory kullanımı optimize ediyor hem de ilgili Type'ın üye elemanlarına erişim hızının artırılmasını sağlıyor. Fakat bazı Windows API fonksiyonları bizden parametre olarak özel bir şekilde memory'de  dizilmiş struct isteyebiliyor. Bu durumda memory'deki dizilimini CLR'nin değil de bizim yapmamız gerekiyor. İşte burda StructLayout attribute'ü tüm ihtiyacımızı karşılıyor. LayoutKind numaralandırıcısını (Enumeration) kullanarak dizilimi kendimiz beliryebiliyoruz.

Not : Struct tanımladığınızda otomatik olarak bu özellik Sequential'dir. Ama bu attribute'ü bir class için kullanmak isterseniz mutlaka LayoutKind.Sequential numaralandırıcısını kullanmalısınız.

Auto : CLR'nin yaptığı gibi
Sequential : Sıralı bir şekilde aynen bildirimdeki sıraya göre
Explicit : Biz nasıl istiyorsak öyle.

[StructLayout(LayoutKind.Sequential)]
public struct Coord
{
     int x;
     int y;
}

gibi..Eğer bu dizilimin bizim isteğimize göre olmasını istersek de LayoutKind.Explicit numaralandırıcısını aşağıdaki gibi kullanmalıyız.

[StructLayout(LayoutKind.Explicit)]
struct Coord
{
     [FieldOffset(0)]
     public int x;
     [FieldOffset(4)]
     public int y;
}

Üye elemanlarına FieldOffset attribute'ünün uygulandığını görüyoruz. Bu sayede memory'de hangi elemanın hangi offsetten -kaçıncı byte'dan - itibaren yerleşeceğine karar  verebiliyoruz. Yukardaki örnekte yapımızın 0. byte'ından itibaren x'in yerleşeceğini, 4.byte'dan itibaren de - sizeof(int) de kullanabilirsiniz. int'in büyüklüğü kadar memoryde ilerlemek için - y'nin yerleştirileceğini belirtebiliyoruz. Bu özellik sayesinde aslında çok az memory kullanarak struct yapımızın içinde çok sayıda üye eleman tanımlayabiliriz. Yapmamız gereken tekşey tüm üye elemanlarımızın 0. offsetten itibaren memory'ye yerleşmelerini sağlamak.

[StructLayout(LayoutKind.Explicit)]
struct Coord
{
    [FieldOffset(0)]
    public int x;
    [FieldOffset(0)]
    public int y;
    [FieldOffset(0)]
    public long z;
}

---- x
---- y
---- ---- z
Bu sayede 8 byte'lık bir alanda 2 int bir de long türünden değişken saklayabiliyoruz ;) C 'deki union yapısına baya bir benzedi değil mi? Ha dersiniz ki ben gittim z ye 12 değerini atadım sonra gittim x'e 22 değerini atadım z'nin değeri şimdi ne oldu ? Bilmem ne oldu ? :) Aşağıdaki kodu biraz kurcalamakda fayda var.

public class Test
{
     static void Main(string[] args)
     {
         Coord c = new Coord();
         c.z = 2000000000;
         c.x = 20;
         Console.WriteLine(c.z);
     }
}

[StructLayout(LayoutKind.Explicit)]
struct Coord
{
     [FieldOffset(0)]
     public int x;
     [FieldOffset(0)]
     public int y;
     [FieldOffset(0)]
     public long z;
}



 
Categories: .NET | C# | Code | Inceleme

March 26, 2007
@ 01:17 AM

Msn'i biraz daha zevkli hale getirmek tamamen elimizdeymiş de haberim yokmuş ;) Peltek konuşmak mı yoksa karşıdaki size ne yazdı ise sizin de ona aynı cümlenin tersten yazılmışını göndererek sinir etmek mi istersiniz. ;) Ufak çaplı bir kod...

Projenize (ClassLibrary) öncelikle C:\Program Files\MSN Messenger\MessengerClient.dll 'i (Sevgili Özcan Değirmenci'nin geliştirdiği FOX Decompiler'i ile bu dll'i bir inceleyin derim) referans olarak ekliyorsunuz. Bir de geliştirdiğiniz AddIn'i Msn Messenger'e ekleyebilmek için -AddIn ekleme bölümü kapalı geliyor - Registry'deki HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger Key'ine AddInFeatureEnabled isimli DWORD Value ekleyip değerini 1 yapıyoruz.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Messenger;

public class Peltek:IMessengerAddIn
{
    MessengerClient m;
    public void Initialize(MessengerClient messenger)
    {
        m = messenger;
        m.AddInProperties.Creator = "Oğuz YAĞMUR";
        m.AddInProperties.Description = "Peltek konuştuvuv";

        messenger.OutgoingTextMessage += new EventHandler<OutgoingTextMessageEventArgs>(messenger_OutgoingTextMessage);
        messenger.IncomingTextMessage += new EventHandler<IncomingTextMessageEventArgs>(messenger_IncomingTextMessage);
    }

    void messenger_IncomingTextMessage(object sender, IncomingTextMessageEventArgs e)
    {

        //if (m.AddInProperties.Status == UserStatus.Busy)

        char [] ch = e.TextMessage.ToCharArray();
        Array.Reverse(ch);
        string ters = new string(ch);
        //m.SendTextMessage("Sevgili " + e.UserFrom.FriendlyName + " şu anda meşgulüm. Lütfen daha sonra konuşalım ;",e.UserFrom);
        m.SendTextMessage(ters,e.UserFrom);

    }

    void messenger_OutgoingTextMessage(object sender, OutgoingTextMessageEventArgs e)
    {
        //e.Cancel = true;
        string text = e.TextMessage;
        string yeni = "";
        foreach (string kelime in text.Split(new char[] { ' ' }))
        {
            yeni += kelime.Replace("r", "v").Replace("s", "ss") + " ";
        } 
        m.SendTextMessage(yeni, e.UserTo);
    }
}

Bu arada neden namespace'i yok bu projenin derseniz - ki namespace'siz olur mu? hani nerde global::Peltek demeyin sakın.Demek istediğim açık seçik ortada :) -  Msn'e eklemeye çalıştığımda AddIn'i Class ismi ile dosya isminin (Peltek.dll) aynı olmadığını - Sanırım Reflection kullanıo :p - söyleyip kızıyordu. Ben de Msn'in Reflection kullandığını düşünüp - ki başka ne düşündüğümü sormayın -  namespace i kaldırdığımda başarılı bir şekilde eklediğini gördüm :)
Size çalışırsa ne diyeyim ben beceriksizmişim ;)


 
Categories: Code

Windows servisi geliştirirken eğer sevisinizle beraber herhangi bir Form uygulaması da varsa ve servisinizin çalışma esnasında bu formun da görünmesini istiyorsanız sevisin özelliklerinden  " Allow service to interact with desktop " seçeneğini aktif yapmalısınız.



Tabi bunu kullanıcının değil de servis uygulamanızın yapması gerekiyor :) Fakat .net bunu yapabilecek bir imkan "henüz" sunmuyor. Bu durumda registry den sevisinizle ilgili Type değerinin 8. bitini 1 haline getirmeniz gerekiyor. Bunun içinde yapmanız gereken Type değerini 256 ile bitsel veya işlemine sokmaktır ki örnek kod aşağıda.

RegistryKey rootKey = Registry.LocalMachine;

RegistryKey subKey = rootKey.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\XXX\",true);
if (subKey != null)
{
    int typeVal = (int)subKey.GetValue("Type") | 256;
    subKey.SetValue("Type", typeVal);
}


 


 
Categories: Code



namespace CodeFn
{
    class Bisi
    {
        private int _hede;
        public int Hede {
            get { return _hede; }
            set { _hede = value; }
        }
        private string _hode;
        public string Hode {
            get { return _hode; }
            set { _hode = value; }
        }
        public Bisi(int hede, string hode)
        {
            Hede = hede;
            Hode = hode;
        }
        public override string ToString()
        {
            return Hede.ToString() + "-" + Hode;
        }
    }
    class HedeColl : List<Bisi>
    {
        public HedeColl()
        {
            Add(new Bisi(1, "elma"));
            Add(new Bisi(22, "muz"));
            Add(new Bisi(4, "portakal"));
        }
    }
    class Program
    {
        private static void Main(string[] args)
        {
            Predicate<Bisi> match = new Predicate<Bisi>(BulBakalim);
            List<Bisi> meyveler = new List<Bisi>(new HedeColl());
            Bisi bisi = meyveler.Find(match);
            if (bisi != null)
            {
                Console.WriteLine("Bulunan bisi [{0}]", bisi.ToString());
            }
            else
            {
                Console.WriteLine("bisi bulunamadı");
            }
        }
        public static bool BulBakalim(Bisi bisi)
        {
            if (bisi.Hode == "muz")
            {
                return true;
            }
            return false;
        }
    }
}


 
Categories: Code

February 5, 2007
@ 12:18 AM

Genelde içeriği bol olan sitelerde http://.../hede/hode/1 (*) gibi linklerin olduğunu görürüz. Bizler ise gendle http://.../hede/hode.aspx?bisi=1 gibi QueryString ifadelerinden yararlanarak içeriği kullanıcıya yansıtırız.


Peki asp.net'te (*) daki gibi bir kullanımı nasıl sağlarız. Bunun için HttpHandler dan yararlanmak lazım - dikkat ederseniz uzantı yok url'de. Bu durumda IIS hemen 404 hatasını yollayacaktır kullanıcıya-  Ama birçoğumuz sitelerimizde IIS'a müdahale edemiyoruz. Peki ne yapabiliriz bu durumda. En iyisi bir HttpModule yazıp linklerimizi http://.../hede/hode/1.aspx şeklinde düzenleyebiliriz. (Aslında yapmak istediğimiz http://.../hede/hode.aspx?bisi=1 dir.) Bunun için HttpContext sınıfının RewritePath metodundan yararlanabiliriz. HttpModule konusu ile ilgili bilgileri şurdaki linkten edinebilirsiniz.


using System;

using System.Collections.Generic;

using System.Text; using System.Web;

namespace rewmod

{

class hede : IHttpModule

{

public void Dispose(){}

public void Init( HttpApplication context ) {

    context.BeginRequest += new EventHandler(context_BeginRequest);

}

void context_BeginRequest( object sender, EventArgs e ) {

    string makalePattern = "makale/";

    string oldUrl = HttpContext.Current.Request.Path;

    int startIndex = oldUrl.IndexOf(makalePattern);

    if (startIndex != -1) {

        int endIndex = oldUrl.IndexOf(".aspx");

    if (endIndex != -1) {

        startIndex += makalePattern.Length;

    string makaleNumber = oldUrl.Substring(startIndex, endIndex - startIndex);

    HttpContext.Current.RewritePath("~/amac.aspx?id=" + makaleNumber);

}

}

}

}

}


web.config içeriği.

..

<system.web>

    <httpModules>

        <add name="hede" type="rewmode.hede"></add>

    </httpModules>

....


 
Categories: Code

Diyelim ki elinizde bir Type var. Bu Type'dan nesne oluşturmak isterseniz hemen Activator.CreateInstance(typeof(...),params) ile belirlediğimiz bir yapıcı metod ile  nesneniz oluşturulur. Bunun bir başka yolu için buyrunuz...

class A
{
    private int x;
    public void Hede()
    {
        Console.WriteLine(x);
    }
    public A()
    {
        Console.WriteLine("default");
    }
    public A(int a)
    {
        x = a;
    }
}
class Program
{
    private static void Main(string[] args)
    {
        Type t = typeof(A);
        ConstructorInfo ci = t.GetConstructor(new Type[] {typeof(int)});
        A a = (A)ci.Invoke(new object[] {2});
        a.Hede();
    }
}


 
Categories: Code

System namespace altında Number isimli bir internal class olduğunu bu class içinde IsWhite isimli private static metod olduğunu ve bu metodun da aşağıdaki kod ile çağrılabildiğini biliyoruz ;)



Assembly [] a = AppDomain.CurrentDomain.GetAssemblies();

Type type = a[0].GetType("System.Number"); // a[0] = mscorlib

MethodInfo mi = type.GetMethod("IsWhite", BindingFlags.NonPublic | BindingFlags.Static);

Console.WriteLine(mi.Invoke(null, new object[] { '\t'}));

 


Ben olsam bir de Char Type'ının static üye elamanlarına bakardım. Belki IsWhiteSpace isimli aynı işi yapam bir metoda rastlama ihtimalini değerlendirirdim.


 
Categories: Code

Belki şimdiye kadar dikkatinizi çekmemiş yada gözden kaçırmış olabilirsiniz. Belki de "ikisi de aynı Cache'e ekleme yapıyor" diye de düşünüp ikisinden birisini alışkanlık edinip kullanıyor olabilirsiniz. Ama ikisi arasında ince ama çok önemli bir fark var.


Öncelikle bu iki metodun imzalarına (signature) bakarsak ; (imzalara geri dönüş değerleri dahil edilmez)

public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
public object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);


aynı gibi görünsede işlev olarak farklılar.


Insert metodunun geridönüş değeri yokken, Add metodu object türünden bir geridönüş değerine sahip. Bu da şu demektir.
Eğer siz bir nesneyi Add metodu ile Cache'e eklemek istediğinizde, Cache'de daha önceden aynı key ile saklanmış bir nesne varsa size daha önceden Cache'e atılmış nesneyi geri döndürür. Cache'de aynı key'e ait  bir nesne yoksa null değer döndürür ve eski nesne korunur - aslında siz Cache'deki belirli bir key'e ait nesneyi güncellemek isterken sürekli Cache'e ilk eklenen nesnenin varolduğunu göreceksiniz - . Oysa Insert metodunda durum farklıdır. Insert metodunu kullanarak Cache'e bir nesne eklemek istediğinizde, eğer daha önceden aynı key ile eklenmiş bir nesne varsa eski değer yerine yenisi konulur (güncellenir), yoksa da belirlediğiniz key ile Cache'e yeni bir nesne eklenir.



string


strData = TextBox1.Text;

//eğer daha onceden hede keyine ait bir nesne Cache'de var ise o nesnesi önceki neseneyi verir. Yoksa da - ilk defa hede key'i ile Cache'e ekleme yapılıyorsa null değere sahip olur
//object
o = Cache.Add("hede", strData, null, DateTime.MaxValue, TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal, null);

//her ekeleme işleminden sonra hede Cache'deki hede key'ine ait nesne güncellenmiş olur.
//Cache.Insert("hede", strData, null, DateTime.MaxValue, TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal, null);
Response.Write((string)Cache["hede"]);

 
Categories: Code

August 22, 2006
@ 12:00 AM

#include <stdio.h>


#define LEN 256


int main()


{


    char *pMail = malloc(sizeof(int) * LEN);



    printf ("mail : ");


    gets(pMail);


    while(*pMail)


    {


        printf("%c%x",'%', *(pMail++));


    }
    free(pMail);


}


 yani :


<a href=mailto:%62%69%6c%6c%67%61%74%65%73%40%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d>Bill Gates</a>


 
Categories: Code

August 18, 2006
@ 12:00 AM

Can sıkıntısı! Eskiye,düşünmeye, yazmaya özlem


static void Main(string[] args)
{
 string harf = "i'm the superstar";
 byte[] bytes = System.Text.Encoding.ASCII.GetBytes(harf);


 for (int j = 0; j < bytes.Length; j++)
 {
         for (int i = 7; i >= 0; i- -)
         {
                if(((bytes[j] >> i) & 1) == 1)
                        Console.Write("1");
                else
                        Console.Write("0");
         }
  }   
}


01101001001001110110110100100000011101000110100001100101001000000111001101110101
01110000011001010111001001110011011101000110000101110010


 
Categories: Code

August 18, 2006
@ 12:00 AM

Örnek uygulamayı buradan deneyebilirsiniz. Kaynak kodunu da buradan indirebilirsiniz.


//opener.aspx
protected void Page_Load(object sender, EventArgs e)
{
        Button1.Attributes.Add("onClick", "window.open('child.aspx?io1=TextBox1&io2=TextBox2','Pencerem','width=180,height=120')");
}

.................... 
//child.aspx
<script type="text/javascript" language="javascript">
        function arkayayolla(deger1,deger2,io1,io2)
        {
            window.opener.document.getElementById(io1).value=deger1;
            window.opener.document.getElementById(io2).value=deger2;
        }
 </script>
...................


 


//child.aspx.cs
protected void Button1_Click(object sender, EventArgs e)
{
        Label1.Text = "<script>arkayayolla('" + TextBox1.Text + "','" + TextBox2.Text + "','" + Request.QueryString["io1"] + "','" +        Request.QueryString["io2"] + "')</script>";
}


 
Categories: Code

July 11, 2006
@ 12:00 AM
Bu linkte 193 farklı programlama dilinde "Merhaba Dünya" denmiş. Cidden ilginç olanlar da yok değil (1, 2 , 3) Hele bir de bu var ki! Dil hakkında yeterli bilgiyi sanırım dilin ismi yeterince açıklıyor.
 
Categories: Code

July 6, 2006
@ 12:00 AM

How many people can read hex if only you and dead people can read hex?


cevap : 57006


çözüm :
DEAD  = 57005  + 1(kendin) = 57006


Güzel bir tişört!


 
Categories: Code

Personeller yaşına göremi sıralansın yoksa isimlerine göre mi ? Array sınıfının Sort metoduna istediğimiz  kritere göre sıralama yapmasını söyleyebilir miyiz? Buyrun...

class Program
{
    private static void Main(string[] args)
    {
        Personel[] mudurler = {new Personel("ali", 33), new Personel("kaan", 22), new Personel("cemil", 32)};
        Array.Sort(mudurler);
        foreach (Personel p in mudurler) {
            Console.WriteLine(p.Name);
        }
    }
}
class Personel : IComparable
{
    private string mName;
    public string Name {
        get { return mName; }
        set { mName = value; }
    }
    private int mYas;
    public int Yas {
        get { return mYas; }
        set { mYas = value; }
    }
    public int CompareTo(object obj)
    {
        Personel p = (Personel)obj;
        return mYas.CompareTo(p.Yas);
    }
}

// Yaşa göre sıralamak için
public int CompareTo(object obj)
{
    Personel p = (Personel)obj;
    return mName.CompareTo(p.mName);
}
public Personel(string name,int yas)
{
    mName = name;
    mYas = yas;
}



 
Categories: Code

July 3, 2006
@ 12:00 AM

Metod parametre olarak sizden delegate mi istiyor? o  zaman biz de verelim!

public delegate void Thing(int hede);
public static void Test(Thing wak,int c)
{ wak(c);
}
static void Main(string[] args)
{
    Test(delegate(int hede){Console.WriteLine("WakWak {0}",hede);},3);
}

 



 

 
Categories: Code