Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 public
gibi isteğe bağlı değiştiriciler, dönüş değeri, yöntemin adı ve herhangi bir yöntem parametresi belirtilerek private
arabirimi abstract
sı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, SampleRefType
yö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, value
parametresinin obj
alanını etkilediği gibi, value
yöntemindeki rt
bağı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) void
değ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 result
yerel 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 M
yö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.
M
yö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 void
dö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, DelayAsync
dö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.