C# Bir fonksiyonun içindeki değişkene ulaşma

public class Program
    {
        static void Main()
        {
            int a = 15;
            int toplam = a + b;


        }
        public static void DenemeFonksiyonu()
        {
            int b = 6;
        }


    }

Merhaba. Yakın bir zamanda kodlama dünyasına C# dili ile giriş yaptım. Yukarıdaki kod satırı örneğinde de okuduğunuz gibi, bir fonksiyonun içindeki değişkene başka bir fonksiyondan veya class’tan nasıl erişebilirim? Bunun için hangi konuya çalışmam gerekiyor ? Şimdiden teşekkür ederim. İyi günler.

Global değişken kullanımlarına bakabilirsiniz.

1 Beğeni

Öncelikle Erişim Değiştiriciler.

Erişim Değiştiricileri - C# Programlama Kılavuzu | Microsoft Learn

1 Beğeni

Merhabalar,

Boyle bir sey yapamazsiniz.

Teknik nedenleri es gecersek: Cagdas programlama dilleri, bilgiyi / akisi / kodu duzenlemeye calisiyorlar, ve sayet herhangi bir fonksiyonun herhangi bir baska fonksiyonun datasina erismesine izin verilseydi, bunu yapan kodlar okunamaz, duzeltilemez dugumler haline gelirlerdi. Ayni problem, her veri akisi sorununu global degisken kullanarak cozen kodlar icin de gecerli.

DenemeFonksiyonu isimli bir fonksiyonun icindeki b isimli bir degiskene erismeye neden gerek duyulabilir, bilmiyorum, fakat belki degeri fonksiyondan dondurebilirsiniz? Veya daha iyisi, b yerine 6 yazabilirsiniz.

3 Beğeni

Merhaba. Böyle bir şeye gerek duyduğum için değil de programlama dilini ve mantığını öğrenirken kafamda soru işaretlerini gidermeye çalışıyorum. Kabaca düşündüğümde bir fonksiyonun içindeki değişkeni çekmek bana mantıksız gelmedi. Sadece bunun mümkün olup olmadığını öğrenmek istedim. Cevabınız için teşekkür ederim.

Takdir ediyorum.

Biraz yuksek seviyeli yonlendirme yapmak icin: Programlama dilleri insanlari kisitlayan seyler. Yani C#'in var olma sebebi “su b’yi Deneme’nin icine atalim da disaridan erismek mumkun olmasin”, veya “b’ye int diyelim de, ilk harfini almaya calisirsak bilgisayar hata versin” gibi dusunceler. Kisitlamalara dil tasariminin bir parcasi olarak bakmak lazim.

Fonksiyon icindeki degiskenin degerini okumak su acidan mantiksiz: Fonksiyon cagrilmamis oldugu icin icindeki degisken yasamiyor. Degiskeni fonksiyonun icine koyma sebebimiz disaridan erisilemez olmasi (scope) ve fonksiyon cagrilmadan once veya dondukten sonra yasamamasi, yer kaplamamasi (lifetime). Disaridan erisebilmek isteseydik, fonksiyonun icine koymazdik.

Calisma mantiginiz guzel; sizi totolojilerden biraz daha uzaklastirmak istedim.

1 Beğeni

O zaman, mantığını anlatalım istediğinizdeki aksaklıkları. Bunu Fonksiyon, Sınıflar ve nesneler açısından ayrı ayrı anlatmak gerekir.

Evet, bu sorunuzu daha önce cevaplamıştık. Kabaca, fonksiyon içindeki bir değişkeni, kopyalarak, global tanımlayarak, scope unu farklı tanımlayarak bir çok şekilde erişilir hale getirilebilir.

Ama önemli olan programlama mantığında dikkat etmenizde faydalı olabilecek bir kaç konuya da değinebiliriz.

Öncelikle fonksiyon yapısından bahsedelim. Fonksiyonları matematikteki fonksiyonlara benzetebiliriz.

Bir veya birden falza değişken girip, bir veya berden fazla sonuç döndürebilen yapılardır. Tabi hiç değişken girmeden yada hiç bir dönüş değeri de vermeden çalışan fonksiyonlar da vardır. Eskiden biz bunlara yani girdisi çıktısı olmayan belli işlemleri yapan fonksiyonlara prosedür derdik.

Dönelim fonksiyonlara;

Hem okunaklılık, hem programın modülerliği açısından fonksiyonlar mümkün olduğunda bir işi yapan ve diğer fonksiyonlara bağımlı olmadan çalışır şekilde ayrılmaya çalışılır.

Yani bir fonksiyon iki iş birden yapıyorsa teoride ayrılması gereken iki farklı fonksiyon yazılması gerekiyor demektir.

Yani doğru tasarlanmamış bir fonksiyon demektir. Aynı şekilde eğer bir fonksiyondaki bir parametre birden fazla fonksiyonda ihtiyaç duyuluyorsa yine tasarım hatası var demektir.

Normalde fonksiyona değer girer, değer çıkar, çıkan değer de başka bir fonksiyona girdi olabilir şekilde tasarlanmaya özen gösterilmelidir.

Bunun bir çok amacı vardır, biri okunurluk, ikincisi değişkenlerin takibinin kolaylaştırılması, üçüncüsü ile iyi bellek yönetimi içindir.

Örneğinizdeki deneme fonksiyonunuz üzerinden anlatalım.

Eğer

static void

yerine, fonksiyonunuzu

int olarak tanımlarsanız ve dönüş değeri olarak

return b;

kullanırsanız fonksiyonu her çağırdığınızda size ihtiyaç duyduğunuz b değerini zaten verecektir.

Bu şeklde yapmaz ve global bir b değişkeni tanımlarsanız, fazladan bellek harcayacaktır. Oysaki return ile alırsanız, bu durumda b fonksiyon çağırılmadığı sürece ayrıca bellek kaplamayacaktır.

Bu ve benzeri nedenlerle fonksiyon içerisindeki değerlere doğrudan erişim pek tavsiye edilmez. Bunun yanı sıra kontrolsüz dışardan erişim ile programınız çalışmaz hale gelebilir ve siz bu değeri hangi fonksiyonun ne zaman değiştirdiğini bulmakta zorluk çekebilirsiniz.

İş sınıflar için de benzerlik gösterir ama sınıflar için bir kaç açıklamaya daha ihtiyaç vardır.

Sınıflar çalışmaz, sınıflar bir nevi tip tanımlaması gibidir. Sınıflardan tanımlanarak nesneler oluşturulur ve nesneler de tabi ki çalıştırılabilir sınıf kopyalarıdır artık.

Bu durumda sınıfların dışarıdan erişilebilr değişkenleri olabilir. Bu değişkenler sınıfın dışından fonksiyonlar yerine haberleşmesi gerektiğinde tabi ki ihtiyaç duyulabilen özelliklerdir.

Bu nedenle de sınıf değişkenlerine erişim gerekebilir ve erişimi konusunda yine erişim değiştiriciler konusuna bakmanız gerekecektir.

Sınıflardan oluşturulan, nesnelerin kullanıldığı nesneye yönelik programlamanın amacı,

Daha güvenli kod yazmak, tekrarlanan fonksiyon gruplarını ve değişkenleri kopyalayarak iyi bir bellek yönetimi ve kolay kod yazmak gibi yararlarından dolayı tercih edilir.

Peki güvenli kod yazmak ne demek;

Güvenli kod yazmak, mümkün olduğundca, nesnelerinizin kendi içinde çalıştığı, dışarıdan, diğer fonksiyon ve sınıflardan erişilmeyen kodlardır diyebiliriz.

Burada amaç yine aynıdır. Eğer bir nesneye dışardan erişim gerekiyorsa sınıf yanlış tanımlanmıştır.

Mümkün olduğunca, nesnelere (doğal olarak tanımlayan sınıfları yazarken) tek görev yüklenmelidir. Dışarıdan erişime kapalı, Sadece alması gereken parametreleri alacak şekilde tasarlanmalı, sonuçları da aynı şekilde tasarlanmalıdır.

Bu şekilde bir mantık yerleştirirseniz, güvenli, düzenli, okunaklı, hataya daha az açık kod yazmış olursunuz.

Size verilen tavsiye bu nedenledir.

Sonuç olarak:

Evet fonksiyonlardaki, ve sınıflardan türetilen nesnelerdeki değişkenlere dışardan erişebilirsiniz.

Ama bunu yapıyorsanız, hatalı bir tasarım yapmış olma ihtimaliniz vardır ve yukarıdaki risklerden kaçınmak için fonksiyon ve sınıflarınızı yeniden tasarlamalısınız.

Size yapılan uyarıların maksadı da bu yöndedir.

Kolay gelsin.

1 Beğeni

Fonksiyonların var olma sebebini düşündüğümüzde, benim istediğim şeyin aslında mantıksız ve güvenli olmadığını açık bir şekilde anladım. Programlama dillerinin sınırlı yapılar olduğunu ve bu sınırın aslında bizlere kolaylık sağlamak için konulmuş olduğunu bu şekilde sorulara cevaplar bularak öğrenebileceğimi düşünüyorum. Bu yüzden cevabınız için teşekkür ederim. İyi günler dilerim.

Cevabınız ve yardımınız için teşekkür ederim. Sorularıma net bir cevap aldım. Sağlıcakla kalın.

1 Beğeni

Rica ederim. Bu arada baglantili olarak arastirmak isteyebileceginiz terimleri / konu basliklarini italik olarak yazdim. Kolay gelsin.

1 Beğeni