Что такое «статический метод» в C #?

177

Что это значит, когда вы добавляете статическое ключевое слово в метод?

public static void doSomething(){
   //Well, do something!
}

Можете ли вы добавить staticключевое слово в класс? Что бы это значило тогда?

Моше
источник
9
Вы можете использовать статический метод без создания экземпляра этого класса просто с помощью class_name.static_method_name ();
Джавед Акрам
На уровне программирования у нас возникает ощущение, что мы можем вызывать статический метод, не создавая экземпляр класса / типа. Внутренне это не так. CLR внутренне управляет специальным экземпляром с именем type instance для управления вызовом статических методов. Пожалуйста, посмотрите этот ответ. Это так интригующе.
RBT

Ответы:

313

staticФункция, в отличие от обычной ( например , функции), не связанный с экземпляром класса.

staticКласс представляет собой класс , который может содержать только staticчлен, и , следовательно , не может быть реализован.

Например:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

Чтобы позвонить InstanceMethod, вам нужен экземпляр класса:

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine
SLaks
источник
28
Так это как метод класса вместо метода экземпляра?
Моше
4
@ Моше: Точно. При использовании статического метода вам не нужен экземпляр класса для вызова метода, только класс.
Двоичный беспорядок
3
Но есть ли какое-то техническое ограничение, которое препятствует вызову статического метода в экземпляре? Если компилятор это допустит, в чем опасность его доступности?
kroonwijk
2
@kroon: Это не имеет никакого смысла. Методы экземпляра на самом деле просто принимают экземпляр в качестве скрытого первого параметра. Статические методы не делают. Смотрите мое сообщение в блоге: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks
Где «StaticMethod» - это метод класса, а «InstanceMethod» - это метод экземпляра класса SomeClass
Усман Юнас,
26

С другой точки зрения: учтите, что вы хотите внести некоторые изменения в одну строку. например, вы хотите сделать буквы заглавными и так далее. Вы делаете другой класс с именем «Инструменты» для этих действий. создание экземпляра класса «Инструменты» не имеет смысла, потому что в этом классе нет доступных сущностей (сравните с классом «Персона» или «Учитель»). Поэтому мы используем статическое ключевое слово для того, чтобы использовать класс «Инструменты», не создавая этого экземпляра, и когда вы нажимаете точку после имени класса («Инструменты»), вы можете получить доступ к нужным методам.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}
Бехноуд Шерафати
источник
1
Использование «внесения изменений в строку» является плохим примером - строки неизменны и не могут быть изменены. Но, в противном случае, объяснение имеет смысл (замена неизменяемого класса на строку)
Flydog57
13

Статический метод, поле, свойство или событие вызывается в классе, даже если экземпляр класса не создан. Если какие-либо экземпляры класса созданы, их нельзя использовать для доступа к статическому члену. Существует только одна копия статических полей и событий, и статические методы и свойства могут обращаться только к статическим полям и статическим событиям. Статические члены часто используются для представления данных или расчетов, которые не меняются в зависимости от состояния объекта; например, математическая библиотека может содержать статические методы для вычисления синуса и косинуса. Статические члены класса объявляются с использованием ключевого слова static перед возвращаемым типом мембраны.

Alborz
источник
5

Статическая функция означает, что она связана с классом (не конкретным экземпляром класса, а самим классом) и может быть вызвана, даже если экземпляры класса не существуют.

Статический класс означает, что класс содержит только статические члены.

MIH
источник
5

Вскоре вы не можете создать экземпляр статического класса: Пример:

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

Вы не можете сделать так:

myStaticClass msc = new myStaticClass();  // it will cause an error

Вы можете сделать только:

myStaticClass.someFunction();
r.mirzojonov
источник
0

Когда вы добавляете «статическое» ключевое слово в метод, это означает, что базовая реализация дает одинаковый результат для любого экземпляра класса. Излишне говорить, что результат зависит от изменения значений параметров.

Баладжи
источник
-1

Статическая переменная не связана с объектом класса. Доступ к нему можно получить с помощью имени класса. Весь объект класса будет иметь общую статическую переменную.

Делая функцию статической, она ограничит доступ этой функции в этом файле.

kapilddit
источник
-1

Ядро статического ключевого слова, которое у вас будет только одна копия в ОЗУ этого (метод / переменная / класс), которая будет общей для всех вызовов

Махмуд
источник
-8

Ключевое слово static при применении к классу указывает компилятору создать один экземпляр этого класса. Тогда невозможно «создать» один или несколько экземпляров класса. Все методы в статическом классе должны быть объявлены как статические.

Возможно и часто желательно иметь статические методы нестатического класса. Например, метод фабрики, когда создается экземпляр другого класса, часто объявляется статическим, поскольку это означает, что конкретный экземпляр класса, содержащий метод фактора, не требуется.

Для хорошего объяснения того, как, когда и где см MSDN

Дейв Аркли
источник
8
Нет, статический класс никогда не создается. Учитывая , что все в нем статична, почему вы хотите , чтобы создать его экземпляр?
Джон Скит
1
У staticкласса вообще нет экземпляра.
SLaks
4
Извините, ребята, я не понимаю ... Я сказал, что создан один экземпляр, и вы не можете создать новый. Конечно, создается один статический экземпляр, иначе код не будет вызываться?
Дэйв Аркли
2
У статического класса есть экземпляр, фактически два, они просто не являются экземплярами типа. Статический класс будет существовать в куче как объект типа [Foo] (таблица поиска метода и т. Д. Для JIT) и специальный объект System.Type, используемый для инициализации.
Маккейнц
Класс может быть объявлен статическим, что указывает на то, что он содержит только статические члены. Невозможно создать экземпляры статического класса, используя ключевое слово new. Статические классы загружаются автоматически общеязыковой средой (CLR) .NET Framework, когда загружается программа или пространство имен, содержащее класс.
Satheesh