C# Virtual Nedir?

C# Virtual Nedir?

Virtual (sanal metod) ‘lar kalıtıldığı sınıflarda içeriği değiştirilebilen metodlardır. Yani temel sınfımız da bir method oluşturuyoruz. Bu methodun içeriğini ileride değiştirme ihtiyacı duyuyoruz bu gibi durumlarda methodumuza virtual anahtar kelimesini ekleyerek override (ezmek) etmeye olanak tanımış oluyoruz. Bir örnek ile anlatırsak daha iyi olabilir.

Virtual metodları aslında bir çok yerde kullanabiliriz, ama genel olarak kullanım şekilleri aşağıdaki gibidir.

  • Sadece metod isimlerini belirteceğimiz bir classımız olsun, metodların ne işlev yapacağını diğer classlarda belirtecek isek Virtual metod kullanırız.
  • Birden çok Class larımızın, aynı anlama gelen metodları varsa, bu metodu Virtual olarak tanımlarız.
  • Yazılımda standartlaşmak önemlidir, eğer geliştirilen uygulamamızın farklı modüllerinde, metod isimlerimizin aynı olması isteniyorsa, yine Virtual metod kullanırız.

Örneğimizi İnceleyelim;

public class Cizim
{
    public int sayi { get; set; }
    public virtual void Draw()
    {
        //Draw methodunu virtual olarak yazıyorum ki daha sonra içeriği değiştirilebilsin.
        Console.WriteLine("Ben cizim nesnesiyim");
     }
}

public class cizgi : Cizim
{
    public override void Draw()
    {
        //Override etmeden önceki kodu çalıştırç
        base.Draw();
        Console.WriteLine("Ben cizim nesnesiyim-----------------");
     }
}

Çıktısı;
override
Örneğimizde Çizim nesnesindeki Draw methodunu override ederek içeriğini değiştiriyoruz.

Access Modifiers (Erişim Belirleyiciler) Nedir?

Erişim belirleyiciler, tanımlı değerlerin kod blokları içerisinde nereden erişilip erişileyemeceğini belirlememizi sağlamaktadır. Erişim belirleyicilerinin kullanım şekilleri aşağıdaki gibidir. C# ta 5 Erişim Belirleyici vardır;

  • public
  • private
  • protected
  • internal
  • protected internal

Private
Bir değer private olarak tanımlanırsa sadece tanımlı olduğu o class içerisinden erişileceği anlamına gelmektedir. Başka bir class içerisinden erişim sağlanamamaktadır.
Eğer tanımlanan bir tipin (class, değişken, metod, fonksyion) erişim belirteç tipi belirtilmezse varsayılan belirteç türü private olarak tanımlanmaktadır.

Public
Public olaran tanımlanan değerlere kod içerisinde her yerden erişim sağlanabilmektedir. Herhangi bir kısıtlama yoktur.

Protected
Protected olarak tanımlanan değerlere tanımlandığı class içerisinden veya türetilmiş(inherit edilmiş) olan diğer class’ lar içerisinden erişim sağlanmaktadır. İlgili class haricinde erişim halinde private olarak işlem görür ve erişim sağlanamamaktadır. ReadOnly’den farkı sadece inherit edilen classların içerisinden ulaşılabilmesidir, diğer classlardan ulaşılamaz ve görüntülenemez.

Internal
Internal olarak tanımlanan değerlere Assembly’ nin tüm alanlarından erişmek mümkündür. Fakat internal olarak tanımlanan değerlere farklı bir Assembly içerisinden erişim sağlanamamaktadır.

Protected Internal
Protected Internal olarak tanımlanan değerlere tanımlandığı class içerisinden ve türetilmiş olduğu diğer class’lar içerisinden erişim sağlanabilmektedir. Ayrıca farklı bir Assembly(Uygulama) içerisinde Protected Internal değerinin tanımlandığı class’ tan türetilmiş başka bir class içerisinden ilgili değere erişim sağlanabilmektedir. Bu erişim belirleyicisi protected ve internal belirleyicilerinden herhangi birisinin şartları sağlanmışsa yani öğeye tanımlandığı class içerisinden veya türetilmiş classlar içerisinden ya da aynı assembly içerisinden erişilebilir.

C# ta class ve struct lar için bir erişim belirleyicisi belirtilmez ise varsayılan olarak internal tanımlıdır, aynı zamanda class seviyesinde tanımlanan öğeler de (değişken, metot gibi) yine varsayılan olarak private erişim belirleyicisi ile tanımlanırlar. Burada bir noktayı belirtmekte fayda vardır; struct lar türetmeye girmedikleri ve desteklemedikleri için struct içerisindeki öğeler protected ve protected internal erişim belirleyicilerini alamazlar.

Kan Grupları Hakkında Bilinmesi Gerekenler

Kanlar, ana olarak A,B,AB ve 0 olmak üzere 4 gruba ayrılırlar. Bu ana grupların yanı sıra ara gruplar olduğu gibi, RH olarak RH (+) Pozitif, RH (-) Negatif olarak isimlendirilen etkenlerde bulunur. Hangi kan grubu hangi kan grubundan kan alabilir-verebilir ve ana grupların özellikleri nedir?

Kan grupları hakkında bilinmesi gerekenler:
Kan Grubu Nedir ?
İnsan kanında bulunan antikorlara bakılarak kanın özelliğini belirtmek amaçlı oluşturulmuş şemasal sınıflandırma sistemidir.

A Grubu
Bu grup başka gruba kan veremiyorken, hem kendi gruplarından hem de 0 grubundan kan alabilirler.

B Grubu
Bu grup A grubu gibi başka gruba kan veremiyorken, hem kendi gruplarından hem de 0 grubundan kan alabilirler.

AB Grubu
Genel alıcılar” olarak adlandırılan bu grup, herkesten kan alabilirler.

0 Grubu
Genel verici” olarak adlandırılan bu grup, belirli miktarda her gruba kan verebilirler.

RH Etkeni
Anne ve babada bu etken uyuşmazlık yaratırsa, ölüm tehlikesine yol açabilir.

Kan Uyuşmazlığı Nedir?
Anne adayı RH(-), baba adayının kanının da RH(+) pozitif olması durumuna RH uygunsuzluğu yani Kan Uyuşmazlığı denir.

Kan ile ilgili sayısal verilere bakıldığında:
-Her 100 kişiden 40’ı 0 RH pozitif,
-Her 100 kişiden 7’si 0 RH negatif,
-Her 100 kişiden 34’ü A RH pozitif,
-Her 100 kişiden 6’sı A RH negatif,
-Her 100 kişiden 8’i B RH pozitif,
-Her 100 kişiden 1’i B RH negatif,
-Her 100 kişiden 3’ü AB RH pozitif,
-Her 100 kişiden 1’i AB RH negatif kan grubuna sahip olduğu gözlenmiştir.

kan-grubu-uyum-tablosu_tcm3238-617455

HttpWebRequest Error : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
HttpWebRequest nesnesini kullanarak herhangi bir https adresine bağlanmanız durumunda yukarıdaki hatayı alabilirsiniz. yapmanız gereken aşağıdki kod bloğunu webrequest.create(uri) kod satırından önce yazmak olacaktır.

 System.Net.ServicePointManager.ServerCertificateValidationCallback =
                    delegate(object s,System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                     System.Security.Cryptography.X509Certificates.X509Chain chain,
                     System.Net.Security.SslPolicyErrors sslPolicyErrors)
            { return true; };

İstemediğiniz IP adreslerini engelleyin

Merhaba arkadaşlar, bu dersimizde sizlere web sitezin güvenliği için istemediğiniz IP adreslerinden sitenize girişleri engellemeniz için gerekli kodları vereceğim.Bu kodları .htaccess dosyanıza yazmanız gerekecektir.Bu şekilde rahatsız olduğunuz IP adreslerinin sitenize erişimini engelleyebilirsiniz. Kodlar şöyle ki;

order allow,deny
allow from all
deny from 78.168.29.147

Bu kodlar ile 78.168.29.147 IP adresinden çıkış yapan kişiler sitenize erişemezler.Ancak Proksi.org ya da Proksi.us kullanarak sitenize erişebilirler.Birden çok IP adresi engellemek isterseniz şu şekilde olacak

order allow,deny
allow from all
deny from 78.168.29.147
deny from 45.126.56.2
deny from 172.4.13.22

HtmlAgilityPack ile html parsing

Basit parser işlemi yapmak için kullanışlı bir paket.
HtmlAgilityPack DLL burdan indirebilirsiniz

private void button1_Click(object sender, EventArgs e) 
{
     Uri url = new Uri("http://www.w3schools.com/htmldom/default.asp");
     WebClient client = new WebClient();
     string html = client.DownloadString(url);     
    // Adresten istek yapı html kodlarını indiriyoruz.     
    
    HtmlAgilityPack.HtmlDocument dokuman = new HtmlAgilityPack.HtmlDocument();     
    dokuman.LoadHtml(html);     
    // İndirdiğimiz html kodlarını bir HtmlDocment nesnesine yüklüyoruz.     
    HtmlNodeCollection basliklar = dokuman.DocumentNode.SelectNodes("//h2[@class='tutheader']");     
    // Html dökümanı içndeki h2 etiketlerinden class'ı  tutheader olanları liste halinde alıyoruzç     
    foreach (var baslik in basliklar)     
    {         
        listBox1.Items.Add(baslik.InnerText);     
        // Biraz önceki basliklar koleksiyonunu tek tek gezerek, her bir elemanının içindeki text'i alıyoruz     
    }
}

XMLHttpRequest ile Resim Kaydetme

Resim yükleyip göstermek istediğimizde sayfada tekrar yükleme yapılmasını istemediğimiz durumlarda aşağıdaki yapıyı kullanabiliriz.

Controller;

[HttpPost]
public JsonResult Upload(string Url)
{
for (int i = 0; i < Request.Files.Count; i++)
{
HttpPostedFileBase file = Request.Files[i]; //Uploaded file
//Use the following properties to get file's name, size and MIMEType
int fileSize = file.ContentLength;
string fileName = file.FileName;
string mimeType = file.ContentType;
System.IO.Stream fileContent = file.InputStream;
//To save file, use SaveAs method
file.SaveAs(Server.MapPath("~/Content/") + fileName); //File will be saved in application root
}
return Json("Uploaded " + Request.Files.Count + " files");
}

Script;
<script>
 $(document).ready(function () {

 $("#fileInput").change(function () {
 var formdataDP = new FormData();
 var fileInputDP = document.getElementById('fileInput');
 if (fileInputDP.files.length > 0) {
 for (i = 0; i < fileInputDP.files.length; i++) {
 formdataDP.append(fileInputDP.files[i].name, fileInputDP.files[i]);
 }
 var xhr1 = new XMLHttpRequest();
 xhr1.open('POST', '@Url.Action("Upload", "Home")');
 xhr1.send(formdataDP);
 xhr1.onreadystatechange = function () {
 if (xhr1.readyState == 4 && xhr1.status == 200) {
 $("#profileimage").attr("src", "@Url.Content("~/Content/")" + fileInputDP.files[0].name);
 }
 }
 }
 else { alert("lutfen_bir_dosya_seciniz"); }
 });

 });
</script>

Style;
<style type="text/css" media="screen">
.third-effect .mask{ position: absolute;overflow: hidden;top: 0;left: 0;}
.third-effect img { display: block;position: relative;}
.third-effect a.info { background:url(@Url.Content("/images/upload.png")) center no-repeat;display: inline-block;text-decoration: none;padding:0;text-indent:-9999px;width:90px;height:90px;}
.third-effect { float: left;overflow: hidden;position: relative;text-align: center;box-shadow: 0px 0px 5px #aaa;cursor: default;}
.third-effect .mask { width: 90px; height: 90px; opacity: 0; overflow:visible;border:39px solid rgba(0,0,0,0.7);-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition: all 0.4s ease-in-out;-moz-transition: all 0.4s ease-in-out;-o-transition: all 0.4s ease-in-out;-ms-transition: all 0.4s ease-in-out;transition: all 0.4s ease-in-out;}
.third-effect a.info { left: -39px; position:relative;top:-39px;opacity: 0;-webkit-transition: opacity 0.5s 0s ease-in-out;-moz-transition: opacity 0.5s 0s ease-in-out;-o-transition: opacity 0.5s 0s ease-in-out;-ms-transition: opacity 0.5s 0s ease-in-out;transition: opacity 0.5s 0s ease-in-out;}
.third-effect:hover .mask { opacity: 1;border:39px solid rgba(0,0,0,0.7);}
.third-effect:hover a.info { opacity:1;-moz-transition-delay: 0.1s;-webkit-transition-delay: 0.1s;-o-transition-delay: 0.1s;-ms-transition-delay: 0.1s;transition-delay: 0.1s;}
#fileInput{width: 90px;height: 90px;z-index: 100;position: absolute;left: 0px;top: 0px;-webkit-appearance: none;opacity: 0;}
</style>

CSHTML
<div class="third-effect">
 <img id="profileimage" src="" width="90" height="90" style="cursor: pointer">
 <div class="mask" style="cursor: pointer">
 <a href="#" class="info"><input name="fileInput" id="fileInput" type="file" /></a>
 </div>
</div>

Windows Command Processor(Command) ile windows servis kurma/kaldırma

command prompt window(cmd) açılır. C:\WINDOWS\Microsoft.NET\Framework\ altında en güncel hangi framwork yüklü ise bakılır, bende (v4.0.30319)

yani “cd” komutu ile güncel framework dizinine geçilir(Tabi servisin en güncel frameworkte yazıldığını varsayıyorum).

cd "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\"

Daha sonra installutil ile servisimizin yolunu gösterip kurulum işlemini başlatıyoruz.

InstallUtil.exe  "C:\DemoService\DemoWindowsService.exe"

Servisi kaldırmak için ise;

InstallUtil.exe /u  "C:\DemoService\DemoWindowsService.exe"