MetodyMethods

Metoda jest blokiem kodu, który zawiera szereg instrukcji.A method is a code block that contains a series of statements. Program powoduje, że instrukcji do wykonania przez wywołanie metody i określenie argumentów wymaganej metody.A program causes the statements to be executed by calling the method and specifying any required method arguments. W języku C# co instrukcja wykonanych odbywa się w kontekście metody.In C#, every executed instruction is performed in the context of a method. Main Metoda jest punkt wejścia dla każdej aplikacji C# i jest wywoływana przez środowisko uruchomieniowe języka wspólnego (CLR), gdy program jest uruchomiony.The Main method is the entry point for every C# application and it is called by the common language runtime (CLR) when the program is started.

Uwaga

W tym temacie omówiono metody o nazwie.This topic discusses named methods. Aby uzyskać informacje na temat funkcji anonimowych zobacz funkcjami anonimowymi.For information about anonymous functions, see Anonymous Functions.

Ten temat zawiera następujące sekcje:This topic contains the following sections:

Podpisy metodMethod signatures

Metody są deklarowane w class lub struct przez określenie:Methods are declared in a class or struct by specifying:

  • Opcjonalny dostęp na poziomie, takich jak public lub private.An optional access level, such as public or private. Wartość domyślna to private.The default is private.
  • Modyfikatory opcjonalne, takie jak abstract lub sealed.Optional modifiers such as abstract or sealed.
  • Wartość zwracana lub void Jeśli metoda nie ma żadnego.The return value, or void if the method has none.
  • Nazwa metody.The method name.
  • Wszystkie parametry metody.Any method parameters. Parametry metody są ujęte w nawiasy i są oddzielone przecinkami.Method parameters are enclosed in parentheses and are separated by commas. Pustych nawiasów zwykłych wskazują, że metoda nie wymaga parametrów.Empty parentheses indicate that the method requires no parameters.

Te elementy tworzą razem podpis metody.These parts together form the method signature.

Uwaga

Zwracany typ metody nie jest część podpisu metody na potrzeby przeciążenie metody.A return type of a method is not part of the signature of the method for the purposes of method overloading. Jednak jest część podpisu metody podczas określania zgodności między delegata i metody, która wskazuje.However, it is part of the signature of the method when determining the compatibility between a delegate and the method that it points to.

W poniższym przykładzie zdefiniowano klasę o nazwie Motorcycle zawiera pięć metod:The following example defines a class named Motorcycle that contains five methods:

using System;

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 can override the base class implementation.
   public virtual int Drive(TimeSpan time, int speed) { /* Method statements here */ return 0; }

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

Należy pamiętać, że Motorcycle klasa zawiera metody przeciążonej, Drive.Note that the Motorcycle class includes an overloaded method, Drive. Dwie metody mają taką samą nazwę, ale należy zróżnicować za jego typy parametrów.Two methods have the same name, but must be differentiated by their parameter types.

Wywołanie metodyMethod invocation

Metody mogą być albo wystąpienia lub statyczne.Methods can be either instance or static. Wywoływanie metody wystąpienia wymaga utworzenia wystąpienia obiektu, a następnie wywołać metodę dla tego obiektu; Metoda wystąpienia działa na tego wystąpienia i jego danych.Invoking an instance method requires that you instantiate an object and call the method on that object; an instance method operates on that instance and its data. Wywołaj metodę statyczną, odwołując się do nazwy typu, do którego należy metoda; metody statyczne nie działają na dane wystąpienia.You invoke a static method by referencing the name of the type to which the method belongs; static methods do not operate on instance data. Próba wywołania metody statycznej za pomocą wystąpienia obiektu generuje błąd kompilatora.Attempting to call a static method through an object instance generates a compiler error.

Wywołanie metody jest jak uzyskiwanie dostępu do pola.Calling a method is like accessing a field. Po nazwę obiektu (jeśli wywołujesz metodę wystąpienia) lub nazwę typu (w przypadku wywołania static metoda), Dodaj okres, nazwy metody i nawiasy.After the object name (if you are calling an instance method) or the type name (if you are calling a static method), add a period, the name of the method, and parentheses. Argumenty są wyświetlane w nawiasach i są oddzielone przecinkami.Arguments are listed within the parentheses, and are separated by commas.

Definicja metody określa nazwy i typy parametrów, które są wymagane.The method definition specifies the names and types of any parameters that are required. Jeśli obiekt wywołujący wywołuje metodę, udostępnia konkretnych wartości nazywanych argumentami — dla każdego parametru.When a caller invokes the method, it provides concrete values, called arguments, for each parameter. Argumenty muszą być zgodne z typem parametru, ale nazwę argumentu, jeśli jest on używany w wywoływanym kodzie, nie trzeba być taka sama jak parametr o nazwie zdefiniowany w metodzie.The arguments must be compatible with the parameter type, but the argument name, if one is used in the calling code, does not have to be the same as the parameter named defined in the method. W poniższym przykładzie Square metoda zawiera jeden parametr typu int o nazwie i.In the following example, the Square method includes a single parameter of type int named i. Pierwsza metoda wywołania przebiegów Square metoda zmienną typu int o nazwie num; drugi, stałej liczbowej; oraz trzeci, wyrażenie.The first method call passes the Square method a variable of type int named num; the second, a numeric constant; and the third, an expression.

public class Example
{
   public static void Main()
   {
      // Call with an int variable.
      int num = 4;
      int productA = Square(num);

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

      // Call with an expression that evaluates to int.
      int productC = Square(productA * 3);
   }
   
   static int Square(int i)
   {
      // Store input argument in a local variable.
      int input = i;
      return input * input;
   }
}

Najczęściej używany typ wywołania metody używane argumenty pozycyjne; dostarcza mu argumenty w kolejności parametrów metody.The most common form of method invocation used positional arguments; it supplies arguments in the same order as method parameters. Metody Motorcycle klasy, w związku z tym może być wywoływana tak jak w poniższym przykładzie.The methods of the Motorcycle class can therefore be called as in the following example. Wywołanie Drive metody, na przykład zawiera dwa argumenty, które odpowiadają dwa parametry przy użyciu składni metody.The call to the Drive method, for example, includes two arguments that correspond to the two parameters in the method's syntax. Pierwszy staje się wartością miles parametr, drugi wartość speed parametru.The first becomes the value of the miles parameter, the second the value of the speed parameter.

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

Można również używać argumenty nazwane zamiast argumenty pozycyjne, podczas wywoływania metody.You can also used named arguments instead of positional arguments when invoking a method. Przy użyciu nazwane argumenty, określ nazwę parametru z dwukropkiem (":") i argumentu.When using named arguments, you specify the parameter name followed by a colon (":") and the argument. Argumenty do metody mogą być wyświetlane w dowolnej kolejności, tak długo, jak wszystkie wymagane argumenty są obecne.Arguments to the method can appear in any order, as long as all required arguments are present. W poniższym przykładzie użyto argumentów nazwanych do wywołania TestMotorcycle.Drive metody.The following example uses named arguments to invoke the TestMotorcycle.Drive method. W tym przykładzie nazwane argumenty są przekazywane w kolejności przeciwnej w liście parametrów metody.In this example, the named arguments are passed in the opposite order from the method's parameter list.

using System;

class TestMotorcycle : Motorcycle
{
   public override int Drive(int miles, int speed)
   {
      return (int) Math.Round( ((double)miles) / speed, 0);
   }

   public override double GetTopSpeed()
   {
      return 108.4;
   }

   static void Main()
   {
      
      TestMotorcycle moto = new TestMotorcycle();
      moto.StartEngine();
      moto.AddGas(15);
      var travelTime = moto.Drive(speed: 60, miles: 170);
      Console.WriteLine("Travel time: approx. {0} hours", travelTime);            
   }
}
// The example displays the following output:
//      Travel time: approx. 3 hours

Można wywołać metody za pomocą obu argumentów pozycyjnych i argumenty nazwane.You can invoke a method using both positional arguments and named arguments. Argument pozycyjny nie można jednak wykonać argumentu nazwanego.However, a positional argument cannot follow a named argument. Poniższy przykład przedstawia wywoływanie TestMotorcycle.Drive metodę jak w poprzednim przykładzie, za pomocą jednego argumentu pozycyjnego i jeden argument nazwany.The following example invokes the TestMotorcycle.Drive method from the previous example using one positional argument and one named argument.

var travelTime = moto.Drive(170, speed: 55);

Metody dziedziczone i zastąpionaInherited and overridden methods

Oprócz elementów członkowskich, które są jawnie zdefiniowane w typie typ dziedziczy składowych zdefiniowanych w jej klas podstawowych.In addition to the members that are explicitly defined in a type, a type inherits members defined in its base classes. Ponieważ wszystkie typy w systemie typu zarządzanego dziedziczy bezpośrednio lub pośrednio z Object klasy, wszystkie typy odziedziczenie jego elementów członkowskich, takich jak Equals(Object), GetType(), i ToString().Since all types in the managed type system inherit directly or indirectly from the Object class, all types inherit its members, such as Equals(Object), GetType(), and ToString(). W poniższym przykładzie zdefiniowano Person klasy, są tworzone wystąpienia dwóch Person obiektów i wywołuje Person.Equals metodę pozwala ustalić, czy dwa obiekty są takie same.The following example defines a Person class, instantiates two Person objects, and calls the Person.Equals method to determine whether the two objects are equal. Equals Metody, jednak nie jest zdefiniowany w Person klasy; zostało ono odziedziczone Object.The Equals method, however, is not defined in the Person class; it is inherited from Object.

using System;

public class Person
{
   public String FirstName;
}

public class Example
{
   public static void Main()
   {
      var p1 = new Person();
      p1.FirstName = "John";
      var p2 = new Person();
      p2.FirstName = "John";
      Console.WriteLine("p1 = p2: {0}", p1.Equals(p2));
   }
}
// The example displays the following output:
//      p1 = p2: False

Typy można zastąpić dziedziczone elementy członkowskie przy użyciu override — słowo kluczowe i zapewniając implementację przeciążonej.Types can override inherited members by using the override keyword and providing an implementation for the overridden method. Podpis metody musi być taka sama, jak w przypadku przeciążonej.The method signature must be the same as that of the overridden method. Poniższy przykład jest podobne do pokazanego w poprzednim, z tą różnicą, że zastępuje ona Equals(Object) metody.The following example is like the previous one, except that it overrides the Equals(Object) method. (Zastępuje ona również GetHashCode() metody, ponieważ te dwie metody są przeznaczone do zapewnić spójne wyniki.)(It also overrides the GetHashCode() method, since the two methods are intended to provide consistent results.)

using System;

public class Person
{
   public String FirstName;

   public override bool Equals(object obj)
   {
      var p2 = obj as Person; 
      if (p2 == null)
         return false;
      else
         return FirstName.Equals(p2.FirstName);
   }

   public override int GetHashCode()
   {
      return FirstName.GetHashCode();
   } 
}

public class Example
{
   public static void Main()
   {
      var p1 = new Person();
      p1.FirstName = "John";
      var p2 = new Person();
      p2.FirstName = "John";
      Console.WriteLine("p1 = p2: {0}", p1.Equals(p2));
   }
}
// The example displays the following output:
//      p1 = p2: True

Przekazywanie parametrówPassing parameters

Typy w języku C# są albo typy wartości lub typy odwołań.Types in C# are either value types or reference types. Aby uzyskać listę typów wbudowanych wartości, zobacz typy i zmienne.For a list of built-in value types, see Types and variables. Domyślnie typy odwołań i typy wartości są przekazywane do metody przez wartość.By default, both value types and reference types are passed to a method by value.

Przekazywanie parametrów przez wartośćPassing parameters by value

Gdy typ wartości jest przekazywany do metody przez wartość, kopię obiektu, a nie sam obiekt jest przekazywany do metody.When a value type is passed to a method by value, a copy of the object instead of the object itself is passed to the method. W związku z tym zmiany do obiektu w metodzie wywoływanej nie mają wpływu na oryginalny obiekt gdy sterowanie powraca do obiektu wywołującego.Therefore, changes to the object in the called method have no effect on the original object when control returns to the caller.

Poniższy przykład przekazuje do metody typu wartości przez wartość, a następnie wywoływana metoda próbuje zmienić wartość typu wartości.The following example passes a value type to a method by value, and the called method attempts to change the value type's value. Definiuje zmienną typu int, który jest typem wartości, inicjuje jej wartość na 20 i przekazuje go do metody o nazwie ModifyValue który zmienia wartość zmiennej do 30.It defines a variable of type int, which is a value type, initializes its value to 20, and passes it to a method named ModifyValue that changes the variable's value to 30. Gdy metoda zwróci wartość, jednak wartość zmiennej pozostaje bez zmian.When the method returns, however, the variable's value remains unchanged.

using System;

public class Example
{
   public static void Main()
   {
      int value = 20;
      Console.WriteLine("In Main, value = {0}", value);
      ModifyValue(value);
      Console.WriteLine("Back in Main, value = {0}", value);
   }

   static void ModifyValue(int i)
   {
      i = 30;
      Console.WriteLine("In ModifyValue, parameter value = {0}", i);
      return;
   }
}
// The example displays the following output:
//      In Main, value = 20
//      In ModifyValue, parameter value = 30
//      Back in Main, value = 20

Gdy obiekt typu referencyjnego jest przekazywany do metody przez wartość, odwołanie do obiektu jest przekazywany przez wartość.When an object of a reference type is passed to a method by value, a reference to the object is passed by value. Oznacza to, że metoda odbiera nie samego obiektu, ale argument, który wskazuje lokalizację obiektu.That is, the method receives not the object itself, but an argument that indicates the location of the object. Jeśli zmienisz członka obiektu za pomocą tego odwołania, zmiana jest odzwierciedlana w obiekcie, gdy sterowanie powraca do wywoływania metody.If you change a member of the object by using this reference, the change is reflected in the object when control returns to the calling method. Jednak zastępując obiekt przekazany do metody nie ma wpływu na oryginalny obiekt gdy sterowanie powraca do obiektu wywołującego.However, replacing the object passed to the method has no effect on the original object when control returns to the caller.

W poniższym przykładzie zdefiniowano klasę (który jest typem referencyjnym) o nazwie SampleRefType.The following example defines a class (which is a reference type) named SampleRefType. Metoda tworzy SampleRefType obiektów, przypisuje 44 do jego value pola, a następnie przekazuje obiekt do ModifyObject metody.It instantiates a SampleRefType object, assigns 44 to its value field, and passes the object to the ModifyObject method. W tym przykładzie działa zasadniczo tak samo jak w poprzednim przykładzie — przekazaniem argumentu przez wartość do metody.This example does essentially the same thing as the previous example -- it passes an argument by value to a method. Ale ponieważ jest używany typ odwołania, wynik jest inny.But because a reference type is used, the result is different. Ze zmianami, które znajduje się w ModifyObject do obj.value pola również zmiany value pole argumentu, rtw Main jako dane wyjściowe w przykładzie pokazano metodę 33.The modification that is made in ModifyObject to the obj.value field also changes the value field of the argument, rt, in the Main method to 33, as the output from the example shows.

using System;

public class SampleRefType
{
    public int value;
}

public class Example
{
    public static void Main()
    {
        var rt = new SampleRefType();
        rt.value = 44;
        ModifyObject(rt);
        Console.WriteLine(rt.value);
    }
        
    static void ModifyObject(SampleRefType obj)
    {
        obj.value = 33;
    }
}

Przekazywanie parametrów przez odwołaniePassing parameters by reference

Należy podać parametr według odwołania, jeśli chcesz zmienić wartość argumentu w metodzie i ma na celu odzwierciedlenia tej zmiany, gdy sterowanie powraca do wywoływania metody.You pass a parameter by reference when you want to change the value of an argument in a method and want to reflect that change when control returns to the calling method. Aby przekazać parametr według odwołania, należy użyć ref lub out — słowo kluczowe.To pass a parameter by reference, you use the ref or out keyword. Można również przekazać wartość przez odwołanie, aby unikać kopiowania, ale nadal zapobiec przy użyciu in — słowo kluczowe.You can also pass a value by reference to avoid copying but still prevent modifications using the in keyword.

Poniższy przykład jest taka sama jak poprzedni, z wyjątkiem wartość jest przekazywana przez odwołanie do ModifyValue metody.The following example is identical to the previous one, except the value is passed by reference to the ModifyValue method. Po zmodyfikowaniu wartości parametru w ModifyValue znajduje odzwierciedlenie metody zmianę wartości, gdy sterowanie powraca do obiektu wywołującego.When the value of the parameter is modified in the ModifyValue method, the change in value is reflected when control returns to the caller.

using System;

public class Example
{
   public static void Main()
   {
      int value = 20;
      Console.WriteLine("In Main, value = {0}", value);
      ModifyValue(ref value);
      Console.WriteLine("Back in Main, value = {0}", value);
   }

   static void ModifyValue(ref int i)
   {
      i = 30;
      Console.WriteLine("In ModifyValue, parameter value = {0}", i);
      return;
   }
}
// The example displays the following output:
//      In Main, value = 20
//      In ModifyValue, parameter value = 30
//      Back in Main, value = 30

Typowy wzorzec, który używa parametrów ref obejmuje zamianę wartości zmiennych.A common pattern that uses by ref parameters involves swapping the values of variables. Dwie zmienne jest przekazywany do metody za pomocą odwołania, a metoda zamienia ich zawartości.You pass two variables to a method by reference, and the method swaps their contents. Poniższy przykład zamienia wartości całkowitych.The following example swaps integer values.

using System;

public class Example
{
   static void Main()
   {
      int i = 2, j = 3;
      System.Console.WriteLine("i = {0}  j = {1}" , i, j);

      Swap(ref i, ref j);

      System.Console.WriteLine("i = {0}  j = {1}" , i, j);
   }

   static void Swap(ref int x, ref int y)
   {
      int temp = x;
      x = y;
      y = temp;
   }   
}
// The example displays the following output:
//      i = 2  j = 3
//      i = 3  j = 2

Przekazywanie parametrów typu Odwołanie umożliwia zmianę wartości samo odwołanie, a nie wartość jego poszczególne elementy lub pola.Passing a reference-type parameter allows you to change the value of the reference itself, rather than the value of its individual elements or fields.

Parameter — tabliceParameter arrays

Czasami wymagania Określ dokładna liczba argumentów do metody jest restrykcyjne.Sometimes, the requirement that you specify the exact number of arguments to your method is restrictive. Za pomocą params — słowo kluczowe, aby wskazać, że parametr jest tablicą parametrów, musisz zezwolić na metodę do wywołania z różną liczbą argumentów.By using the params keyword to indicate that a parameter is a parameter array, you allow your method to be called with a variable number of arguments. Parametr oznakowane za pomocą params — słowo kluczowe musi być typem tablicy, a musi być ostatnim parametrem na liście parametrów metody.The parameter tagged with the params keyword must be an array type, and it must be the last parameter in the method's parameter list.

Obiekt wywołujący może następnie wywołania metody w jednym z trzech sposobów:A caller can then invoke the method in either of three ways:

  • Przekazując tablicę odpowiedniego typu, który zawiera odpowiednią liczbę elementów.By passing an array of the appropriate type that contains the desired number of elements.
  • Przekazując rozdzielaną przecinkami listę pojedynczych argumentów odpowiedniego typu w metodzie.By passing a comma-separated list of individual arguments of the appropriate type to the method.
  • Zapewniając nie argument tablicy parametrów.By not providing an argument to the parameter array.

W poniższym przykładzie zdefiniowano metodę o nazwie GetVowels zwracającego wszystkie samogłoski z tablicy parametrów.The following example defines a method named GetVowels that returns all the vowels from a parameter array. Main Metoda przedstawiono wszystkie trzy sposoby wywoływania metody.The Main method illustrates all three ways of invoking the method. Nie trzeba podać argumenty dla parametrów, które zawierają obiekty wywołujące params modyfikator.Callers are not required to supply any arguments for parameters that include the params modifier. W takim przypadku parametr jest null.In that case, the parameter is null.

using System;
using System.Linq;

class Example
{
    static void Main()
    {
        string fromArray = GetVowels(new[] { "apple", "banana", "pear" });
        Console.WriteLine($"Vowels from array: '{fromArray}'");

        string fromMultipleArguments = GetVowels("apple", "banana", "pear");
        Console.WriteLine($"Vowels from multiple arguments: '{fromMultipleArguments}'");

        string fromNoValue = GetVowels();
        Console.WriteLine($"Vowels from no value: '{fromNoValue}'");
    }

    static string GetVowels(params string[] input)
    {
        if (input == null || input.Length == 0)
        {
            return string.Empty;
        }

        var vowels = new char[] { 'A', 'E', 'I', 'O', 'U' };
        return string.Concat(
            input.SelectMany(
                word => word.Where(letter => vowels.Contains(char.ToUpper(letter)))));
    }
}

// The example displays the following output:
//     Vowels from array: 'aeaaaea'
//     Vowels from multiple arguments: 'aeaaaea'
//     Vowels from no value: ''

Opcjonalne parametry i argumentyOptional parameters and arguments

Definicję metody można określić, że jej parametry są wymagane lub czy są opcjonalne.A method definition can specify that its parameters are required or that they are optional. Domyślnie parametry są wymagane.By default, parameters are required. Następujące parametry opcjonalne są określone przez dołączenie wartości domyślnej parametru w definicji metody.Optional parameters are specified by including the parameter's default value in the method definition. Gdy metoda jest wywoływana, jeśli nie dostarczono żadnego argumentu dla parametru opcjonalnego, w zamian jest używana wartość domyślna.When the method is called, if no argument is supplied for an optional parameter, the default value is used instead.

Wartość domyślna parametru musi zostać przypisany przez jedną z następujących rodzajów wyrażeń:The parameter's default value must be assigned by one of the following kinds of expressions:

  • Stała, takich jak ciąg literału lub numer.A constant, such as a literal string or number.
  • Wyrażenie w formie new ValType, gdzie ValType jest typem wartości.An expression of the form new ValType, where ValType is a value type. Należy pamiętać, że wywołuje to typ wartości niejawnego konstruktora bez parametrów, który nie jest faktycznej składowej typu.Note that this invokes the value type's implicit parameterless constructor, which is not an actual member of the type.
  • Wyrażenie w formie default(ValType), gdzie ValType jest typem wartości.An expression of the form default(ValType), where ValType is a value type.

Jeśli metoda zawiera zarówno wymaganych i opcjonalnych parametrów, opcjonalne parametry są definiowane na końcu listy parametrów po wszystkich wymaganych parametrów.If a method includes both required and optional parameters, optional parameters are defined at the end of the parameter list, after all required parameters.

W poniższym przykładzie zdefiniowano metodę ExampleMethod, która ma jeden wymagany i dwa parametry opcjonalne.The following example defines a method, ExampleMethod, that has one required and two optional parameters.

using System;

public class Options
{
   public void ExampleMethod(int required, int optionalInt = default(int),
                             string description = "Optional Description")
   {
      Console.WriteLine("{0}: {1} + {2} = {3}", description, required, 
                        optionalInt, required + optionalInt);
   }
}

Gdy wywoływana jest metoda, za pomocą wielu argumentów opcjonalnych, za pomocą argumentów pozycyjnych, obiekt wywołujący musi podać argument dla wszystkich parametrów opcjonalnych z pierwszego w celu ostatni, dla którego zostanie podany argument.If a method with multiple optional arguments is invoked using positional arguments, the caller must supply an argument for all optional parameters from the first one to the last one for which an argument is supplied. W przypadku właściwości ExampleMethod metody, na przykład, jeśli obiekt wywołujący dostarcza argument description parametru, jego należy również podać jeden dla optionalInt parametru.In the case of the ExampleMethod method, for example, if the caller supplies an argument for the description parameter, it must also supply one for the optionalInt parameter. opt.ExampleMethod(2, 2, "Addition of 2 and 2"); to wywołanie prawidłowej metody; opt.ExampleMethod(2, , "Addition of 2 and 0"); generuje "Brak argumentu" błąd kompilatora.opt.ExampleMethod(2, 2, "Addition of 2 and 2"); is a valid method call; opt.ExampleMethod(2, , "Addition of 2 and 0"); generates an "Argument missing" compiler error.

Jeśli metoda jest wywoływana przy użyciu argumentów nazwanych lub kombinacji argumenty pozycyjne i nazwane, obiekt wywołujący, można pominąć argumenty, które należy wykonać ostatni argument pozycyjny w wywołaniu metody.If a method is called using named arguments or a combination of positional and named arguments, the caller can omit any arguments that follow the last positional argument in the method call.

Poniższy przykład wywołuje ExampleMethod metoda trzy razy.The following example calls the ExampleMethod method three times. Wywołań metod pierwsze dwa użycia argumentów pozycyjnych.The first two method calls use positional arguments. Pierwszy pomija oba argumenty opcjonalne, podczas gdy drugi pomija ostatni argument.The first omits both optional arguments, while the second omits the last argument. Trzecie wywołanie metody dostarcza argument pozycyjny dla wymaganego parametru, ale używa argumentu nazwanego, aby podać wartość description parametru pomijając optionalInt argumentu.The third method call supplies a positional argument for the required parameter, but uses a named argument to supply a value to the description parameter while omitting the optionalInt argument.

public class Example
{
   public static void Main()
   {
      var opt = new Options();
      opt.ExampleMethod(10);
      opt.ExampleMethod(10, 2);
      opt.ExampleMethod(12, description: "Addition with zero:");
   }
} 
// The example displays the following output:
//      Optional Description: 10 + 0 = 10
//      Optional Description: 10 + 2 = 12
//      Addition with zero:: 12 + 0 = 12

Ma wpływ na korzystanie z parametrów opcjonalnych Rozpoznanie przeciążenia, czy w sposób, w którym kompilator języka C# Określa, które przeładowanie określonego powinien być wywoływany przez wywołanie metody w następujący sposób:The use of optional parameters affects overload resolution, or the way in which the C# compiler determines which particular overload should be invoked by a method call, as follows:

  • Metoda, indeksator lub Konstruktor jest kandydatem do wykonywania w przypadku każdego z jego parametrów jest opcjonalny albo odpowiada według nazwy lub pozycji, aby jeden argument w instrukcji wywołujące, i że argument można przekonwertować na typ parametru.A method, indexer, or constructor is a candidate for execution if each of its parameters either is optional or corresponds, by name or by position, to a single argument in the calling statement, and that argument can be converted to the type of the parameter.
  • Jeśli zostanie znalezione więcej niż jeden Release candidate, zasady rozpoznawania przeciążenia preferowanych konwersje są stosowane do argumentów, które są jawnie określone.If more than one candidate is found, overload resolution rules for preferred conversions are applied to the arguments that are explicitly specified. Pominięty Argumenty opcjonalne parametry są ignorowane.Omitted arguments for optional parameters are ignored.
  • Jeśli dwa kandydatów zostaną ocenione one równie dobrze, preferencji jest przesyłany do Release candidate, który nie ma parametrów opcjonalnych, które zostały pominięte argumentów w wywołaniu.If two candidates are judged to be equally good, preference goes to a candidate that does not have optional parameters for which arguments were omitted in the call. Jest to konsekwencją Ogólne preferencji w przeciążeniu rozdzielczości dla kandydatów, które mają mniej parametrów.This is a consequence of a general preference in overload resolution for candidates that have fewer parameters.

Zwracane wartościReturn values

Metody może zwrócić wartości do obiektu wywołującego.Methods can return a value to the caller. Jeśli nie jest zwracany typ (typu wymienionego przed nazwą metody) void, metoda może zwrócić wartość przy użyciu return — słowo kluczowe.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. Instrukcja zawierająca return — słowo kluczowe następuje zmiennej, stałej lub wyrażenia, który jest zgodny z typem zwracanym zwróci tę wartość do obiektu wywołującego metodę.A statement with the return keyword followed by a variable, constant, or expression that matches the return type will return that value to the method caller. Metody z innym niż void zwrotu typu są wymagane do użycia return — słowo kluczowe w celu zwrócenia wartości.Methods with a non-void return type are required to use the return keyword to return a value. return — Słowo kluczowe również zatrzymuje wykonywanie metody.The return keyword also stops the execution of the method.

Jeśli typ zwracany jest void, return instrukcji bez wartości nadal jest użyteczne do zatrzymywania wykonywania metody.If the return type is void, a return statement without a value is still useful to stop the execution of the method. Bez return — słowo kluczowe, metoda wykonywanie zostanie przerwane po osiągnięciu końca bloku kodu.Without the return keyword, the method will stop executing when it reaches the end of the code block.

Na przykład użyć tych dwóch metod return — słowo kluczowe, aby zwrócić liczb całkowitych: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;
    }
}

Aby użyć wartości zwrócone z metody, wywoływania metody użyć wywołania metody które się dowolnym wartością tego samego typu może być wystarczające.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. Można także przypisać zwracana wartość do zmiennej.You can also assign the return value to a variable. Na przykład poniższe dwa przykłady kodu osiągnięcia tego samego celu: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);

Za pomocą zmiennej lokalnej, w tym przypadku result, aby przechowywać wartość jest opcjonalna.Using a local variable, in this case, result, to store a value is optional. Może ułatwić czytelność kodu lub może być konieczne, jeśli chcesz przechować oryginalnej wartości argumentu dla całego zakresu metody.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.

Czasami chcesz metodę do zwrócenia więcej niż jedną wartość.Sometimes, you want your method to return more than a single value. Począwszy od języka C# 7.0, możesz to łatwo zrobić przy użyciu typy krotki i literałach krotek.Starting with C# 7.0, you can do this easily by using tuple types and tuple literals. Typ krotki definiuje typy danych elementów krotki.The tuple type defines the data types of the tuple's elements. Literałach krotek zawierają rzeczywiste wartości zwracane spójnej kolekcji.Tuple literals provide the actual values of the returned tuple. W poniższym przykładzie (string, string, string, int) definiuje typ spójnej kolekcji, który jest zwracany przez GetPersonalInfo metody.In the following example, (string, string, string, int) defines the tuple type that is returned by the GetPersonalInfo method. Wyrażenie (per.FirstName, per.MiddleName, per.LastName, per.Age) jest spójna kolekcja znajdująca się literału; metoda zwraca nazwę pierwszego, drugie imię i nazwisko, wraz z okresu ważności z PersonInfo obiektu.The expression (per.FirstName, per.MiddleName, per.LastName, per.Age) is the tuple literal; the method returns the first, middle, and last name, along with the age, of a PersonInfo object.

public (string, string, string, int) GetPersonalInfo(string id)
{
    PersonInfo per = PersonInfo.RetrieveInfoById(id);
    return (per.FirstName, per.MiddleName, per.LastName, per.Age);
}

Obiekt wywołujący mogły zwrócone spójna kolekcja znajdująca się z kodem, jak pokazano poniżej:The caller can then consume the returned tuple with code like the following:

var person = GetPersonalInfo("111111111")
Console.WriteLine("{person.Item1} {person.Item3}: age = {person.Item4}");

Również można przypisać nazwy elementów krotki w definicji typu krotki.Names can also be assigned to the tuple elements in the tuple type definition. W poniższym przykładzie pokazano alternatywnej wersji GetPersonalInfo metodę, która korzysta z nazwanych elementów:The following example shows an alternate version of the GetPersonalInfo method that uses named elements:

public (string FName, string MName, string LName, int Age) GetPersonalInfo(string id)
{
    PersonInfo per = PersonInfo.RetrieveInfoById(id);
    return (per.FirstName, per.MiddleName, per.LastName, per.Age);
}

Poprzednie wywołanie GetPersonInfo metoda może być modyfikowany w następujący sposób:The previous call to the GetPersonInfo method can then be modified as follows:

var person = GetPersonalInfo("111111111");
Console.WriteLine("{person.FName} {person.LName}: age = {person.Age}");

Jeśli metoda jest przekazywana tablicę jako argument i modyfikuje wartość poszczególnych elementów, nie jest konieczne dla metody zwrócić tablicę, mimo że można to zrobić dla dobra stylu lub funkcjonalności przepływu wartości.If a method is passed an array as an argument and modifies the value of individual elements, it is not necessary for the method to return the array, although you may choose to do so for good style or functional flow of values. Jest to spowodowane C# przekazuje wszystkich typów odniesienia według wartości, a wartość odwołania do tablicy jest wskaźnik do tablicy.This is because C# passes all reference types by value, and the value of an array reference is the pointer to the array. W poniższym przykładzie zmienia się na zawartość values tablicy, które zostały wprowadzone w DoubleValues metody jest możliwość obserwowania przez każdy kod, który zawiera odwołanie do tablicy.In the following example, changes to the contents of the values array that are made in the DoubleValues method are observable by any code that has a reference to the array.



using System;

public class Example
{
   static void Main(string[] args)  
   {  
      int[] values = { 2, 4, 6, 8 };
      DoubleValues(values);
      foreach (var value in values)
         Console.Write("{0}  ", value);
   }  
  
   public static void DoubleValues(int[] arr)
   {
      for (int ctr = 0; ctr <= arr.GetUpperBound(0); ctr++)
         arr[ctr] = arr[ctr] * 2;
   }
}
// The example displays the following output:
//       4  8  12  16

Metody rozszerzeniaExtension methods

Zazwyczaj istnieją dwa sposoby, aby dodać metodę do istniejącego typu:Ordinarily, there are two ways to add a method to an existing type:

  • Zmodyfikuj kod źródłowy dla tego typu.Modify the source code for that type. Nie możesz tego zrobić, oczywiście, jeśli nie jesteś właścicielem kodu źródłowego typu.You cannot do this, of course, if you do not own the type's source code. I to staje się istotnej zmiany po dodaniu pola danych prywatnych do obsługuje metody.And this becomes a breaking change if you also add any private data fields to support the method.
  • Zdefiniuj nową metodę w klasie pochodnej.Define the new method in a derived class. Nie można dodać metodę w ten sposób za pomocą dziedziczenia dla innych typów, takie jak struktury i wyliczeń.A method cannot be added in this way using inheritance for other types, such as structures and enumerations. Nie może on służyć do "Dodaj" metodę do klasy zapieczętowanej.Nor can it be used to "add" a method to a sealed class.

Metody rozszerzenia umożliwiają "Dodawanie" metody do istniejącego typu bez modyfikowania samego typu lub wykonania nowej metody dziedziczonej typu.Extension methods let you "add" a method to an existing type without modifying the type itself or implementing the new method in an inherited type. Metoda rozszerzenia również nie musi znajdować się w tym samym zestawie jako typ, który stanowi rozszerzenie.The extension method also does not have to reside in the same assembly as the type it extends. Wywoływanie metody rozszerzenia, tak jakby był on członkiem zdefiniowanego typu.You call an extension method as if it were a defined member of a type.

Aby uzyskać więcej informacji, zobacz metody rozszerzenia.For more information, see Extension Methods.

Metody asynchroniczneAsync Methods

Za pomocą funkcji asynchronicznych, można wywoływać metod asynchronicznych, bez za pomocą jawnego wywołania zwrotne lub ręcznego podziału kodu na wielu metod lub wyrażenia lambda.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.

Po oznaczeniu metody z async modyfikator, można użyć await operatora w metodzie.If you mark a method with the async modifier, you can use the await operator in the method. Gdy kontrola osiąga await wyrażenia w metodzie asynchronicznej, sterowanie powraca do obiektu wywołującego, jeśli oczekiwane zadanie nie zostało ukończone i postęp w danej metody await — słowo kluczowe jest wstrzymana, dopóki nie zakończy się oczekiwane zadanie.When control reaches an await expression in the async method, control returns to the caller if the awaited task is not completed, and progress in the method with the await keyword is suspended until the awaited task completes. Kiedy zadanie zostanie ukończone, wykonanie można wznowić w metodzie.When the task is complete, execution can resume in the method.

Uwaga

Metoda asynchroniczna zwraca do obiektu wywołującego, po napotkaniu pierwszego oczekiwane obiekt, który nie został jeszcze ukończony lub otrzymuje na końcu metody asynchronicznej, zależnie co nastąpi wcześniej.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.

Metoda asynchroniczna może mieć typ zwracany Task<TResult>, Task, lub void.An async method can have a return type of Task<TResult>, Task, or void. void Typ zwracany jest używany głównie do definiowania programów obsługi zdarzeń, gdzie void jest wymagany typ zwracany.The void return type is used primarily to define event handlers, where a void return type is required. Metoda asynchroniczna, która zwraca void nie może być oczekiwany, a obiekt wywołujący metodę zwracającą typ void nie może przechwytywać wyjątków, które metoda wygeneruje.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. Począwszy od języka C# 7.0, metoda asynchroniczna może mieć dowolnego typu zwracanego zadania.Starting with C# 7.0, an async method can have any task-like return type.

W poniższym przykładzie DelayAsync jest to metoda asynchroniczna, która zawiera instrukcję return, która zwraca liczbę całkowitą.In the following example, DelayAsync is an async method that has a return statement that returns an integer. Ponieważ jest to metoda asynchroniczna, jego deklaracja metody musi mieć typ zwracany Task<int>.Because it is an async method, its method declaration must have a return type of Task<int>. Ponieważ typem zwracanym jest Task<int>, oceny await wyrażenia w DoSomethingAsync tworzy liczbą całkowitą, zgodnie z poniższymi int result = await delayTask pokazuje instrukcji.Because the return type is Task<int>, the evaluation of the await expression in DoSomethingAsync produces an integer, as the following int result = await delayTask statement demonstrates.

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

public class Example
{
    // This Click event is marked with the async modifier.
    public static void Main()
    {
       DoSomethingAsync().Wait();
    }

    private static async Task DoSomethingAsync()
    {
        int result = await DelayAsync();
        Console.WriteLine("Result: " + result);
    }

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

    // Output:
    //  Result: 5
}
// The example displays the following output:
//        Result: 5

Metoda async nie może deklarować w, ref, lub się parametry, ale może wywoływać metody, które mają takie parametry.An async method can't declare any in, ref, or out parameters, but it can call methods that have such parameters.

Aby uzyskać więcej informacji na temat metod asynchronicznych, zobacz Asynchronous Programming with Async and Await, Control Flow in Async Programs, i Async Return Types.For more information about async methods, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.

Składowe z wyrażeniem w treściExpression-bodied members

Jest to często mają definicje metody, która po prostu zwrócenia natychmiast z wynikiem wyrażenia lub pojedynczą instrukcję jako treść metody, które mają.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. Ma składnię skrót do definiowania takich metod za pomocą =>: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);

Jeśli metoda zwraca void lub jest to metoda asynchroniczna treści metody musi być wyrażeniem — instrukcja (tak samo jak w przypadku wyrażenia lambda).If the method returns void or is an async method, the body of the method must be a statement expression (same as with lambdas). Właściwości i indeksatorów, muszą być w trybie tylko do odczytu i nie należy używać get akcesor — słowo kluczowe.For properties and indexers, they must be read-only, and you do not use the get accessor keyword.

IteratoryIterators

Iterator wykonuje niestandardowych iteracji w kolekcji, takie jak listy lub tablicy.An iterator performs a custom iteration over a collection, such as a list or an array. Używa iteratora yield return instrukcja zwraca każdy element w danym momencie.An iterator uses the yield return statement to return each element one at a time. Gdy yield return osiągnięciu instrukcji bieżącą lokalizację zapamiętywane jest tak, aby obiekt wywołujący może żądać następnego elementu w sekwencji.When a yield return statement is reached, the current location is remembered so that the caller can request the next element in the sequence.

Zwracany typ iteratora, może być IEnumerable, IEnumerable<T>, IEnumerator, lub IEnumerator<T>.The return type of an iterator can be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

Aby uzyskać więcej informacji, zobacz Iteratory.For more information, see Iterators.

Zobacz takżeSee also