Aracılığıyla paylaş


Yöntemler (C# Programlama Kılavuzu)

Yöntem, bir dizi deyim içeren bir kod bloğudur. Program, bir yöntemi çağırıp gerekli yöntem bağımsız değişkenlerini belirterek deyimlerin yürütülmesini sağlar. C# dilinde, yürütülen her yönerge bir yöntem bağlamında gerçekleştirilir.

Main yöntemi her C# uygulamasının giriş noktasıdır ve program başlatıldığında ortak dil çalışma zamanı (CLR) tarafından çağrılır. üst düzey deyimleri kullanan bir uygulamada, Main yöntemi derleyici tarafından oluşturulur ve tüm üst düzey deyimleri içerir.

Uyarı

Bu makalede adlandırılmış yöntemler ele alınmaktadır. Anonim işlevler hakkında bilgi için bkz . Lambda ifadeleri.

Yöntem imzaları

Yöntemler veya gibi erişim düzeyi, veya publicgibi isteğe bağlı değiştiriciler, dönüş değeri, yöntemin adı ve herhangi bir yöntem parametresi belirtilerek private arabirimi abstractsınıfında bildirilir. Bu parçalar birlikte yöntemin imzasıdır.

Önemli

Yöntemin dönüş türü, yöntemi aşırı yükleme amacıyla yöntemin imzasının bir parçası değildir. Ancak, bir temsilci ile onun işaret ettiği yöntem arasındaki uyumluluğu belirlerken, bu, yöntemin imzasının bir parçasıdır.

Yöntem parametreleri parantez içine alınır ve virgülle ayrılır. Boş ayraçlar yöntemin parametre gerektirmediğini gösterir. Bu sınıf dört yöntem içerir:

abstract class Motorcycle
{
    // Anyone can call this.
    public void StartEngine() {/* Method statements here */ }

    // Only derived classes can call this.
    protected void AddGas(int gallons) { /* Method statements here */ }

    // Derived classes can override the base class implementation.
    public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }

    // Derived classes must implement this.
    public abstract double GetTopSpeed();
}

Yöntem erişimi

Nesne üzerinde yöntem çağırmak, bir alana erişmek gibidir. Nesne adından sonra bir nokta, yöntemin adı ve parantezler ekleyin. Argümanlar parantez içinde listelenir ve virgülle ayrılır. Bu nedenle Motorcycle sınıfının yöntemleri aşağıdaki örnekte olduğu gibi çağrılabilir:

class TestMotorcycle : Motorcycle
{
    public override double GetTopSpeed()
    {
        return 108.4;
    }

    static void Main()
    {
        TestMotorcycle moto = new TestMotorcycle();

        moto.StartEngine();
        moto.AddGas(15);
        moto.Drive(5, 20);
        double speed = moto.GetTopSpeed();
        Console.WriteLine($"My top speed is {speed}");
    }
}

Yöntem parametreleri ile bağımsız değişkenler karşılaştırması

Yöntem tanımı, gerekli parametrelerin adlarını ve türlerini belirtir. Kod çağrıldığında, yöntem her bir parametre için bağımsız değişken olarak adlandırılan somut değerler sağlar. Bağımsız değişkenlerin parametre türüyle uyumlu olması gerekir, ancak çağıran kodda kullanılan bağımsız değişken adının (varsa) yönteminde tanımlanan parametreyle aynı olması gerekmez. Örneğin:

public void Caller()
{
    int numA = 4;
    // Call with an int variable.
    int productA = Square(numA);

    int numB = 32;
    // Call with another int variable.
    int productB = Square(numB);

    // Call with an integer literal.
    int productC = Square(12);

    // Call with an expression that evaluates to int.
    productC = Square(productA * 3);
}

int Square(int i)
{
    // Store input argument in a local variable.
    int input = i;
    return input * input;
}

Referans ile geçirme ve değer ile geçirme

Varsayılan olarak, bir değer türü örneği bir yönteme geçirildiğinde, örneğin kendisi yerine kopyası geçirilir. Bu nedenle, bağımsız değişkende yapılan değişikliklerin çağırma yöntemindeki özgün örneği üzerinde hiçbir etkisi yoktur. Bir değer türü örneğini başvuruya göre geçirmek için ref anahtar sözcüğünü kullanın. Daha fazla bilgi için bkz. Value-Type Parametrelerini Geçirme.

Bir başvuru türündeki bir nesne bir metoda iletildiğinde, nesneye bir başvuru iletilir. Başka bir ifadeyle, yöntemi nesnenin kendisini değil, nesnenin konumunu gösteren bir bağımsız değişken alır. Bu referansı kullanarak nesnenin bir üyesini değiştirirseniz, nesneyi değere göre geçirmiş olsanız bile değişiklik, çağrılan metodun argümanına yansır.

Aşağıdaki örnekte gösterildiği gibi class anahtar sözcüğünü kullanarak bir başvuru türü oluşturursunuz:

public class SampleRefType
{
    public int value;
}

Şimdi, bu türü temel alan bir nesneyi bir yönteme geçirirseniz, nesneye bir referans aktarılır. Aşağıdaki örnek, SampleRefTypeyöntemine ModifyObject türünde bir nesne geçirir:

public static void TestRefType()
{
    SampleRefType rt = new SampleRefType();
    rt.value = 44;
    ModifyObject(rt);
    Console.WriteLine(rt.value);
}

static void ModifyObject(SampleRefType obj)
{
    obj.value = 33;
}

Örnek, esas olarak, bir bağımsız değişkeni değere göre bir metoda geçiren önceki örnekle aynı işlemi yapar. Ancak başvuru türü kullanıldığından sonuç farklıdır. ModifyObject yapılan değişiklik, valueparametresinin obj alanını etkilediği gibi, value yöntemindeki rtbağımsız değişkeninin TestRefType alanını da değiştirir. TestRefType yöntemi 33'ü çıktı olarak gösterir.

Başvuru türlerini referans ile ve değer ile geçirme hakkında daha fazla bilgi için bkz. Reference-Type Parametrelerini Geçirme ve Başvuru Türleri.

Dönüş değerleri

Yöntemler çağırana bir değer döndürebilir. Dönüş türü (yöntem adından önce listelenen tür) voiddeğilse, yöntemi return deyimini kullanarak değeri döndürebilir. return anahtar sözcüğünü ve ardından dönüş türüyle eşleşen bir değeri içeren bir deyim, bu değeri yöntem çağırana döndürür.

Değer, çağırana değere göre veya referansla döndürülebilir. ref anahtar sözcüğü yöntem imzasında kullanılıyorsa ve her return anahtar sözcüğünden sonra gelirse, değerler çağırana referans olarak döndürülür. Örneğin, aşağıdaki yöntem imzası ve return deyimi, yönteminin çağırana başvuruyla estDistance adlı bir değişken döndürdüğünü gösterir.

public ref double GetEstimatedDistance()
{
    return ref estDistance;
}

anahtar return sözcüğü, yönteminin yürütülmesini de durdurur. Eğer dönüş türü void ise, değeri olmayan bir return deyimi yöntemin yürütülmesini durdurmak için yararlıdır. return anahtar sözcüğü olmadan, yöntem kod bloğunun sonuna ulaştığında yürütülmeyi durdurur. Boş olmayan dönüş türüne sahip yöntemlerin, bir değer döndürmek için return anahtar sözcüğünü kullanmaları gereklidir. Örneğin, bu iki yöntem tamsayıları döndürmek için anahtar sözcüğünü return kullanır:

class SimpleMath
{
    public int AddTwoNumbers(int number1, int number2)
    {
        return number1 + number2;
    }

    public int SquareANumber(int number)
    {
        return number * number;
    }
}

Bir yöntemden döndürülen bir değeri kullanmak için çağıran yöntem, aynı türdeki bir değerin yeterli olduğu her yerde yöntem çağrısının kendisini kullanabilir. Dönüş değerini bir değişkene de atayabilirsiniz. Örneğin, aşağıdaki iki kod örneği aynı hedefi gerçekleştirir:

int result = obj.AddTwoNumbers(1, 2);
result = obj.SquareANumber(result);
// The result is 9.
Console.WriteLine(result);
result = obj.SquareANumber(obj.AddTwoNumbers(1, 2));
// The result is 9.
Console.WriteLine(result);

Bu durumda, bir değeri depolamak için resultyerel değişken kullanmak isteğe bağlıdır. Kodun okunabilirliğine yardımcı olabilir veya yöntemin tüm kapsamı için bağımsız değişkenin özgün değerini depolamanız gerekiyorsa gerekli olabilir.

Bir yöntemden referans alınarak döndürülen bir değeri kullanmak için, eğer değerini değiştirmek istiyorsanız, bir ref yerel değişkeni bildirmeniz gerekir. Örneğin, Planet.GetEstimatedDistance yöntemi bir değeri referans olarak Double döndürürse, bunu aşağıdaki kodla referans bir yerel değişken olarak tanımlayabilirsiniz.

ref double distance = ref Planet.GetEstimatedDistance();

Çağıran işlev diziyi M'e geçirmişse, dizinin içeriğini değiştiren çok boyutlu bir diziyi Myönteminden döndürmek gerekli değildir. M elde edilen diziyi, iyi stil veya işlevsel değer akışı için döndürebilirsiniz, ancak bu gerekli değildir çünkü C# tüm başvuru türlerini değeriyle geçirir ve bir dizi başvurusunun değeri, dizinin işaretçisidir. Myönteminde, dizinin içeriğinde yapılan tüm değişiklikler, aşağıdaki örnekte gösterildiği gibi diziye başvurusu olan herhangi bir kod tarafından gözlemlenebilir:

static void Main(string[] args)
{
    int[,] matrix = new int[2, 2];
    FillMatrix(matrix);
    // matrix is now full of -1
}

public static void FillMatrix(int[,] matrix)
{
    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        for (int j = 0; j < matrix.GetLength(1); j++)
        {
            matrix[i, j] = -1;
        }
    }
}

Asenkron yöntemler

Asenkron özelliğini kullanarak, açık callback'ler kullanmadan veya kodunuzu birden fazla metoda ya da lambda ifadesine el ile bölmeden asenkron yöntemleri çağırabilirsiniz.

Bir metodu async değiştiricisi ile işaretlerseniz, yöntemde await işlecini kullanabilirsiniz. Denetim, async yönteminde bir await ifadesine ulaştığında, çağırana geri döner ve yöntemdeki ilerleme, beklenen görev tamamlanana kadar duraklatılır. Görev tamamlandığında, yürütme yönteminde devam edebilir.

Uyarı

Zaman uyumsuz yöntem, henüz tamamlanmamış ilk beklenen nesneyle karşılaştığında veya zaman uyumsuz yöntemin sonuna ulaştığında (hangisi önce gerçekleşirse) çağırana geri döner.

Asenkron bir yöntem genellikle Task<TResult>, Task, IAsyncEnumerable<T>veya voiddönüş türüne sahiptir. void dönüş türü, void dönüş türünün gerektiği yerlerde öncelikle olay işleyicilerini tanımlamak için kullanılır. Zaman uyumsuz bir yöntem void döndürüyorsa await edilemez ve void türünde dönen bir yöntemi çağıran, oluşan özel durumları yakalayamaz. Zaman uyumsuz bir yöntem herhangi bir görev benzeri dönüş türüne sahip olabilir.

Aşağıdaki örnekte, DelayAsyncdönüş tipine sahip zaman uyumsuz bir yöntem olan Task<TResult> verilmiştir. DelayAsync, tamsayı döndüren bir return deyimine sahiptir. Bu nedenle, DelayAsync yöntem bildirimi Task<int>dönüş türüne sahip olmalıdır. dönüş türü Task<int>olduğundan, await içindeki DoSomethingAsync ifadesinin değerlendirilmesi, aşağıdaki deyimin gösterdiği gibi bir tamsayı oluşturur: int result = await delayTask.

Main yöntemi, Taskdönüş türüne sahip zaman uyumsuz bir yöntem örneğidir. DoSomethingAsync yöntemine gider ve tek bir satırla ifade edildiğinden async ve await anahtar sözcükleri atlayabilir. DoSomethingAsync eşzamansız bir yöntem olduğundan, aşağıdaki deyimde gösterildiği gibi DoSomethingAsync çağrısının beklenmesi gerekir: await DoSomethingAsync();.

class Program
{
    static Task Main() => DoSomethingAsync();

    static async Task DoSomethingAsync()
    {
        Task<int> delayTask = DelayAsync();
        int result = await delayTask;

        // The previous two statements may be combined into
        // the following statement.
        //int result = await DelayAsync();

        Console.WriteLine($"Result: {result}");
    }

    static async Task<int> DelayAsync()
    {
        await Task.Delay(100);
        return 5;
    }
}
// Example output:
//   Result: 5

Zaman uyumsuz bir yöntem, başvuru bildiremez veya parametreleri, ancak bu tür parametreleri olan yöntemleri çağırabilir.

Zamansız yöntemler hakkında daha fazla bilgi için bkz Async ve await ile zamansız programlama ve Asenkron dönüş türleri.

İfade gövdesi tanımları

Bir ifadenin sonucuyla hemen döndürülen veya yöntemin gövdesi olarak tek bir deyimi olan yöntem tanımlarının olması yaygın bir durumdur. =>kullanarak bu tür yöntemleri tanımlamak için bir söz dizimi kısayolu vardır:

public Point Move(int dx, int dy) => new Point(x + dx, y + dy);
public void Print() => Console.WriteLine(First + " " + Last);
// Works with operators, properties, and indexers too.
public static Complex operator +(Complex a, Complex b) => a.Add(b);
public string Name => First + " " + Last;
public Customer this[long id] => store.LookupCustomer(id);

Yöntem void döndürüyorsa veya zaman uyumsuz bir yöntemse, yöntemin gövdesi bir deyim ifadesi olmalıdır (lambdas ile aynı). Özellikler ve dizin oluşturucular için bunlar salt okunur olmalıdır ve get erişimci anahtar sözcüğünü kullanmazsınız.

Yineleyiciler

Yineleyici, liste veya dizi gibi bir koleksiyon üzerinde özel bir yineleme gerçekleştirir. Yineleyici, her öğeyi birer birer döndürmek için yield return deyimini kullanır. bir yield return deyimine ulaşıldığında koddaki geçerli konum hatırlanır. Yineleyici bir sonraki sefer çağrıldığında yürütme bu konumdan yeniden başlatılır.

foreach deyimini kullanarak istemci kodundan yineleyici çağırırsınız.

Yineleyicinin dönüş türü , , IEnumerable, IEnumerable<T>IAsyncEnumerable<T>veya IEnumeratorolabilirIEnumerator<T>.

Daha fazla bilgi için bkz . Yineleyiciler.

C# dil belirtimi

Daha fazla bilgi için bkz. C# Dil Belirtimi. Dil belirtimi, C# söz dizimi ve kullanımı için kesin kaynaktır.

Ayrıca bkz.