Що таке "статичний метод" в C #?


177

Що це означає, коли ви додаєте статичне ключове слово до методу?

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

Чи можете ви додати staticключове слово до класу? Що б це означало тоді?


9
Ви можете використовувати статичний метод, не створюючи примірник цього класу, просто за допомогою class_name.static_method_name ();
Javed Akram

На рівні програмування ми відчуваємо, що ми можемо викликати статичний метод, не створюючи примірник класу / типу. Внутрішньо це не так. CLR внутрішньо управляє спеціальним екземпляром, який називається екземпляром типу для управління викликом статичних методів. Будь ласка, дивіться цю відповідь. Це так інтригуюче.
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

28
Так це як метод класу замість методу екземпляра?
Моше

4
@Moshe: Саме так. За допомогою статичного методу вам не потрібен екземпляр класу для виклику методу, просто клас.
Бінарний занепокоєння

3
Але чи є насправді якесь технічне обмеження, яке заважає викликати статичний метод на екземпляр? Якщо компілятор дозволив би це, яка небезпека бути доступною?
kroonwijk

2
@kroon: Це не мало б сенсу. Методи екземплярів насправді просто приймають екземпляр як прихований перший параметр. Статичні методи не роблять. Дивіться мій пост у блозі: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks

Де "StaticMethod" - метод класу, а "InstanceMethod" - метод інстанції класу SomeClass
Usman Younas

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

Статичний метод, поле, властивість або подія можна викликати в класі навіть тоді, коли не створено жодного примірника класу. Якщо створені будь-які екземпляри класу, їх не можна використовувати для доступу до статичного члена. Існує лише одна копія статичних полів та подій, а статичні методи та властивості можуть отримати доступ лише до статичних полів та статичних подій. Статичні члени часто використовуються для представлення даних або обчислень, які не змінюються у відповідь на стан об'єкта; наприклад, математична бібліотека може містити статичні методи обчислення синуса і косинуса. Члени статичного класу оголошуються за допомогою статичного ключового слова перед типом повернення в membe


5

Статична функція означає, що вона асоціюється з класом (не конкретним екземпляром класу, а самим класом), і його можна викликати навіть тоді, коли не існує жодних екземплярів класу.

Статичний клас означає, що клас містить лише статичні члени.


5

Незабаром статичний клас неможливо встановити: Ex:

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

Ви не можете зробити так:

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

Ви можете зробити лише:

myStaticClass.someFunction();

0

Якщо ви додаєте до методу "статичне" ключове слово, це означає, що основна реалізація дає однаковий результат для будь-якого примірника класу. Потрібно сказати, що результат змінюється зі зміною значення параметрів


-1

Статична змінна не зв'язується з об'єктом класу. Доступ до нього можна використовувати за допомогою імені класу. Усі об’єкти класу матимуть статичну змінну.

Роблячи функцію статичною, вона обмежить доступ до цієї функції у цьому файлі.


-1

Ядро статичного ключового слова, що у вас буде лише одна копія оперативної пам’яті цього методу (метод / змінна / клас), яка спільна для всіх дзвінків


-8

Статичне ключове слово, застосоване до класу, вказує компілятору створити єдиний екземпляр цього класу. Тоді неможливо «новий» один чи кілька екземплярів класу. Усі методи в статичному класі повинні бути оголошені статичними.

Можна, І часто бажано, стати статичні методи нестатичного класу. Наприклад, заводський метод, коли створюється екземпляр іншого класу, часто оголошується статичним, оскільки це означає, що певний екземпляр класу, що містить метод факторів, не потрібен.

Для гарного пояснення того, як, коли та де дивіться MSDN


8
Ні, статичний клас ніколи не примірник. Зважаючи на те, що все в ньому є статичним, чому б ви хотіли його інстанціювати?
Джон Скіт

1
staticКлас не має примірника взагалі.
СЛАкс

4
Вибачте, хлопці, я не розумію ... Я сказав, що створено один екземпляр, і ви не можете створити новий. Безумовно, створюється один, статичний екземпляр, інакше код не може бути викликаний?
Дейв Арклі

2
У статичного класу є екземпляр, насправді два, вони просто не є примірниками типу. Статичний клас буде існувати в купі як об'єкт типу [Foo] (таблиця пошуку методів тощо для JIT) та спеціальний об'єкт System.Type, який використовується для ініціалізації.
mccainz

Клас можна оголосити статичним, вказуючи на те, що він містить лише статичних членів. Неможливо створити екземпляри статичного класу за допомогою нового ключового слова. Статичні класи автоматично завантажуються під час загальної мови виконання (CLR) .NET Framework під час завантаження програми або простору імен, що містять клас.
Satheesh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.