Yöntemler (C# Programlama Kılavuzu)Methods (C# Programming Guide)

Yöntemi, bir dizi deyim içeren bir kod bloğudur.A method is a code block that contains a series of statements. Program, metodu çağırarak ve gerekli Yöntem bağımsız değişkenlerini belirterek deyimlerin yürütülmesine neden olur.A program causes the statements to be executed by calling the method and specifying any required method arguments. ' C#De, her yürütülen yönerge bir yöntem bağlamında gerçekleştirilir.In C#, every executed instruction is performed in the context of a method. Main yöntemi her C# uygulamanın giriş noktasıdır ve program başlatıldığında ortak dil çalışma zamanı (CLR) tarafından çağırılır.The Main method is the entry point for every C# application and it's called by the common language runtime (CLR) when the program is started.

Not

Bu makalede adlandırılmış yöntemler ele alınmaktadır.This article discusses named methods. Anonim işlevler hakkında daha fazla bilgi için bkz. Anonim işlevler.For information about anonymous functions, see Anonymous Functions.

Yöntem imzalarıMethod signatures

Yöntemler, public veya private, abstract veya sealed, dönüş değeri, yöntemin adı ve herhangi bir yöntem parametresi gibi erişim düzeyi belirtilerek bir sınıf veya Yapı içinde bildirilmiştir.Methods are declared in a class or struct by specifying the access level such as public or private, optional modifiers such as abstract or sealed, the return value, the name of the method, and any method parameters. Bu parçalar, yönteminin imzasıdır.These parts together are the signature of the method.

Not

Bir yöntemin dönüş türü, yöntem aşırı yüklemesi amaçları için yöntemin imzasının bir parçası değildir.A return type of a method is not part of the signature of the method for the purposes of method overloading. Ancak, bir temsilci ve işaret ettiği yöntem arasındaki uyumluluğun belirlenmesi sırasında yönteminin imzasının bir parçasıdır.However, it is part of the signature of the method when determining the compatibility between a delegate and the method that it points to.

Yöntem parametreleri parantez içine alınır ve virgülle ayrılır.Method parameters are enclosed in parentheses and are separated by commas. Boş parantezler, yöntemin hiçbir parametre gerektirmediğini belirtir.Empty parentheses indicate that the method requires no parameters. Bu sınıf dört yöntem içerir:This class contains four methods:

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şimiMethod access

Bir nesne üzerinde bir yöntemi çağırmak, bir alana erişme gibidir.Calling a method on an object is like accessing a field. Nesne adından sonra bir nokta, yöntemin adı ve parantez ekleyin.After the object name, add a period, the name of the method, and parentheses. Bağımsız değişkenler parantez içinde listelenir ve virgülle ayrılır.Arguments are listed within the parentheses, and are separated by commas. Motorcycle sınıfının yöntemleri, bu nedenle aşağıdaki örnekte olduğu gibi çağrılabilir:The methods of the Motorcycle class can therefore be called as in the following example:

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 {0}", speed);            
    }
}

Yöntem parametreleri ve bağımsız değişkenlerMethod parameters vs. arguments

Yöntem tanımı, gerekli parametrelerin adlarını ve türlerini belirtir.The method definition specifies the names and types of any parameters that are required. Kodu çağırırken yöntemi çağırdığında, her parametre için bağımsız değişkenler olarak adlandırılan somut değerler sağlar.When calling code calls the method, it provides concrete values called arguments for each parameter. 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ı (varsa) yöntemde tanımlanan parametre ile aynı olmalıdır.The arguments must be compatible with the parameter type but the argument name (if any) used in the calling code doesn't have to be the same as the parameter named defined in the method. Örneğin:For example:

 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 evaulates to int.
     productC = Square(productA * 3);
 }

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

Başvuruya göre geçirme-değere göre geçirmePassing by reference vs. passing by value

Varsayılan olarak, bir değer türü örneği bir yönteme geçirildiğinde, kopyasının kendisi yerine geçirilir.By default, when an instance of a value type is passed to a method, its copy is passed instead of the instance itself. Bu nedenle, bağımsız değişkende yapılan değişikliklerin, çağırma yönteminde orijinal örnek üzerinde hiçbir etkisi yoktur.Therefore, changes to the argument have no effect on the original instance in the calling method. Değer türü örneği başvuruya göre geçirmek için ref anahtar sözcüğünü kullanın.To pass a value-type instance by reference, use the ref keyword. Daha fazla bilgi için bkz. değer türü parametrelerini geçirme.For more information, see Passing Value-Type Parameters.

Başvuru türündeki bir nesne yöntemine geçirildiğinde, nesnesine bir başvuru geçirilir.When an object of a reference type is passed to a method, a reference to the object is passed. Diğer bir deyişle, yöntem nesnenin kendisini değil, nesnenin konumunu gösteren bir bağımsız değişken alır.That is, the method receives not the object itself but an argument that indicates the location of the object. Bu başvuruyu kullanarak nesnesinin bir üyesini değiştirirseniz, nesneyi değere göre iletseniz bile, değişiklik çağırma yöntemindeki bağımsız değişkende yansıtılır.If you change a member of the object by using this reference, the change is reflected in the argument in the calling method, even if you pass the object by value.

Aşağıdaki örnekte gösterildiği gibi, class anahtar sözcüğünü kullanarak bir başvuru türü oluşturursunuz:You create a reference type by using the class keyword, as the following example shows:

public class SampleRefType
{
    public int value;
}

Artık, bu türü temel alan bir nesneyi bir yönteme geçirirseniz, nesnesine bir başvuru geçirilir.Now, if you pass an object that is based on this type to a method, a reference to the object is passed. Aşağıdaki örnek, SampleRefType ModifyObjectyöntemine bir nesne geçirir:The following example passes an object of type SampleRefType to method ModifyObject:

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 temelde bir yönteme değere göre bir bağımsız değişken geçirdiğinden önceki örnekle aynı şeyi yapar.The example does essentially the same thing as the previous example in that it passes an argument by value to a method. Ancak, bir başvuru türü kullanıldığından, sonuç farklıdır.But, because a reference type is used, the result is different. ModifyObject ' de, parametresinin value alanına yapılan değişiklik obj, rtyönteminde TestRefType bağımsız değişkeninin value alanını da değiştirir.The modification that is made in ModifyObject to the value field of the parameter, obj, also changes the value field of the argument, rt, in the TestRefType method. TestRefType yöntemi çıkış olarak 33 görüntüler.The TestRefType method displays 33 as the output.

Başvuru türlerini başvuruya ve değere göre geçirme hakkında daha fazla bilgi için bkz. başvuru türü parametrelerini ve başvuru türlerinigeçirme.For more information about how to pass reference types by reference and by value, see Passing Reference-Type Parameters and Reference Types.

Döndürülen değerlerReturn values

Yöntemler çağırana bir değer döndürebilir.Methods can return a value to the caller. Dönüş türü, yöntem adından önce listelenen tür voiddeğilse, yöntemi return anahtar sözcüğünü kullanarak değeri döndürebilir.If the return type, the type listed before the method name, is not void, the method can return the value by using the return keyword. Dönüş türüyle eşleşen bir değer gelen return anahtar sözcüğünü içeren bir ifade, bu değeri çağıran metoda döndürür.A statement with the return keyword followed by a value that matches the return type will return that value to the method caller.

Değer, çağırarak değere göre veya 7,0 ile C# başlayarak başvuruya göredöndürülebilir.The value can be returned to the caller by value or, starting with C# 7.0, by reference. Değer, yöntem imzasında ref anahtar sözcüğü kullanılıyorsa ve her bir return anahtar sözcüğünü takip eden başvuruya göre çağırana döndürülür.Values are returned to the caller by reference if the ref keyword is used in the method signature and it follows each return keyword. Örneğin, aşağıdaki yöntem imzası ve Return deyimleri, yöntemin çağırana başvuruya göre estDistance bir değişken adları döndürdüğünü gösterir.For example, the following method signature and return statement indicate that the method returns a variable names estDistance by reference to the caller.

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

return anahtar sözcüğü, yöntemin yürütülmesini de durduruyor.The return keyword also stops the execution of the method. Dönüş türü voidise, değer içermeyen bir return deyimin, metodun yürütülmesini durdurmak için yine de yararlı olması gerekir.If the return type is void, a return statement without a value is still useful to stop the execution of the method. return anahtar sözcüğü olmadan Yöntem, kod bloğunun sonuna ulaştığında yürütmeyi durdurur.Without the return keyword, the method will stop executing when it reaches the end of the code block. Void olmayan bir dönüş türüne sahip metotlar, bir değer döndürmek için return anahtar sözcüğünü kullanmak için gereklidir.Methods with a non-void return type are required to use the return keyword to return a value. Örneğin, bu iki yöntem tamsayılar döndürmek için return anahtar sözcüğünü kullanır:For example, these two methods use the return keyword to return integers:

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ğer kullanmak için, çağırma yöntemi yöntemi tek bir değer olan her yerde, aynı türde bir değer yeterli olacak şekilde kullanabilir.To use a value returned from a method, the calling method can use the method call itself anywhere a value of the same type would be sufficient. Dönüş değerini bir değişkene de atayabilirsiniz.You can also assign the return value to a variable. Örneğin, aşağıdaki iki kod örneği aynı hedefi yerine getirmektedir:For example, the following two code examples accomplish the same goal:

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 result, yerel bir değişken kullanmak isteğe bağlıdır.Using a local variable, in this case, result, to store a value is optional. Kodun okunabilirliğini yardımcı olabilir veya metodun tüm kapsamı için bağımsız değişkenin özgün değerini depolamanız gerekirse gerekli olabilir.It may help the readability of the code, or it may be necessary if you need to store the original value of the argument for the entire scope of the method.

Bir yöntemden başvuruya göre döndürülen bir değeri kullanmak için, değerini değiştirmek istiyorsanız bir ref yerel değişkeni bildirmeniz gerekir.To use a value returned by reference from a method, you must declare a ref local variable if you intend to modify its value. Örneğin, Planet.GetEstimatedDistance yöntemi başvuruya göre bir Double değeri döndürürse, bunu aşağıdaki gibi kodla bir ref yerel değişkeni olarak tanımlayabilirsiniz:For example, if the Planet.GetEstimatedDistance method returns a Double value by reference, you can define it as a ref local variable with code like the following:

ref int distance = plant

Çağırma işlevi diziyi Mgeçirse, dizinin içeriğini değiştiren Mbir yöntemden çok boyutlu bir dizi döndürmektir.Returning a multi-dimensional array from a method, M, that modifies the array's contents is not necessary if the calling function passed the array into M. M elde edilen diziyi, iyi stil veya işlevsel akış için döndürebilir, ancak gerekli değildir çünkü C# tüm başvuru türlerini değere göre geçirir ve dizi başvurusunun değeri dizi işaretçisidir.You may return the resulting array from M for good style or functional flow of values, but it is not necessary because C# passes all reference types by value, and the value of an array reference is the pointer to the array. Yöntem M, dizideki içeriklerinde yapılan tüm değişiklikler, aşağıdaki örnekte gösterildiği gibi diziye başvuran herhangi bir kod tarafından Observable ' tır:In the method M, any changes to the array's contents are observable by any code that has a reference to the array, as shown in the following example:

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;
        }
    }
}

Daha fazla bilgi için bkz. Return.For more information, see return.

Zaman uyumsuz yöntemlerAsync methods

Async özelliğini kullanarak, açık geri çağırmaları kullanmadan zaman uyumsuz yöntemleri çağırabilir veya kodunuzu birden çok yöntemde veya Lambda ifadelerinde el ile böedebilirsiniz.By using the async feature, you can invoke asynchronous methods without using explicit callbacks or manually splitting your code across multiple methods or lambda expressions.

Zaman uyumsuz değiştiriciyle bir yöntemi işaretlerseniz, yönteminde await işlecini kullanabilirsiniz.If you mark a method with the async modifier, you can use the await operator in the method. Denetim zaman uyumsuz yöntemde bir await ifadesine ulaştığında denetim çağırana döner ve beklenen görev tamamlanana kadar yöntemdeki ilerleme durumu askıya alınır.When control reaches an await expression in the async method, control returns to the caller, and progress in the method is suspended until the awaited task completes. Görev tamamlandığında, yürütme yöntemi içinde çalışmaya çalışabilir.When the task is complete, execution can resume in the method.

Not

Zaman uyumsuz bir yöntem, henüz tamamlanmamış olan ilk beklemiş nesneyle karşılaştığında çağırana döner veya zaman uyumsuz yöntemin sonuna kadar, hangisi önce gerçekleşiyorsa.An async method returns to the caller when either it encounters the first awaited object that’s not yet complete or it gets to the end of the async method, whichever occurs first.

Zaman uyumsuz bir yöntem Task<TResult>, Taskveya void dönüş türüne sahip olabilir.An async method can have a return type of Task<TResult>, Task, or void. Void dönüş türü birincil olarak, bir void dönüş türünün gerekli olduğu olay işleyicilerini tanımlamak için kullanılır.The void return type is used primarily to define event handlers, where a void return type is required. Void döndüren zaman uyumsuz bir yöntem beklenemez ve void döndüren bir yöntemi çağıran yöntemin aldığı özel durumları yakalayamaz.An async method that returns void can't be awaited, and the caller of a void-returning method can't catch exceptions that the method throws.

Aşağıdaki örnekte DelayAsync, dönüş türü Task<TResult>olan zaman uyumsuz bir yöntemdir.In the following example, DelayAsync is an async method that has a return type of Task<TResult>. DelayAsync, bir tamsayı döndüren bir return bildirimine sahiptir.DelayAsync has a return statement that returns an integer. Bu nedenle DelayAsync yöntemi bildirimi Task<int>dönüş türüne sahip olmalıdır.Therefore the method declaration of DelayAsync must have a return type of Task<int>. Dönüş türü Task<int>olduğundan, aşağıdaki deyimde gösterildiği gibi, DoSomethingAsync await ifadenin değerlendirmesi bir tamsayı üretir: int result = await delayTask.Because the return type is Task<int>, the evaluation of the await expression in DoSomethingAsync produces an integer as the following statement demonstrates: int result = await delayTask.

startButton_Click yöntemi, void dönüş türüne sahip bir zaman uyumsuz metoda bir örnektir.The startButton_Click method is an example of an async method that has a return type of void. DoSomethingAsync zaman uyumsuz bir yöntem olduğundan, aşağıdaki bildirimde gösterildiği gibi, DoSomethingAsync çağrısının görevi beklenmelidir: await DoSomethingAsync();.Because DoSomethingAsync is an async method, the task for the call to DoSomethingAsync must be awaited, as the following statement shows: await DoSomethingAsync();. Metodun bir await ifadesi olduğundan startButton_Click yöntemi async değiştiricisiyle tanımlanmalıdır.The startButton_Click method must be defined with the async modifier because the method has an await expression.

// using System.Diagnostics;
// using System.Threading.Tasks;

// This Click event is marked with the async modifier.
private async void startButton_Click(object sender, RoutedEventArgs e)
{
    await DoSomethingAsync();
}

private 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();

    Debug.WriteLine("Result: " + result);
}

private async Task<int> DelayAsync()
{
    await Task.Delay(100);
    return 5;
}

// Output:
//  Result: 5

Zaman uyumsuz bir yöntem herhangi bir ref veya Out parametresi bildiremez, ancak bu parametrelere sahip yöntemleri çağırabilir.An async method can't declare any ref or out parameters, but it can call methods that have such parameters.

Zaman uyumsuz yöntemler hakkında daha fazla bilgi için bkz. Async ve await Ile zaman uyumsuz programlama, zaman uyumsuz programlarda denetim akışıve zaman uyumsuz dönüş türleri.For more information about async methods, see Asynchronous Programming with async and await, Control Flow in Async Programs, and Async Return Types.

İfade gövdesi tanımlarıExpression body definitions

Yalnızca bir ifadenin sonucuyla hemen dönen veya yöntemin gövdesi olarak tek bir deyimi olan yöntem tanımlarının olması yaygındır.It is common to have method definitions that simply return immediately with the result of an expression, or that have a single statement as the body of the method. =>kullanarak bu tür yöntemleri tanımlamaya yönelik bir sözdizimi kısayolu vardır:There is a syntax shortcut for defining such methods using =>:

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ürse veya zaman uyumsuz bir yöntem ise, yöntemin gövdesi bir deyim ifadesi olmalıdır (Lambdalar ile aynı).If the method returns void or is an async method, then the body of the method must be a statement expression (same as with lambdas). Özellikler ve Dizin oluşturucular için, bunların salt okunmaları gerekir ve get erişimci anahtar sözcüğünü kullanmayın.For properties and indexers, they must be read only, and you don't use the get accessor keyword.

YineleyicilerIterators

Yineleyici, bir koleksiyon üzerinde liste veya dizi gibi özel bir yineleme gerçekleştirir.An iterator performs a custom iteration over a collection, such as a list or an array. Bir yineleyici, her öğeyi birer birer döndürmek için yield return ifadesini kullanır.An iterator uses the yield return statement to return each element one at a time. Bir yield return ifadesine ulaşıldığında, koddaki geçerli konum hatırlanır.When a yield return statement is reached, the current location in code is remembered. Yineleyici bir sonraki sefer çağrıldığında, yürütme o konumdan yeniden başlatılır.Execution is restarted from that location when the iterator is called the next time.

Bir foreach ifadesi kullanarak istemci kodundan bir yineleyici çağırın.You call an iterator from client code by using a foreach statement.

Yineleyicinin dönüş türü IEnumerable, IEnumerable<T>, IEnumeratorveya IEnumerator<T>olabilir.The return type of an iterator can be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

Daha fazla bilgi için bkz. yineleyiciler.For more information, see Iterators.

C# dili belirtimiC# language specification

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi.For more information, see the C# Language Specification. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.The language specification is the definitive source for C# syntax and usage.

Ayrıca bkz.See also