override ve new

Bu yazıda override ve new sözcüklerinin ne işe yaradığını öğreneceğiz. Hepimizin bildiği gibi sınıflar kalıtım ile birbirinden türetilebilir. Türetilen sınıf, türediği sınıfın tüm özelliklerini kalıtım yolu ile devralır. Devralınan metotları farklı bir biçimde kullanmak istiyorsak bunu override ile yapabiliriz. Devralınan metotla aynı isimde fakat farklı bir metot tanımlamak istersek bunu new ile yapabiliriz. Aşağıdaki örneği çalıştırdığımızda program ekrana alt alta iki kere B yazdırmaktadır.

using System;

namespace ConsoleApplication1
{
    public class A
    {
        public virtual void Display()
        {
            Console.WriteLine("A");
        }
    }

    public class B : A
    {
        public override void Display()
        {
            Console.WriteLine("B");
        }
    }

    public class C : B
    {
        public new void Display()
        {
            Console.WriteLine("C");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            A a = new B();
            a.Display();

            a = new C();
            a.Display();

            Console.ReadKey();
        }
    }
}

Dosya MD5 Hesaplama

MD5 (Message-Digest algorithm 5), veri bütünlüğünü test etmek için kullanılan, Ron Rivest tarafından 1991 yılında geliştirilmiş bir kriptografik özet (tek yönlü şifreleme) algoritmasıdır. Girdi, verinin boyutundan bağımsız olarak 128 bitlik özetler üretir.

Herhangi bir dosyanın MD5’ini almak için aşağıdaki metodu kullanabilirsiniz.

public static string GetMD5Hash(string fileName)
{
FileStream file = new FileStream(fileName, FileMode.Open);

MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();

StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return sb.ToString(); } [/csharp]

Bilgisayar Tarihi

  • Univac Univac
  • Mark I Mark I
  • Eniac Eniac
  • Hactor Hactor
     

İlk Kuşak: Vakum Tüpleri (1942-1956)

ENIAC gibi ilk elektronik bilgisayarlar vakumlu tüp olarak bilinen teknolojiye dayanmaktadır. Bu kuşakta yazılım diye bir şey yoktu. Teknolojinin çoğu donanıma dayanıyordu.

İkinci Kuşak: Transistörler (1956-1963)

İkinci kuşak bilgisayarlarda vakum tüplerinin yerine yarı iletken materyallerden yapılan transistörler kullanıldı. Bu kuşak yazılım kavramını ortaya çıkarmıştır.

Üçüncü Kuşak: Entegre Devreler (1964-1971)

Bu kuşakta transistorlardan yonga (chip) adı verilen entegre devrelere geçildi. Yongalar içinde elektronik devreleri içeren küçük kare parçalardır. Genellikle silikondan ve ileri teknoloji kullanılarak üretilirler.

Dördüncü Kuşak: Mikro Devreler (1971-?)

1970’li yıllarda entegre devreler iyice küçülmeye devam etmiştir. Bu işlem büyük çapta tümleşme (very large scale entegration) olarak adlandırılmıştır.

Beşinci Kuşak:

Beşinci kuşak bilgisayarlar özellikle yeni teknolojilerin kullanıldığı ve buna bağlı olarak hızlı çalışan ve daha akıllı bilgisayarlar geliştirilecek. Yapay zekaya sahip olan bu bilgisayarlar yaşamımıza daha çok girecekler.

Triple DES Şifreleme

Elektronik ödeme sistemlerinde sıklıkla kullanılan TDEA(Data Encryption Algorithm) veya genel adıyla Triple DES şifreleme ve şifre çözme yapabilen java ve C# sınıfları aşağıdadır. Şifreleme işlemi yapıldıktan sonra veri Base64 kodlandığı için web servisleri üzerinden gönderilebilir.

package project1;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

public class TripleDes {

    public String encrypt(String message, String key) throws Exception {
        // Create secret key
        byte[] bKey = new byte[24];
        for (int i = 0; i < key.length() && i < bKey.length; i++) {
            bKey[i] = (byte)key.charAt(i);
        }
        SecretKey secretKey = new SecretKeySpec(bKey, "DESede");

        // Initialize encoder
        Cipher desCipher = Cipher.getInstance("DESede");
        desCipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // Encode DESede
        byte[] byteCipherText = desCipher.doFinal(message.getBytes());

        // Encode BASE64 and return
        return new BASE64Encoder().encode(byteCipherText);
    }

    public String decrypt(String message, String key) throws Exception {
        // Create secret key
        byte[] bKey = new byte[24];
        for (int i = 0; i < key.length() && i < bKey.length; i++) {
            bKey[i] = (byte)key.charAt(i);
        }
        SecretKey secretKey = new SecretKeySpec(bKey, "DESede");

        // Initialize decoder
        Cipher desCipher = Cipher.getInstance("DESede");
        desCipher.init(Cipher.DECRYPT_MODE, secretKey, desCipher.getParameters());

        // Decode BASE64
        byte[] decodedMessage = new BASE64Decoder().decodeBuffer(message);

        // Decode DESede and return
        return new String(desCipher.doFinal(decodedMessage));
    }
}
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Project1
{
    internal static class TripleDes
    {
        internal static string Decrypt(string cipher, string key)
        {
            byte[] cipherBytes = Convert.FromBase64String(cipher);

            MD5CryptoServiceProvider md5Csb = new MD5CryptoServiceProvider();
            byte[] keyBytes = md5Csb.ComputeHash(Encoding.UTF8.GetBytes(key));

            string decryptedData;

            using (MemoryStream ms = new MemoryStream())
            {
                TripleDES tdes = TripleDES.Create();
                tdes.Key = keyBytes;
                tdes.Mode = CipherMode.ECB;
                using (CryptoStream cs = new CryptoStream(ms, tdes.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                    cs.FlushFinalBlock();
                    byte[] messageBytes = ms.ToArray();
                    decryptedData = Encoding.UTF8.GetString(messageBytes);
                }
            }

            return decryptedData;
        }

        internal static string Encrypt(string message, string key)
        {
            byte[] messageBytes = Encoding.UTF8.GetBytes(message);

            MD5CryptoServiceProvider md5Csb = new MD5CryptoServiceProvider();
            byte[] keyBytes = md5Csb.ComputeHash(Encoding.UTF8.GetBytes(key));

            string encryptedData;
            using (MemoryStream ms = new MemoryStream())
            {
                TripleDES tdes = TripleDES.Create();
                tdes.Key = keyBytes;
                tdes.Mode = CipherMode.ECB;
                using (CryptoStream cs = new CryptoStream(ms, tdes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(messageBytes, 0, messageBytes.Length);
                    cs.FlushFinalBlock();
                    byte[] cipherBytes = ms.ToArray();
                    encryptedData = Convert.ToBase64String(cipherBytes);
                }
            }

            return encryptedData;
        }
    }
}

Cursor Kullanımı

Bir sonuç kümesinden, satırları almak için kullandığımız işaretçiye CURSOR denir. SELECT komutundan dönen sonuçları ifade eden veri yapısı olarakta düşünebiliriz. Cursor kullanırken dikkatli olmak gerekir. Eğer çok fazla cursor açılır ve kapatılmazsa “ORA-0100: Maximum open cursors exceeded” hatası verebilir.

DECLARE
  CURSOR cur_1 IS
         SELECT tablo_adi FROM tablolar;
  v_tablo_adi tablolar.tablo_adi%TYPE;
  v_sayi INTEGER := 1;
BEGIN
  OPEN cur_1;
  LOOP
     FETCH cur_1 INTO v_tablo_adi;
     IF cur_1%notfound OR v_sayi > 2000 THEN
       EXIT;
     END IF;
     v_sayi := v_sayi + 1;
  END LOOP;
  IF cur_1%ISOPEN THEN
     CLOSE cur_1;
  END IF;
  DBMS_OUTPUT.put_line('Islenen satir sayisi: '||v_sayi);
END;

Kontrolün Özelliğini Properties.Settings’e Bağlamak

Kontrolün herhangi bir özelliğini Properties.Settings’e bağlayarak, az kod ile çok iş yapmak mümkün. Aşağıdaki örnekte CheckBox’ın IsChecked özeliği Properties.Settings’te tanımlı Bool1’e, TextBox’ın Text özelliği ise yine Properties.Settings’te tanımlı String1’e bağlanmıştır. Böylece otomatik olarak değişimler birbirine yansıyacaktır.

<Window x:Class="WpfApplication1.MainWindow"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:Properties="clr-namespace:WpfApplication1.Properties"
   Title="MainWindow" Height="350" Width="525">
   <Grid>
      <CheckBox Content="CheckBox" Height="16" HorizontalAlignment="Left" Margin="12,12,0,0" Name="checkBox1" VerticalAlignment="Top" IsChecked="{Binding Path=Bool1, Source={x:Static Properties:Settings.Default}}" />
      <TextBox Height="23" HorizontalAlignment="Left" Margin="12,34,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=String1, Source={x:Static Properties:Settings.Default}}" />
   </Grid>
</Window>

String Format Kodları

Sayılar:
Specifier Type Format Output (Passed Double 1.42) Output (Passed Int -12400)
c Currency {0:c} $1.42 -$12,400
d Decimal (Whole number) {0:d} System.FormatException -12400
e Scientific {0:e} 1.420000e+000 -1.240000e+004
f Fixed point {0:f} 1.42 -12400.00
g General {0:g} 1.42 -12400
n Number with commas for thousands {0:n} 1.42 -12,400
r Round trippable {0:r} 1.42 System.FormatException
x Hexadecimal {0:x4} System.FormatException cf90

Özel Sayı Biçimlendirme:
Specifier Type Example Output (Passed Double 1500.42) Note
0 Zero placeholder {0:00.0000} 1500.4200 Pads with zeroes.
# Digit placeholder {0:(#).##} (1500).42
. Decimal point {0:0.0} 1500.4
, Thousand separator {0:0,0} 1,500 Must be between two zeroes.
,. Number scaling {0:0,.} 2 Comma adjacent to Period scales by 1000.
% Percent {0:0%} 150042% Multiplies by 100, adds % sign.
e Exponent placeholder {0:00e+0} 15e+2 Many exponent formats available.

Tarihler:
Specifier Type Example (Passed System.DateTime.Now)
d Short date 10/12/2002
D Long date December 10, 2002
t Short time 10:11 PM
T Long time 10:11:29 PM
f Full date & time December 10, 2002 10:11 PM
F Full date & time (long) December 10, 2002 10:11:29 PM
g Default date & time 10/12/2002 10:11 PM
G Default date & time (long) 10/12/2002 10:11:29 PM
M Month day pattern December 10
r RFC1123 date string Tue, 10 Dec 2002 22:11:29 GMT
s Sortable date string 2002-12-10T22:11:29
u Universal sortable, local time 2002-12-10 22:13:50Z
U Universal sortable, GMT December 11, 2002 3:13:50 AM
Y Year month pattern December, 2002

Özel Tarih Biçimlendirme:
Specifier Type Example Example Output
dd Day {0:dd} 10
ddd Day name {0:ddd} Tue
dddd Full day name {0:dddd} Tuesday
f, ff, … Second fractions {0:fff} 932
gg, … Era {0:gg} A.D.
hh 2 digit hour {0:hh} 10
HH 2 digit hour, 24hr format {0:HH} 22
mm Minute 00-59 {0:mm} 38
MM Month 01-12 {0:MM} 12
MMM Month abbreviation {0:MMM} Dec
MMMM Full month name {0:MMMM} December
ss Seconds 00-59 {0:ss} 46
tt AM or PM {0:tt} PM
yy Year, 2 digits {0:yy} 02
yyyy Year {0:yyyy} 2002
zz Timezone offset, 2 digits {0:zz} -05
zzz Full timezone offset {0:zzz} -05:00
: Separator {0:hh:mm:ss} 10:43:20
/ Separator {0:dd/MM/yyyy} 10/12/2002

Numaralandırmalar:
Specifier Type
g Default (Flag names if available, otherwise decimal)
f Flags always
d Integer always
x Eight digit hex.

Bazı Faydalı Örnekler:
String.Format(“{0:(###) ###-####}”, 8005551212); => (800) 555-1212

BusyIndicator Kullanımı

Extended WPF Toolkit içinde işe yarayan birçok kontrol var. BusyIndicator kontrolü bunlardan sadece biri. Aşağıdaki gibi kullanılabilir.

<Grid>
   <extToolkit:BusyIndicator x:Name="_busyIndicator">
      <Button Click="Button_Click">Start Process</Button>
   </extToolkit:BusyIndicator>
</Grid>
private void Button_Click(object sender, RoutedEventArgs e)
{
   BackgroundWorker bw = new BackgroundWorker();
   bw.DoWork += (o, ea) =>
   {
      Thread.Sleep(3000);
   };
   bw.RunWorkerCompleted += (o, ea) =>
   {
      _busyIndicator.IsBusy = false;
   };
   _busyIndicator.IsBusy = true;
   bw.RunWorkerAsync();
}

MultiBinding ve StringFormat

.NET Framework 3.5 SP1 ile gelen özelliklerden biri, ilişkili değerleri kolay biçimlendirmeyi sağlamak için, {{Binding}} ifadeler içinde kullanılabilen StringFormat desteğidir. MultiBinding ile birlikte kullanımı ile ilgili örnek aşağıdadır. Bu örnekte TextBlock’un Text özelliği Name ve Surname adlı iki özelliğe birden bağlanmıştır.

<TextBlock>
   <TextBlock.Text>
      <MultiBinding StringFormat="{}{0} {1}">
         <Binding Path="Name" />
         <Binding Path="Surname" />
      </MultiBinding>
   </TextBlock.Text>
</TextBlock>