Từ khóa static trong c# được dùng trong trường hợp nào?

Mọi người cho em hỏi , khóa static trong c# được dùng trong trường hợp nào và static dùng để làm gì ? Lúc trước có học static trong c++ mà không kĩ nên giờ nhờ các anh chỉ giúp :smiley:
Cảm ơn mấy a :smiley:

1 Like

Từ khóa static được dùng để khai báo biến static hoặc static method hoặc static class.

Biến static có vùng nhớ riêng, không bị thay đổi, tham khảo câu trả lời này

static method là hàm nằm trong class, mà khi gọi nó ta không cần phải khai báo một biến kiểu class đó mà có thể gọi ngay. Ví như String.Compare

Class static là class mà chỉ có thể có có static method mà thôi

6 Likes

a nói không bị thay đổi nghĩa là sao ? giá trị của biến static là 1 const?

Anh nói vùng nhớ không bị thay đổi chứ không phải giá trị của nó.

Giá trị của nó thay đổi nhưng vùng nhớ sẽ không bị thay đổi, các topic về static có khá nhiều nên anh không muốn lập lại (lười ^^), em đọc topic anh dẫn ở trên nhé.

2 Likes

nói đơn giản là static method tương đương với function, có thể gọi mà ko cần object nào hết.

biến static cũng vậy, ko thuộc 1 object nào hết. Nó thuộc về class chứa nó. Có thể coi class ở đây là 1 namespace.

4 Likes

Vậy mình dùng static để làm gì bạn ? có thể nói rõ hơn được không

bạn thích viết hàm mà ko phụ thuộc vào object nào hết thì đặt là static.

ví dụ class TinhToan có phương thức
public int Cong(int, int);
Nếu bạn muốn xài phương thức này thì phải có 1 object TinhToan, ví dụ gọi là TinhToan tt = new TinhToan(); rồi gọi tt.Cong(1, 2); mới xài được. Ở đây tạo object hơi thừa vì với bất kì object nào của class TinhToan thì hàm Cong() cũng như nhau cả, vậy cần tạo 1 object giả làm gì. Thêm từ khóa “static” vào
public static int Cong(int, int);
thì ko cần tạo object giả làm gì nữa, gọi TinhToan.Cong(1, 2); là được

còn phương thức tùy vào object mà ra kết quả khác nhau thì ko xài static. Ví dụ class SoNguyen có phương thức Cong(int), gọi mot.Cong(2); ra kết quả khác với hai.Cong(2) thì xài phương thức bình thường ko có static

19 Likes

Bổ sung thêm câu trả lời của @tntxtnt, nhất là khi bạn muốn viết các hàm tiện ích, bạn có thể tạo một static class Utility và khai báo các hàm của nó ở dạng static, khi nào cần dùng thì gọi Utility ra và dùng luôn.

nó giống như là viết hàm có namespace trong C++ vậy. Tại C# hay Java ko có function nên xài static method thế.

ví dụ viết class Math, có phương thức Abs, Sqrt, Cos, Sin, Tan, v.v… thì tất cả là static method hết, vì mấy hàm này đâu phụ thuộc vào object nào.

6 Likes

A noi chỗ này em không hiểu lắm “class SoNguyen có phương thức Cong(int), gọi mot.Cong(2); ra kết quả khác với hai.Cong(2) thì xài phương thức bình thường ko có static”
Đối vs trường hợp đó dùng static cung được mà ?

mot.Cong(2) cho ra kết quả là 3, hai.Cong(2) cho ra 4. Hơn nữa phương thức Cong() này của class SoNguyen có truy cập thuộc tính value của object nên ko thể xài static được. static method ko biết thuộc tính của object nào hết.

3 Likes

Đã hiểu :smiley: cảm ơn a

Theo như em đọc ở đây thì static class còn khác ở một chỗ nữa là không tạo được đối tượng của static class (không new nó được).
https://msdn.microsoft.com/en-us/library/79b3xss3.aspx

Từ khóa static dung trong C# ở các trường hợp sau:
1.Khai báo class
static dung khi khai báo class xác định class đó là tĩnh, không thể tạo được đối tượng từ class loại này.
Khi khai báo static cho class thì yêu cầu tất cả biến, hàm trong class cũng phải là static.
static class thường dung trong việc lưu các thong tin dung chung cho toàn bộ ứng dung.
2. Khai báo biến, hàm, property…
Xác định một hàm, biến là tĩnh. Hàm và biến loại này không sinh ra cùng đối tượng. Có thể truy cập trực tiếp thong qua tên class. Thường sử dung trong việc tạo biến, hàm, property… mang giá trị đồng nhất, hoặc hỗ trợ xử lý giữa các đối tượng cùng loại.

tĩnh : Chỉ có 1 reference duy nhất trong ứng dung, không có cái thứ 2.

3 Likes

ai có thể giải thích vì sao cái trên thì cần dùng static còn cái dưới thì ko
ps: đây là khai báo biến trong 1 class có tên là DataService( cái lớp để kết nối csdl, báo lỗi, update dl…) khi code 1 form thì lấy cái lớp này ra để kết nối.

private static SqlConnection mySqlConnection;
private SqlDataAdapter mySqlDataAdapter;

@xn–tr-ojatntxtnt e vẫn chưa hiểu tt.Cong(1, 2); cũng sẽ cho ra kết quả khác nhau chứ ạ, sao a lại kết luận là giống nhau ạ? ví dụ tt.Cong(1, 2); sẽ khác tt.Cong(1, 3); !!!
ps: a có thể cho e email của a đc ko ạ . email của e là [email protected]

cái ví dụ tt.Cong(1, 2); là ví dụ cho hàm ko phụ thuộc vào object nào thì nên xài static. Có lẽ nên đặt tên lại là hàm Tổng cho dễ hiểu chứ viết “Cộng” dễ gây hiểm lầm: tt.Tong(1, 2);.

nếu hàm Tổng không phải là static method:

TinhToan tt; //tự dưng thừa ra ông `tt` này,
             //làm mất thời gian nghĩ ra cái tên để đặt 
             //làm bẩn namespace vì tên vô nghĩa
int sum = 0;
for (int i = 0; i < N; ++i)
    for (int j = 0; j < N; ++j)
        sum += tt.Tong(i, j);

nếu Tổng là static method:

int sum = 0;
for (int i = 0; i < N; ++i)
    for (int j = 0; j < N; ++j)
        sum += TinhToan.Tong(i, j); //ko cần object tạm thời ở đây

gọn đẹp hơn

còn khi nào viết phương thức mà buộc phải cần tới member thuộc object nào đó thì mới xài phương thức bình thường non-static

7 Likes

cái này nên được mark là answer :slight_smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?