2010-05-28 28 views
14

Khi nào tôi nên chọn lớp tĩnh hoặc lớp bình thường? Hoặc: sự khác biệt giữa chúng là gì?Sự khác biệt giữa lớp tĩnh và lớp bình thường là gì?

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

namespace staticmethodlar 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SinifA.method1(); 
     } 
    } 

    static class SinifA 
    { 
     public static void method1() 
     { 
      Console.WriteLine("Deneme1"); 
     } 
    } 

    public static class SinifB 
    { 
     public static void method2() 
     { 
      Console.WriteLine("Deneme2"); 
     } 
    } 
    public class sinifC 
    { 
     public void method3() 
     { 
      Console.WriteLine("Deneme3"); 
     } 
    } 

    public class sinifD : sinifC 
    { 
     void method4() 
     { 
      Console.WriteLine("Deneme4"); 
     } 

     sinifC sinifc = new sinifC(); // I need to use it :) 
    } 
} 
+0

Câu hỏi liên quan http://stackoverflow.com/questions/1493862/making-methods-all-static-in-class – R0MANARMY

+3

bản sao có thể có của [C# - Lớp "tĩnh" là gì?] (Http: // stackoverflow .com/questions/695056/c-what-is-a-static-class) –

Trả lời

24

Các lớp tĩnh chứa các đối tượng tĩnh không thể được khởi tạo nhiều lần. Thông thường những gì tôi sử dụng các lớp tĩnh là để nhà phương pháp tĩnh cung cấp tính toán, mô hình xử lý chung, định dạng đầu ra chuỗi, vv Các lớp tĩnh là trọng lượng nhẹ và không cần instantiation.

Ví dụ System.IO.File là lớp tĩnh có phương pháp tĩnh Exists(). Bạn không tạo một đối tượng File để gọi nó.Bạn có thể gọi nó như thế này

System.IO.File.Exists(filePath)

Thay vì làm điều này

System.IO.File myFile = new System.IO.File(filePath);

if(myFile.Exists()) { /* do work */ }

Nếu bạn yêu cầu một số đối tượng trong các phần mềm, sau đó bạn sử dụng các lớp học năng động. Ví dụ nếu bạn có một hệ thống kiểm kê bạn có thể có một vài Product đối tượng và trong trường hợp đó bạn sẽ sử dụng một lớp học năng động như thế này

public class Product 
{ 

    public int ProductID { get; private set; } 
    public string ProductName { get; private set; } 
    public int Qty   { get; set; } 

    public Product(int productID, string productName, int total) 
    { 
     this.ProductID = productID; 
     this.ProductName = productName; 
     this.Qty = total; 
    }  
} 
3

Từ MSDN documentation on static classes:

Một lớp học có thể được khai báo tĩnh, chỉ ra rằng nó có chứa các thành viên chỉ tĩnh. Không thể tạo các cá thể của một lớp tĩnh bằng từ khóa mới. Các lớp tĩnh được nạp tự động bởi thời gian chạy ngôn ngữ chung của Khuôn khổ .NET (CLR) khi chương trình hoặc không gian tên chứa lớp được nạp.

+0

người ta tự hỏi những gì tất cả những tài liệu GB được cho. –

+0

Nhận xét "Tìm hiểu để đọc tài liệu" có thực sự cần thiết không? Chắc chắn, tôi sẽ trả lời câu hỏi của bạn nhưng cũng cho bạn thấy những gì một @ss trí tuệ vượt trội tôi có thể được. Thư sau vui vẻ! – DenaliHardtail

+1

@WaggingSiberian: Mang lại cho anh ta/cô ấy lợi ích của sự nghi ngờ, đó là kết quả đầu tiên của Google cho cụm từ tìm kiếm ** lớp tĩnh C# **, có nó là cần thiết. Tôi không cảm thấy muốn thực hiện tìm kiếm trên google trước khi đăng câu hỏi là một yêu cầu không hợp lý. – R0MANARMY

4

Bạn có thể tạo các phiên bản "bình thường" thông qua trình tạo lớp.

var normal = new Normal(); 

Bạn không thể tạo trường hợp các lớp tĩnh. Chúng chỉ có thể có các phương thức tĩnh.

Điều đáng lưu ý là bạn phải khai báo extension methods trong lớp tĩnh.

+0

ok khi tôi sử dụng lớp tĩnh? – Penguen

+1

Điểm tốt về phương pháp khuyến nông. – R0MANARMY

0

Thành viên tĩnh có thể được gọi mà không cần sử dụng phiên bản của lớp. Ví dụ, một lớp Math tĩnh với một cuộc gọi phương thức Area được gọi bởi Math.Area mà không khởi tạo lớp Math trước tiên.

13
  • các lớp tĩnh không được là instantiated hoặc inherited.
  • các lớp tĩnh được đánh dấu là sealedabstract bởi trình biên dịch trong MSIL đầu ra.
  • tất cả các thành viên của lớp tĩnh cũng phải là tĩnh.
  • chỉ các lớp tĩnh mới có thể lưu trữ extension methods.
  • các lớp tĩnh không thể được sử dụng làm đối số kiểu chung.
+0

bạn có thể vui lòng cho tôi biết thêm về "chỉ các lớp tĩnh có thể lưu trữ các phương thức mở rộng". Tại sao các lớp bình thường không có các phương thức exetension? Cảm ơn! – Catbuilts

1

Trong thuật ngữ đơn giản:

Một lớp tĩnh không thể được khởi tạo bằng cách sử dụng từ khóa new. Tất cả các phương thức trong một lớp tĩnh phải tĩnh và có thể được gọi trực tiếp mà không có sự khởi tạo.

Lớp "bình thường" PHẢI được khởi tạo, tuy nhiên bất kỳ phương thức tĩnh nào trong lớp "bình thường" có thể được gọi mà không có sự khởi tạo.

Các phương pháp không tĩnh trong một lớp "bình thường" không thể được gọi mà không cần khởi tạo lớp chứa.

+0

Sau đó, sự khác biệt giữa lớp tĩnh có hàm Method1() và lớp bình thường có hàm tĩnh Method1(). Và kịch bản nào chúng ta sẽ sử dụng phương pháp trên .. –

0

Một lớp tĩnh là một trong đó không thể được khởi tạo. Do đó, nó có thể được sử dụng như một 'template' cho nhiều instance của một số đối tượng phù hợp với định nghĩa lớp như là một class bình thường. Trong một lớp bình thường, các thành viên dữ liệu được định nghĩa được tạo cho mỗi "instance" của class, và mỗi "cá thể" có tập hợp riêng của các thành viên dữ liệu này, vì vậy những trường hợp này đại diện cho các "thực thể" riêng lẻ hoặc cấu trúc dữ liệu trong bộ nhớ phức tạp cho một số đối tượng (mà bạn mã hóa lớp đó để đại diện).) một lớp tĩnh, tất cả các trường dữ liệu của nó cũng phải là tĩnh, nghĩa là chúng không thể được khởi tạo một lần cho mỗi cá thể của lớp, (bạn có thể tạo ra các cá thể của một lớp tĩnh). cần một container để chứa các phương thức không phụ thuộc vào trạng thái của một số đối tượng hoặc cấu trúc dữ liệu được quản lý bởi ứng dụng (như một hàm bổ sung, hoặc một trình định dạng chuỗi, v.v.)

0

Lớp bình thường là lớp bạn có thể khởi tạo và có thể sử dụng với các đối tượng.

Lớp tĩnh là lớp không thể được instansiated và không thể được mở rộng.

Điều đó có nghĩa a static class is sealed and abstract theo mặc định, bạn có thể nhìn vào

MSIL của một trình biên dịch lớp tĩnh đặt kín và trừu tượng trước một lớp tĩnh.

Vì vậy, bởi vì một lớp tĩnh không thể được khởi tạo, bạn có thể không có phương pháp dụ định nghĩa

trên lớp tĩnh, vì vậy tất cả các phương pháp phải tĩnh và công ofcourse như bạn mong muốn

sử dụng chúng.

A static class is singleton by default. 

lớp tĩnh được sử dụng để xác định phương pháp khuyến nông vì bạn không muốn

instansiate họ.

Các lớp tĩnh giống như nhà cung cấp dịch vụ duy nhất toàn cầu.

Tôi hy vọng điều đó có ý nghĩa với bạn và sẽ giúp bạn hiểu các lớp tĩnh.

0

Nó có thể giúp suy nghĩ về "tĩnh" và "thể hiện" về mặt địa chỉ bộ nhớ.

Một đối tượng tĩnh tồn tại trong một và chỉ một vị trí trong bộ nhớ; bạn không thể tạo ra các thể hiện của nó bởi vì theo định nghĩa nó đã được tuyên bố rằng nó sẽ được tìm thấy ở một vị trí cụ thể.Nó là "tĩnh" và không thay đổi. Việc tạo ra các đối tượng là ngầm hơn là rõ ràng.

var result = Math.Pow(3, 3); // static - Math class can't be instanced 

Một đối tượng không tĩnh có thể được instanced một hoặc nhiều lần; bạn đang nói, "Tạo cho tôi một đối tượng thuộc loại này" và đối tượng được đưa ra một địa chỉ bộ nhớ. Bạn có thể tạo nhiều cá thể mà tất cả tồn tại trong các địa chỉ bộ nhớ khác nhau. Việc tạo đối tượng rõ ràng bằng cách sử dụng từ khóa new.

var Ted = new Employee(); // instance - creates a new object at a new address 

Đây là nơi mọi người gặp rắc rối trong lập trình web ASP .NET; các lớp tĩnh được tạo một lần cho mỗi Miền ứng dụng và do đó các hàm tạo của chúng chỉ được gọi một lần.

Các vấn đề liên quan