C# Language
методы
Поиск…
Объявление метода
Каждый метод имеет уникальную подпись, состоящую из доступа ( public
, private
, ...), необязательного модификатора ( abstract
), имени и при необходимости параметров метода. Обратите внимание, что тип возврата не является частью подписи. Прототип метода выглядит следующим образом:
AccessModifier OptionalModifier ReturnType MethodName(InputParameters)
{
//Method body
}
AccessModifier
может быть public
, protected
, pirvate
или по умолчанию internal
.
OptionalModifier
может быть static
abstract
virtual
override
new
или sealed
.
ReturnType
может быть void
без возврата или может быть любым типом от базовых, как int
до сложных классов.
Метод может иметь некоторые или никакие входные параметры. чтобы задать параметры для метода, вы должны объявить каждый из них, как обычные объявления переменных (например, int a
), и для более чем одного параметра вы должны использовать запятую между ними (например, int a, int b
).
Параметры могут иметь значения по умолчанию. для этого вы должны установить значение для параметра (например, int a = 0
). если параметр имеет значение по умолчанию, установка входного значения является необязательной.
Следующий пример метода возвращает сумму двух целых чисел:
private int Sum(int a, int b)
{
return a + b;
}
Вызов метода
Вызов статического метода:
// Single argument
System.Console.WriteLine("Hello World");
// Multiple arguments
string name = "User";
System.Console.WriteLine("Hello, {0}!", name);
Вызов статического метода и сохранение его возвращаемого значения:
string input = System.Console.ReadLine();
Вызов метода экземпляра:
int x = 42;
// The instance method called here is Int32.ToString()
string xAsString = x.ToString();
Вызов универсального метода
// Assuming a method 'T[] CreateArray<T>(int size)'
DateTime[] dates = CreateArray<DateTime>(8);
Параметры и аргументы
Метод может объявлять любое количество параметров (в этом примере i
, s
и o
являются параметрами):
static void DoSomething(int i, string s, object o) {
Console.WriteLine(String.Format("i={0}, s={1}, o={2}", i, s, o));
}
Параметры могут использоваться для передачи значений в метод, так что метод может работать с ними. Это может быть любая работа, например, печать значений или внесение изменений в объект, на который ссылается параметр, или сохранение значений.
Когда вы вызываете метод, вам нужно передать фактическое значение для каждого параметра. На данный момент значения, которые вы фактически передаете вызову метода, называются Аргументами:
DoSomething(x, "hello", new object());
Типы возврата
Метод может возвращать либо ничего ( void
), либо значение определенного типа:
// If you don't want to return a value, use void as return type.
static void ReturnsNothing() {
Console.WriteLine("Returns nothing");
}
// If you want to return a value, you need to specify its type.
static string ReturnsHelloWorld() {
return "Hello World";
}
Если ваш метод указывает возвращаемое значение, метод должен вернуть значение. Вы делаете это с помощью оператора return
. Как только оператор return
будет достигнут, он вернет указанное значение и любой код после того, как он больше не будет запущен (исключения - это, finally
блоки, которые все равно будут выполняться до возвращения метода).
Если ваш метод ничего не возвращает ( void
), вы все равно можете использовать оператор return
без значения, если хотите немедленно вернуться из метода. В конце такого метода оператор return
был бы лишним.
Примеры действительных операторов return
:
return;
return 0;
return x * 2;
return Console.ReadLine();
Выброс исключения может прекратить выполнение метода без возврата значения. Кроме того, существуют итераторные блоки, где значения возвращаемого значения генерируются с использованием ключевого слова yield, но это специальные случаи, которые не будут объясняться на данном этапе.
Параметры по умолчанию
Вы можете использовать параметры по умолчанию, если хотите предоставить возможность оставить параметры:
static void SaySomething(string what = "ehh") {
Console.WriteLine(what);
}
static void Main() {
// prints "hello"
SaySomething("hello");
// prints "ehh"
SaySomething(); // The compiler compiles this as if we had typed SaySomething("ehh")
}
Когда вы вызываете такой метод и опускаете параметр, для которого предоставляется значение по умолчанию, компилятор вставляет это значение по умолчанию для вас.
Имейте в виду, что параметры со значениями по умолчанию должны быть записаны после параметров без значений по умолчанию.
static void SaySomething(string say, string what = "ehh") {
//Correct
Console.WriteLine(say + what);
}
static void SaySomethingElse(string what = "ehh", string say) {
//Incorrect
Console.WriteLine(say + what);
}
ПРЕДУПРЕЖДЕНИЕ . Поскольку это работает так, значения по умолчанию могут быть проблематичными в некоторых случаях. Если вы измените значение по умолчанию параметра метода и не перекомпилируете всех вызывающих лиц этого метода, эти вызывающие абоненты будут по-прежнему использовать значение по умолчанию, которое присутствовало, когда они были скомпилированы, что может привести к несогласованности.
Перегрузка метода
Определение. Когда несколько методов с тем же именем объявляются с разными параметрами, это называется перегрузкой метода. Перегрузка метода обычно представляет собой функции, которые идентичны по своей назначению, но записываются для приема разных типов данных в качестве их параметров.
Факторы, влияющие
- Количество аргументов
- Тип аргументов
- Тип возврата **
Рассмотрим метод с именем Area
который будет выполнять функции вычисления, которые будут принимать различные аргументы и возвращать результат.
пример
public string Area(int value1)
{
return String.Format("Area of Square is {0}", value1 * value1);
}
Этот метод принимает один аргумент и возвращает строку, если мы вызываем метод с целым числом (скажем, 5
), выход будет "Area of Square is 25"
.
public double Area(double value1, double value2)
{
return value1 * value2;
}
Аналогично, если мы передадим два двойных значения этому методу, результат будет произведением двух значений и будет иметь тип double. Это можно использовать для умножения, а также для поиска области прямоугольников
public double Area(double value1)
{
return 3.14 * Math.Pow(value1,2);
}
Его можно использовать специально для поиска области круга, которая будет принимать двойное значение ( radius
) и вернуть другое двойное значение в качестве своего Района.
Каждый из этих методов можно вызвать нормально без конфликтов - компилятор будет проверять параметры каждого вызова метода, чтобы определить, какая версия Area
должна использоваться.
string squareArea = Area(2);
double rectangleArea = Area(32.0, 17.5);
double circleArea = Area(5.0); // all of these are valid and will compile.
** Обратите внимание , что тип возвращаемого значения в одиночку не может различать между двумя методами. Например, если бы у нас было два определения для Области, которые имели одинаковые параметры, например:
public string Area(double width, double height) { ... }
public double Area(double width, double height) { ... }
// This will NOT compile.
Если нам нужно, чтобы наш класс использовал те же имена методов, которые возвращают разные значения, мы можем устранить проблемы двусмысленности, реализуя интерфейс и явно определяя его использование.
public interface IAreaCalculatorString {
public string Area(double width, double height);
}
public class AreaCalculator : IAreaCalculatorString {
public string IAreaCalculatorString.Area(double width, double height) { ... }
// Note that the method call now explicitly says it will be used when called through
// the IAreaCalculatorString interface, allowing us to resolve the ambiguity.
public double Area(double width, double height) { ... }
Анонимный метод
Анонимные методы предоставляют метод передачи кода в качестве параметра делегата. Это методы с телом, но не имя.
delegate int IntOp(int lhs, int rhs);
class Program
{
static void Main(string[] args)
{
// C# 2.0 definition
IntOp add = delegate(int lhs, int rhs)
{
return lhs + rhs;
};
// C# 3.0 definition
IntOp mul = (lhs, rhs) =>
{
return lhs * rhs;
};
// C# 3.0 definition - shorthand
IntOp sub = (lhs, rhs) => lhs - rhs;
// Calling each method
Console.WriteLine("2 + 3 = " + add(2, 3));
Console.WriteLine("2 * 3 = " + mul(2, 3));
Console.WriteLine("2 - 3 = " + sub(2, 3));
}
}
Права доступа
// static: is callable on a class even when no instance of the class has been created
public static void MyMethod()
// virtual: can be called or overridden in an inherited class
public virtual void MyMethod()
// internal: access is limited within the current assembly
internal void MyMethod()
//private: access is limited only within the same class
private void MyMethod()
//public: access right from every class / assembly
public void MyMethod()
//protected: access is limited to the containing class or types derived from it
protected void MyMethod()
//protected internal: access is limited to the current assembly or types derived from the containing class.
protected internal void MyMethod()