Respond needs javascript to run. To find out more click here
yuhubaa » Serdar Demir
RSS
 

Author Archive

C# generic tiplerde constraint kullanımı

06 Oca

C# generic tiplerde constraint kullanımı
Genericler .net 2.0 ile hayatımıza girdi. Şu aralar web projelerimde kullanmak için kendi altyapımı oluşturuyorum ve generic bir base class yapmam gerekiyor. Design patternlari inceledigim de hep complex code tipleri ile karşılaştım( zaten anlaması zor konular )

class Base { }
class Test
    where U : struct
    where T : Base, new() { }

Genericler bildigimiz gibi T türünden tanımlarsınız ve siz ne verirseniz onun türünden olurlar Yukarıdaki kod ilk bakışta complex geliyor alışık olmadığımız generic class yapıları var. Generic classlarda where kullanabiliyoruz peki bize ne faydası var bunun eğer classlarının oluşturulurken yani constructior lar çağırılırken diyelim ki bu T türü bir struct olmalı veya disposable, iquaryable olmalı gibi kısıtlamalar eklemek istenilebilir. Msdn de buldugum çeşitli constraintleri tablosu

Constraint Description
where T: struct The type argument must be a value type. Any value type except Nullable can be specified. See Using Nullable Types (C# Programming Guide) for more information.
where T : class The type argument must be a reference type, including any class, interface, delegate, or array type. (See note below.)
where T : new() The type argument must have a public parameterless constructor. When used in conjunction with other constraints, the new() constraint must be specified last.
where T : <base class name> The type argument must be or derive from the specified base class.
where T : <interface name> The type argument must be or implement the specified interface. Multiple interface constraints can be specified. The constraining interface can also be generic.
where T : U The type argument supplied for T must be or derive from the argument supplied for U. This is called a naked type constraint.

 

Bir örnek yapalım;

using System;
using System.Data;
using System.Runtime.Serialization;

class Listem where T : ISerializable
{
}
class MyStruct where T : struct
{
}
class Sinif where V : class, new()
{
}
class Test
{
}
class Program
{
    static void Main()
    {
        // T türüne karşılık gelen  ISerializable türünden implemente edilmiş olmak zorunda
        Listem _listem = new Listem();
        Listem() llll=new Listem();
        // Int türü struct türünde ve düzgün compile edecek
        MyStruct python = new MyStruct();
        //Parametresiz bir class olmalı
        Sinif test = new Sinif();
    }
}

Yukarıdaki kodda Listem generic sınıfı serialize edibilir olmalı diyorum eğer class a bu constrainti vermeseydik <int>verdigimizde de çalışacaktı fakat <int> Ienumarable bir tür ISerializable olmadıgı için aşağıdaki hatayı verdi.
2. Örnek te ise new oluşturlacak bu generic class bir struct olmalı diyorum
3. class ta ise yapılmak istenen aslında default constructior ile alakalı bir durum bildigimiz gibi biz yazmasakta .net default constructiori oluşturuyor. where V : class, new() diyerek T türü parametre almayacak bir class olmalı diyoruz.

 
No Comments

Posted in Asp.net, C#

 

.net in en kullanışlı sınıfları ve özellikleri

30 Kas

.net in en kullanışlı sınıfları ve özellikleri

.net framework bildigimiz gibi bir çok sınıfı barındırıyor bunlardan bazıları saatlerce debelnemekten bizi kurtaran sınıflar bir asp.net developer  olarak  kullananlar bilir mesela bir path onune @ ~ ../ gibi karakterler koymak Server.mappath   kullanmak işimizi zorda olsak işimizi çözer ama bir yandan da en çok hataya bu tarz string birleştirme path yanlışlıkları yol açar.

public string GetFullPath(string filename)

{

string folder = ConfigurationManager.AppSettings["upload"];

return System.IO.Path.Combine(folder, filename);

}

 

Bunun yerine Path.Combine kullanarak hatanın ve ozel karakterlerin önune geçebiliriz.

 

Veya
string fileName = Path.GetFileName(fullPath);

 

 

System.Web.VirtualPathUtility sınıfı

~ lı bir adresi çözmek için kullanabileceğim bir sınıf

string path = VirtualPathUtility.ToAbsolutePath("~/UserControl/serdar.ascx");

 

//çıktısı /SD/firsatseninle/ UserControl /serdar.ascx.

 

Bunların dısında asp.net te script ve html tagları hep problem olmaktadır(site hack meta tag vs :D ) normal sartlarda asp.net <’”% gibi işaretler girildiginde bir exception fırlatır ve işlemi sonlandırır bunu sayfanın propertieslerinden açabilirsiniz ama yapmayın J html decode ve html encode işlemleri için System.Web.HttpUtility sınıfını kullanıyoruz bu sınıf sayesinde <p style=”color:red;”>serdar</> gibi ibir ifadeyi iştersek html encode edebilir istersek decode yapabilir o kısmın kırmızı yazılmasını sağlayabilirz.

 

Encode =&lt;p&gt;&amp;&lt;/p&gt;

Decode da ise serdar

 

Yaptıraibliriz. Burda soyle bir ornek vereyim databaseden bir string çekiyorsunuz ve string içerisinde html tagları var isterseniz stilli halde getirebilir isterseniz html etiketlerini zarar vermeyecek şekile getirebilirsiniz.

 

 

System.Environment sınıfı

 

//ilk kullanım

string s = “booo\r\n”;

//ikinci kullanım

string s = ” booo” + Environment.NewLine;

 

yukarıdaki iki kod örneği de aynı işlemi yapar fakat işletim sistemi farklılıkları bolge dil( kültür J) farklılıkları probleme yol açabilir bu yüzden msdn de 2. Kullanım gibi tavsiye ediliyor.

Bunların yanısıra datetime time ile ilgilide bir çok kullanışlı sınıf mevcut hatta bir iş görüşmemde bana sorulan bir soruda hatfaınn ilk gununu bulmam ve ona göre işlemler yapmam istenmişti araştırıken msdn de şu kaynağı buldum

 

DateTime dt = new DateTime(2003, 5, 1);

Console.WriteLine(“Is Thursday the day of the week for {0:d}?: {1}”,

dt, dt.DayOfWeek == DayOfWeek.Thursday);

Console.WriteLine(“The day of the week for {0:d} is {1}.”, dt, dt.DayOfWeek);

(http://msdn.microsoft.com/tr-tr/library/system.dayofweek.aspx)

 

 
1 Comment

Posted in Asp.net, C#

 

C# Nullable Types

02 Kas

Veritabanı ile işlemler yaparken parametrelerin null gelme ihtimalleri durumunu da goze onunde bulundurmak gerekir bunu pl/sql t/sql ile veritabanın tarafında yapabilirsiniz ama kod tarafını da buna uygun duzenlemeniz gerekir. Null olması ile ” veya 0 aynı şeyler demek değildir ! buna dikkat etmek gerekir

Örneğin

//nullable type propertilerde kullanımı
public decimal? KimlikNo
{
get { return kimlikNo; }
set { kimlikNo = value; }
}private decimal? kimlikNo;

buı şekilde parametre mizi tanımlarsak parametreleri atarkenaşağıdaki gibi kullanabiliriz. Nullable alan tanımlamak için ? operatorörünü kullanıyoruz  Bunu yapmazsak null atayamayız

Nullable                                                                                  Not Nullable

MyClass.KimlikNo= null;                                                    MyClass.KimlikNo= null;

 

 
1 Comment

Posted in C#