Phương thức tĩnh của người dùng là gì trong C #?


177

Điều đó có nghĩa là gì khi bạn thêm từ khóa tĩnh vào một phương thức?

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

Bạn có thể thêm statictừ khóa vào lớp không? Điều đó có nghĩa là gì?


9
Bạn có thể sử dụng phương thức tĩnh mà không cần tạo một thể hiện của lớp đó chỉ bằng class_name.static_method_name ();
Javed Akram

Ở cấp độ lập trình, chúng ta có cảm giác rằng chúng ta có thể gọi một phương thức tĩnh mà không cần tạo một thể hiện của một lớp / loại. Trong nội bộ nó không phải là trường hợp. CLR nội bộ quản lý một thể hiện đặc biệt gọi là thể hiện loại để quản lý cuộc gọi đến các phương thức tĩnh. Xin vui lòng xem câu trả lời này . Thật là hấp dẫn.
RBT

Câu trả lời:


313

Một statichàm, không giống như một hàm ( thể hiện ) thông thường , không được liên kết với một thể hiện của lớp.

Một staticlớp là một lớp chỉ có thể chứa staticcác thành viên, và do đó không thể được khởi tạo.

Ví dụ:

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

Để gọi InstanceMethod, bạn cần một thể hiện của lớp:

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

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

28
Vì vậy, nó giống như một phương thức lớp thay vì một phương thức cá thể?
Moshe

4
@Moshe: Chính xác. Với một phương thức tĩnh, bạn không cần một thể hiện của lớp để gọi phương thức, chỉ cần lớp.
Nhị phân nhị phân

3
Nhưng có thực sự có một số loại giới hạn kỹ thuật ngăn chặn việc gọi một phương thức tĩnh trên một cá thể không? Nếu trình biên dịch sẽ cho phép nó, thì nguy cơ của nó là gì?
kroonwijk

2
@kroon: Nó sẽ không có ý nghĩa gì. Các phương thức sơ thẩm thực sự chỉ lấy một thể hiện làm tham số đầu tiên ẩn. Phương pháp tĩnh không. Xem bài đăng trên blog của tôi: blog.slaks.net/2011/06/open-delegates-vs-closes-delegates.html
SLaks

Trong đó "StaticMethod" là phương thức Class và "InstanceMethod" là một Phương thức Instance của
ClassClass

26

Từ quan điểm khác: Hãy xem xét rằng bạn muốn thực hiện một số thay đổi trên một Chuỗi. ví dụ bạn muốn tạo các chữ cái Uppercase, v.v. bạn tạo một lớp khác có tên "Công cụ" cho những hành động này. không có ý nghĩa tạo ra thể hiện của lớp "Công cụ" vì không có bất kỳ loại thực thể nào có sẵn trong lớp đó (so sánh với lớp "Người" hoặc "Giáo viên"). Vì vậy, chúng tôi sử dụng từ khóa tĩnh để sử dụng lớp "Công cụ" mà không cần thực hiện bất kỳ trường hợp nào và khi bạn nhấn dấu chấm sau tên lớp ("Công cụ"), bạn có thể có quyền truy cập vào các phương thức bạn muốn.

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
Sử dụng "thực hiện thay đổi trên chuỗi" là một ví dụ tồi - chuỗi không thay đổi và không thể thay đổi. Nhưng, nếu không, lời giải thích có ý nghĩa (thay thế một lớp không bất biến cho chuỗi)
Flydog57

13

Một phương thức tĩnh, trường, thuộc tính hoặc sự kiện có thể gọi được trên một lớp ngay cả khi không có phiên bản nào của lớp được tạo. Nếu bất kỳ phiên bản nào của lớp được tạo, chúng không thể được sử dụng để truy cập thành viên tĩnh. Chỉ có một bản sao của các trường và sự kiện tĩnh tồn tại và các phương thức và thuộc tính tĩnh chỉ có thể truy cập các trường tĩnh và các sự kiện tĩnh. Các thành viên tĩnh thường được sử dụng để biểu diễn dữ liệu hoặc tính toán không thay đổi để đáp ứng với trạng thái đối tượng; chẳng hạn, một thư viện toán học có thể chứa các phương thức tĩnh để tính sin và cos. Các thành viên lớp tĩnh được khai báo bằng từ khóa tĩnh trước kiểu trả về của membe


5

Hàm tĩnh có nghĩa là nó được liên kết với lớp (không phải là một thể hiện cụ thể của lớp mà là chính lớp đó) và nó có thể được gọi ngay cả khi không có trường hợp lớp nào tồn tại.

Lớp tĩnh có nghĩa là lớp chỉ chứa các thành viên tĩnh.


5

Một thời gian ngắn, bạn không thể khởi tạo lớp tĩnh: Ex:

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

Bạn không thể làm như thế này:

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

Bạn chỉ có thể thực hiện:

myStaticClass.someFunction();

0

Khi bạn thêm một từ khóa "tĩnh" vào một phương thức, điều đó có nghĩa là việc triển khai cơ bản mang lại kết quả tương tự cho bất kỳ trường hợp nào của lớp. Không cần phải nói, kết quả thay đổi theo giá trị của các tham số


-1

Biến tĩnh không liên kết với đối tượng của lớp. Nó có thể được truy cập bằng cách sử dụng tên lớp. Tất cả các đối tượng của lớp sẽ chia sẻ biến tĩnh.

Bằng cách tạo hàm dưới dạng tĩnh, Nó sẽ hạn chế quyền truy cập của hàm đó trong tệp đó.


-1

Cốt lõi của từ khóa tĩnh mà bạn sẽ chỉ có một bản sao tại RAM của (phương thức / biến / lớp) này được chia sẻ cho tất cả các cuộc gọi


-8

Từ khóa tĩnh, khi được áp dụng cho một lớp, sẽ cho trình biên dịch tạo một thể hiện duy nhất của lớp đó. Sau đó, không thể 'mới' một hoặc nhiều thể hiện của lớp. Tất cả các phương thức trong một lớp tĩnh phải được khai báo là tĩnh.

Có thể, và thường mong muốn, có các phương thức tĩnh của một lớp không tĩnh. Ví dụ, một phương thức xuất xưởng khi tạo một thể hiện của một lớp khác thường được khai báo là tĩnh vì điều này có nghĩa là một thể hiện cụ thể của lớp có chứa phương thức nhân tố là không bắt buộc.

Để được giải thích tốt về cách thức, thời gian và địa điểm, xem MSDN


8
Không, một lớp tĩnh không bao giờ được khởi tạo. Cho rằng mọi thứ trong đó là tĩnh, tại sao bạn muốn khởi tạo nó?
Jon Skeet

1
Một staticlớp không có ví dụ nào cả.
SLaks

4
Xin lỗi các bạn, tôi không hiểu ... Tôi đã nói một trường hợp duy nhất được tạo ra và bạn không thể làm mới. Chắc chắn một cá thể, tĩnh, được tạo nếu không mã sẽ không thể gọi được?
Dave Arkley

2
Một lớp tĩnh có một thể hiện, trong thực tế hai, chúng không phải là các thể hiện của Type. Một lớp tĩnh sẽ tồn tại trên heap dưới dạng đối tượng Loại [Foo] (bảng tra cứu phương thức, v.v. cho JIT) và một đối tượng System.Type đặc biệt được sử dụng để khởi tạo.
mccainz

Một lớp có thể được khai báo tĩnh, chỉ ra rằng nó chỉ chứa các thành viên tĩnh. Không thể tạo các thể hiện của một lớp tĩnh bằng từ khóa mới. Các lớp tĩnh được tải tự động bởi thời gian chạy ngôn ngữ chung .NET Framework (CLR) khi chương trình hoặc không gian tên chứa lớp được tải.
Seditesh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.