Serdar YILMAZ / Software Developer
Bizimkisi Bir “Bug” Hikayesi...
Kocaeli/Körfez

Arşiv 'Programlama' Kategori

“var” Anahtar Sözcüğünün Performansa ve Okunabilirliğe Etkisi

Visual Studio’da kullanmakta olduğum ReShapper uzantısının; int, double, string, bool gibi veri tiplerinde tanımlanmış değişkenlerde dahi “var” anahtar sözcüğünün kullanımını önermesi üzerine, “var” anahtar sözcüğünün performans üzerinde bir artısı olup olmadığını araştırıp, konuya ilişkin bir içerik yayınlamaya karar verdim. Devamını Okumak İçin Tıklayınız…

C# – Arayüzler

.netArayüzler, sınıflara rehberlik etmek üzere oluşturulan nesneye dayalı programlamanın en önemli özelliklerinden biridir. Sınıfların hangi metotları ve özellikleri içermesi gerektiğini arayüzler içerisinde bildiriyoruz.

Arayüz Oluşturma

Arayüzler “interface” anahtar sözcüğü ile oluşturulur. Zorunlu olmamakla birlikte arayüz isimleri genellikle “I” harfiyle başlatılır. Böylece “I” ön ekini gören bir programcı onun bir arayüz olduğunu anlar. Arayüz içerisinde özelliklerin ve metotların sadece bildirimi yapılır. Yani herhangi bir şekilde özelliklere bir değer atanmaz sadece türleri ve isimleri yazılır, aynı şekilde metotların içerisine kodlar yazılmaz sadece geri dönüş türleri ve isimleri yazılır. 

Arayüzlerin Sınıflara İmplement Edilmesi

IKisi arayüzü, Yonetici sınıfına implement edildiği için (1.Satır) Yonetici sınıfı, IKisi arayüzünde bildirimi yapılmış olan özellikleri ve metotları içermek zorundadır. Yonetici sınıfı içerisine, IKisi arayüzünde bildirimi yapılmış metotlar ve özellikler haricinde Yonetici sınıfına has metotlar ve özellikler de tanımlanabilir. 

Arayüzlere Neden İhtiyaç Duyarız?

Arayüzlerin geniş bir kullanım alanı bulunmaktadır. Basit bir örnek üzerinden anlatacak olursak; 

Arayüz kullanımı sınıflarımızı bir standart çerçevesinde yapılandırmamızı sağlamaktadır. IKisi arayüzünün Isci ve Yonetici sınıflarına implement edildiğini gören bir programcı, bu sınıfların içerisinde adSoyad, adres, departman gibi özelliklerin olduğunu ve bu özelliklere erişilerek gerekli bilgilerin alınabileceğini bilecektir.

Örneğin, Yonetici ve Isci sınıflarından oluşturulan nesnelerin içerisindeki adSoyad özelliğini ekrana yazdıran bir metot yazalım. Arayüzlerin sağlamış olduğu kolaylıktan faydalanmıyor olsaydık bu işlemi aşağıdaki gibi yapıyor olurduk;

İki farklı metot tanımlamamız gerekirdi. Bu metotlardan biri Yonetici sınıfı türünden parametre alırken, diğeri Isci sınıfı türünden parametre alırdı. Ancak arayüzler sayesinde bu işlemi tek bir metot yazarak yapabiliriz.

IKisi arayüzü, Yonetici ve Isci sınıflarına implement edildiği için bu sınıflardan oluşturulan nesneler, IKisi arayüzü türündeki bir parametrede tutulabilir. Bu yüzden adSoyadBilgisi() metoduna parametre olarak Yonetici veya Isci sınıfından oluşturulan nesneleri gönderebiliriz. Bu parametre aracılığı ile ilgili nesnelerin sadece IKisi arayüzünden gelen özellik ve metotlarına erişebiliriz.

Çoklu İmplementasyon 

Bir sınıfa birden fazla arayüz implement edilebilir. Örnek bir senaryo üzerinden konuyu anlatacak olursak; Bir fabrika için otomasyon programı yazdığımızı düşünelim. Fabrikada 3 farklı çalışan türü olsun, bunlar yönetici, işçi ve robot. Her bir çalışanın ID, ad-soyad, adres, maaş, departman ve toplam çalışma saati bilgisi olsun. 

Eğer arayüz tasarımını yukarıdaki gibi yaparsak ICalisan arayüzünü, oluşturacağımız Yonetici ve Isci sınıflarına implement edebiliriz ancak Robot sınıfına implement edemeyiz. Çünkü robotların adlarının ve adreslerinin olmayacağını ve maaş almayacaklarını biliyoruz. Bu yüzden ICalisan arayüzünü uygun bir şekilde parçalamamız gerekiyor. 

ICalisan ve IKisi şeklinde iki arayüz oluşturduk. Yöneticiler ve işçiler hem çalışan hemde birer kişi olduğundan, bu sınıflara hem ICalisan arayüzünü hem de IKisi arayüzünü imlement edeceğiz. Robot sınıfına ise sadece ICalisan arayüzünü implement edeceğiz. 

Kurumsal Mimarilerde Arayüz Kullanımı

Daha önce kurumsal mimaride bir uygulama geliştirmediyseniz bu bölümü şimdilik atlayabilirsiniz. 

Bu başlıkta olabildiğince yalın bir şekilde arayüzlerin kurumsal mimarilerde ki kullanımına bir örnek vermeye çalışacağım. Kod kalabalığını arttırmamak ve konuyu daha anlaşılır bir şekilde anlatmak için sınıfları karışıklığa yer vermeyecek şekilde isimlendirip, konumuzun dışında olan kod satırlarına/bloklarına (veritabanı sorguları) yer vermemeye çalışacağım.

Bir projede farklı veritabanı yönetim sistemleri kullanılabilir. Projelerimizi bizden fazla veritabanı yönetim sistemine destek verecek şekilde geliştirebilmek için arayüzlerden faydalanabiliriz. 

Öncelikle IRepository adını verdiğimiz arayüzün içerisinde, veritabanı üzerinde ekleme, silme, güncelleme, kaydetme gibi temel işlemleri yapacak metotların bildirimini yapıyoruz. Sonra bu arayüzü, farklı veritabanı yönetim sistemleri üzerinde işlem yapacak olan sınıflara implement ediyoruz. 

Projemizin hem Oracle veritabanına hemde MsSQL veritabanına destek vermesini istiyorsak; IRepository arayüzü içerisinde bildirimi yapılan metotları, OracleDB sınıfında Oracle vertabanında işlem yapacak şekilde, MsSQLDB sınıfında MsSQL veritabanında işlem yapacak şekilde yazmamız gerekiyor.

MsSQLDB ve OracleDB sınıfları ile artık hem MsSQL veritabanında hem de Oracle veritabanında işlem yapabiliyoruz.

Son olarak ExampleManager isimli bir sınıf oluşturuyoruz, bu sınıftan nesne oluştururken yapıcı metoduna parametre olarak MsSQLDB sınıfından bir nesne gönderirsek ekleme, silme, güncelleme, kaydetme işlemini MsSQL veritabanı üzerinde yapacaktır, OracleDB sınıfından bir nesne gönderirsek de Oracle veritabanı üzerinde yapacaktır. 

Ekran Çıktısı:

Serdar YILMAZ

C# – Temel ve Türetilmiş Sınıf Referansları

dotnetC#’da farklı türden referansların birbirine aktarılması yasaklanmıştır. Örneğin, A ve B isminde iki sınıfımız olsun. A sınıfından oluşturulan bir nesnenin adresini B sınıfından oluşturulan bir referansta tutamayız, aynı şekilde B sınıfından oluşturulan bir nesnenin adresini de A sınıfından oluşturulan bir referansta tutamayız.

Kalıtım ile Türetilmiş sınıftan oluşturulan bir nesnenin adresini, Temel sınıftan oluşturulan bir referansta tutabiliriz.

Kedi ve Insan sınıfı Memeli sınıfından Türetilmiştir. Bu durum da Memeli sınıfı Temel sınıf, Insan ve Kedi sınıfı da Türetilmiş sınıftır.

Açıklama satırlarında da belirtildiği üzere; Insan ve Kedi sınıfları Memeli sınıfından türetildiği için bu sınıflardan oluşturulan nesnelerin adresleri Memeli sınıfından oluşturulan referanslarda tutulabilir. Yalnız burada dikkat edilmesi gereken çok önemli bir husus bulunmakta. Memeli sınıfını inceleyecek olursak içerisinde “TurBilgisi()” adında bir metodun olmadığını görürüz. Bu yüzden Insan veya Kedi sınıfından oluşturulan bir nesnenin adresini Memeli sınıfından oluşturulan bir referansa aktardığımız taktirde “TurBilgisi()” metoduna erişemeyiz. Çünkü Memeli sınıfı içerisinde böyle bir metot bulunmamaktadır.

C# Kalıtım

Türetilmiş sınıf, temel sınıf içerisindeki değişkenleri ve metotları kendi içerisinde tanımlanmış gibi kullanabilir. Ancak temel sınıf, türetilmiş sınıftaki değişkenleri ve metotları kullanamaz.

Insan ve Kedi sınıfları, Memeli sınıfından türetildiği için “Bilgi()” metoduna Insan ve Kedi sınıfından oluşturulan nesnelerin referanslarını parametre olarak gönderebiliriz.

Serdar YILMAZ

C# – Üye Gizleme

dotnetTemel sınıf içerisinde bulunan elemanlardan public ve protected erişim belirteçli olanların kalıtım yoluyla Türetilmiş sınıfa aktarıldığından bahsetmiştik (Bkz: C# – Kalıtım). Peki Temel sınıfta ve Türetilmiş sınıfta aynı isme sahip elemanlar tanımlarsak ne olur?

A Temel sınıf, B ise Türetilmiş sınıftır. Temel sınıfta ve Türetilmiş sınıfta aynı isme sahip elemanlar tanımladığımız için Visual Studio uyarı verecektir. Bu uyarının sebebi; Türetilmiş sınıf içerisindeki elemanların, aynı isimli Temel sınıf elemanlarını gizlemesinden kaynaklanmaktadır.

Türetilmiş sınıfın elemanları Temel sınıfın elemanlarını gizlediği için B sınıfından bir nesne oluşturup “Uye_1” ve “Uye_2” elemanlarına erişmek istediğimiz de B sınıfı içerisinde tanımlanmış olan “Uye_1” ve “Uye_2” elemanlarına erişebiliriz. Ekran çıktısı;

Üye gizleme olayının gerçekleştiği durumlar da Visual Studio bu işlemi yanlışlıkla yaptığımızı düşünerek bize bir uyarı verecektir. Bu işlemi kontrollü bir şekilde yaptığımızı belirtmek için new anahtar sözcüğünü kullanırız.

Yapmış olduğumuz düzenlemeden sonra Visual Studio artık uyarı vermeyecektir. Peki Temel sınıf içerisinde ki “Uye_1” ve “Uye_2” elemanlarına nasıl erişebiliriz ?

Temel sınıf içerisindeki “Uye_1” ve “Uye_2” elemanlarına Türetilmiş sınıf içerisinden erişebilmek için base anahtar sözcüğünü kullanırız. Base anahtar sözcüğü türetmenin yapıldığı temel sınıfı temsil eder. Base anahtar sözcüğünün kullanımına Yapıcı Metotlar ve Kalıtım konusunda da değinmiştik.

Serdar YILMAZ

C# – Yapıcı Metotlar ve Kalıtım

dotnetTüretilmiş sınıftan bir nesne oluşturduğumuz da önce temel sınıfın yapıcı metodu sonra da türetilmiş sınıfın yapıcı metodu çalışacaktır.

A temel sınıf, B ise türetilmiş sınıftır. Bu yüzden B sınıfından bir nesne oluşturduğumuz da (B nesne=new B();) önce A sınıfının yapıcı metodu sonra da B sınıfının yapıcı metodu çalışacaktır.  Ekran çıktısı;

Her yapıcı metodun kendi tanımlandığı sınıfın üye elemanları ile ilgili iş yapması gerekir.

base Anahtar Sözcüğü

Türetilmiş sınıf içerisinden temel sınıfın elemanlarına erişmek için base anahtar sözcüğünü kullanırız.

A temel sınıf, B ise türetilmiş sınıftır. Temel sınıfın yapıcı metoduna türetilmiş sınıf üzerinden parametre gönderebilmek için base anahtar sözcüğünü kullanırız.

B sınıfından nesne oluştururken girdiğimiz birinci(10) ve ikinci(15) parametreler A sınıfının yapıcı metoduna gönderilecektir. Üçüncü(20) ve dördünce(25) parametreler ise B sınıfının yapıcı metodu içerisinde kullanılacaktır. Ekran çıktısı;

Türetme ile sınıflar arasında hiyerarşik bir yapı sağlanır.

base anahtar sözcüğü C sınıfında B sınıfını; B sınıfında da A sınıfını temsil eder. C sınıfından bir nesne oluşturduğumuz da önce A sınıfının yapıcı metodu, sonra B sınıfının yapıcı metodu en son da C sınıfının yapıcı metodu çalışacaktır.

C sınıfından nesne oluştururken girdiğimiz birinci(10) ve ikinci(15) parametreler B sınıfının yapıcı metoduna gönderilecektir. Üçüncü(20) parametre ise C sınıfının yapıcı metodu içerisinde kullanılacaktır. B sınıfına gönderilen birinci(10) ve ikinci(15) parametrelerden ilki(10) A sınıfının yapıcı metoduna gönderilecektir ve ikinci(15) parametre de B sınıfı içerisinde kullanılacaktır.

Serdar YILMAZ

C# – Kalıtım

dotnetKalıtım, nesneye dayalı programlamanın en önemli özelliklerinden biridir. Kalıtım yolu ile sınıflar birbirinden türetilebilir. Bir sınıf diğer bir sınıftan türediği zaman, türediği sınıfın bütün özelliklerini içerir. Bunun yanında kendine has özellikler de barındırabilir.

Yukarıdaki örnekte; A temel sınıf, B ise türetilmiş sınıftır. Türetme işlemi “class B : A” kodu ile 11. satırda yapılmıştır. B sınıfı A sınıfından türetildiği için A sınıfı içerisindeki değişken ve metodu kalıtım yolu ile almaktadır.

Türetme işleminden dolayı B sınıfı, A sınıfı içerisindeki “degisken_1” ve “Metot_1()” elemanlarını kendi içerisinde tanımlanmış gibi kullanabilmektedir.

Türetilmiş sınıf, temel sınıf içerisindeki değişkenleri ve metotları kendi içerisinde tanımlanmış gibi kullanabilir. Ancak temel sınıf, türetilmiş sınıftaki değişkenleri ve metotları kullanamaz.

Erişim Belirteçleri

Türetilmiş bir sınıfa, temel sınıftaki elemanlardan sadece public ve protected olarak tanımlananlar aktarılır. Erişim belirteci private olan elemanlar kalıtım ile aktarılmaz.

Erişim Belirleyicisi: Metot ve özelliklere olan erişimin sınırlarını belirtmektedir. (Bknz: C# – Sınıflar)

  1. Private: Sadece tanımlandığı sınıf içerisinden erişilebilir. (Kalıtım ile aktarılmaz.)
  2. Public: Her yerden erişilebilir. (Kalıtım ile aktarılır.)
  3. Internal: Sadece bulunduğu projede erişilebilir. (Kalıtım ile aktarılır.)
  4. Protected: Tanımlandığı sınıfta ve o sınıfı miras (kalıtım) alan sınıflardan erişilebilir. (Kalıtım ile aktarılır.)

TemelSinif içerisindeki degisken_3‘ün erişim belirteci private olduğu için TuretilmisSinif‘a aktarılmaz. Sadece TemelSinif içerisinde kullanılabilir.

TemelSinif içerisindeki degisken_2‘nin erişim belirteci public olduğu için TuretilmisSinif‘a aktarılır. Yukarıdaki örnekte TuretilmisSinif içerisinde degisken_2 adında bir değişken tanımlanmamış olmasına rağmen TemelSinif‘tan kalıtım aldığı için Metot_2() içerisinde kullanılabilmiştir.

TemelSinif içerisindeki degisken_1‘in erişim belirteci protected olduğu için TuretilmisSinif‘a aktarılır. Yukarıdaki örnekte TuretilmisSinif içerisinde degisken_1 adında bir değişken tanımlanmamış olmasına rağmen TemelSinif‘tan kalıtım aldığı için Metot_1() içerisinde kullanılabilmiştir.

Peki bu durum da public ile protected belirteçleri arasındaki fark nedir? 

Kalıtım

TemelSinif‘dan TuretilmisSinif‘a kalıtım yoluyla aktardığımız “degisken_1 (protected)” ve “degisken_2 (public)” elemanlarını TuretilmisSinif içerisinde kullanabiliriz. Ancak TuretilmisSinif‘dan oluşturduğumuz bir nesne üzerinden sadece “degisken_2” elemanına erişebiliriz. Erişim belirteci protected olan degisken_1 elemanına başka bir sınıftan erişemeyiz. Bunun nedeni; Erişim belirteci protected olan elemanlar tanımlandıkları sınıfta ve  kalıtım yolu ile aktarıldıkları sınıflar da private elemanların özelliklerini gösterirler.

Erişim belirteci protected olan elemanların private elemanlardan tek farkı kalıtım yolu ile aktarılabiliyor olmalarıdır. Eğer türeme söz konusu değilse protected olarak bildirilen elemanlarla private olarak bildirilen elemanlar arasında bir fark kalmaz. Erişim belirteci protected olan elemanları, kalıtım yolu ile aktarılabilen private elemanlar olarak düşünebiliriz.

Serdar YILMAZ

Razor View Engine

dotnetRazor View Engine; View’lar da HTML, CSS, JavaScript ile beraber C#’ın da kullanılabilmesini sağlamaktadır. View’lara yazılan HTML, CSS ve JavaScript kodları istemci tarafında çalışmaktadır. C# kodları ise sunucu tarafında çalışır ve sonuç istemciye gönderilir.

Razor Açıklama Satırı

HTML açıklama satırları tarayıcı tarafından yorumlanmaz ancak sayfanın kaynak kodlarını görüntüleyen kullanıcılar tarafından görülebilir. Razor açıklama satırları ise tarayıcı tarafından yorumlanmadığı gibi sayfanın kaynak kodlarında da gözükmez. Sadece uygulamayı geliştiren yazılımcılar tarafından görülebilir.

Razor Kod Blogu

View’de C# kodları yazabilmek için “@{ }” ile Razor kod blogu oluşturmamız gerekmektedir. Örneğimiz de Razor kod blogu içerisinde 3 adet değişken tanımladık. Razor kod blogu içerisinde tanımladığımız değişkenlere, kod blogu dışında erişebilmek için başlarına “@” işareti koymamız gerekmektedir.

Razor Kod Satırı

Tek satırlık C# kodlarını “@( )” içerisine yazabiliriz.

Kontrol Yapıları ve Döngülerin Kullanımı

Razor sayesinde C# diline ait döngü ve kontrol yapılarını (For, Foreach, While, Switch-Case, If-Else…) sayfamızın içerisinde dilediğimiz yerde kullanabiliriz.

Yazar: Serdar YILMAZ

C# – Static Elemanlar ve Sınıflar

dotnetBir sınıf içerisindeki static olmayan metotlara ve özelliklere o sınıftan oluşturduğumuz nesneler üzerinden erişiriz. Static olan metotlara ve özelliklere ise nesne oluşturmadan sınıf adı ile erişiriz.

Static olmayan elemanlar nesneye özgü bilgileri tutarken static olan elemanlar uygulama çalıştığı sürece kendilerine en son atanan değeri tutarlar. AdiSoyadi ve Numara değişkenleri static olmadığı için Ogrenci sınıfından oluşturulan her bir nesne için farklı değerler tutabilirler. OgrenciSayisi değişkeni ise static olduğu için kendisine en son atanan değeri tutacaktır.

Bir özelliği veya metodu static yapmak için erişim belirleyicisinden sonra “static” anahtar kelimesini getirmemiz gerekir.

Static bir metodun içerisinden static olmayan metotlar ve değişkenler çağrılamaz. Sadece diğer static metotlar ve değişkenler çağrılabilir.

Static Yapıcı Metotlar

Yapıcı metotları da normal metotlar gibi static olarak tanımlayabiliriz. Sınıfın static değişkenleri ile ilgili işlemler static yapıcı metodun içerisinde yapılabilir. Static yapıcı metotlar parametre almazlar ve erişim belirteçleri yoktur.

Kullanici sınıfının iki adet yapıcı metodu bulunmaktadır. Bunlardan static olanı kullanicisayisi isimli static değişkenin başlangıç değerini atarken, static olmayanı Nick ve EMail değişkenlerinin atama işlemlerini gerçekleştirmektedir.

Kullanici sınıfından ilk nesne oluşturulduğunda hem static yapıcı metot hemde static olmayan yapıcı metot çalışacaktır(İlk static yapıcı metot çalışır). İlk nesneden sonra oluşturulacak diğer tüm nesnelerde sadece static olmayan yapıcı metot çağrılacaktır. Yani static yapıcı metot sadece ilk nesne oluşturulduğunda çalışır.

Static Sınıflar

Oluşturduğumuz sınıf içerisinde sadece static metotlar ve değişkenler bulunuyorsa sınıfı static olarak tanımlayabiliriz. Sınıfların static olarak tanımlanması bir zorunluluk değildir sadece okunabilirliği arttıran bir yaklaşımdır.

Matematik sınıfının üye elemanları(Topla ve Carp metotları) static olduğu için sınıfı da static olarak bildirdik. Matematik sınıfının static olduğunu gören bir programcı, sınıf içerisinde sadece static elemanların bulunduğunu anlayacaktır.

Static sınıflarla alakalı bilinmesi gerekenler;

  1. Static sınıflardan nesne oluşturulamaz. (new Matematik; YANLIŞ)
  2. Static sınıf türünden referanslar oluşturulamaz. (Matematik m; YANLIŞ)
  3. Static sınıfların içinde static olmayan metot yada değişken tanımlanamaz.
  4. Static sınıflarda kalıtım yoktur.

Serdar YILMAZ

C# – Garbage Collection ve Yıkıcı Metotlar

dotnetYıkıcı metotlara geçmeden önce Garbage Collection mekanizması hakkında bilgi vermekte fayda var.

Garbage Collection

Garbage Collection erişilemeyen nesneleri silerek belleğin verimli bir şekilde kullanılmasını sağlamaktadır. Konuyu örnekler üzerinden açıklamaya devam edelim;

Yukarıdaki kod satırında “new Ogrenci()” komutu ile Heap bellek bölgesinde Ogrenci sınıfından bir nesne oluşturduk. Bu nesneye erişebilmek için adresini, belleğin Stack bölgesinde tutulan “ogr” ismindeki işaretçiye aktardık. Herhangi bir şekilde “ogr” isimli işaretçiyi kaybedersek, Heap bellek bölgesinde oluşturduğumuz nesneye erişmemiz mümkün olmayacaktır. Erişilemeyen nesnelerde Garbage Collection tarafından silinerek bellekte gereksiz yer kaplaması önlenecektir.

Bu örneğimizde Ogrenci sınıfından iki adet nesne oluşturduk. 1. ve 2. satırlarda ilk oluşturduğumuz nesnenin adresini “ogr1” işaretçisine, ikinci oluşturduğumuz nesnenin adresini “ogr2 işaretçisine aktardık. 3. satırda ise ikinci nesnenin adresini, ilk nesnenin adresini tutan “ogr1” işaretçisine aktardık. Yani artık ogr1 işaretçisi, ilk nesnenin adresini değil ikinci nesnenin adresini tutmaktadır. İlk oluşturulan nesnenin adresi kaybedildiği için artık o nesneye ulaşmak mümkün olmayacaktır. Nesneye erişimin mümkün olmadığı durumlarda nesnenin bellekte kalmasının bir anlamı yoktur. Bu yüzden Garbage Collection tarafından silinecektir.

Garbage Collection, Stack, Heap

Garbage Collection mekanizmasının ne zaman devreye gireceği kesin olarak bilinemez. Arkaplanda programcıdan bağımsız bir şekilde çalışmaktadır.

Yıkıcı Metotlar

Erişilemeyen bir nesnenin Garbage Collection tarafından silinmeden hemen önce çalışan metoduna Yıkıcı Metot denilmektedir. Bir nesnenin silinmeden önce yapmasını istediğimiz şeyleri o nesnenin yıkıcı metodu içerisine yazarız.

Yıkıcı Metot Nasıl Tanımlanır ?

  1. Yıkıcı metodun adı sınıf adıyla aynı olmalıdır ve başında “~” işareti olmalıdır.
  2. Parametresi, geri dönüş değeri ve erişim belirteci olmamalıdır.

Oyuncu sınıfından her nesne oluşturulduğunda “OyuncuSayisi” isimli static değişkenin değeri bir arttırılacak ve nesne silinmeden önce değeri bir azaltılacaktır.

Serdar YILMAZ

C# – Byte Birimindeki Sayısal Büyüklüğü Byte’ın Katlarına Çevirme

dotnet

Açıklama

BytesToString() metodu; parametre olarak girilen sayısal büyüklüğü Byte’ın ilgili katına çevirmektedir.

Kod

Önizleme

Serdar YILMAZ