Lớp chương trình có nên tĩnh không?


9

Tôi đang nhận được Cảnh báo sau trong Visual Studio 2019, sau khi tạo dự án ASP.NET Core 3 mới:

Cảnh báo CA1052 Loại 'Chương trình' là loại chủ sở hữu tĩnh nhưng không tĩnh cũng không thể xác định

public class Program
    {
        public static void Main(string[] args)
        {
            // ...
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            // ...
    }

đấu với

public static class Program
    {
        public static void Main(string[] args)
        {
            // ...
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            // ...
    }

Tôi có nên thêm công cụ sửa đổi tĩnh? Tại sao tại sao không? Ưu và nhược điểm'?

Chỉnh sửa: Đây là API ASP.NET Core 3


Bạn đã đọc những gì hướng dẫn tốt đẹp để nói về chủ đề này?
Caius Jard

Tôi đã làm, nhưng Chương trình, như bạn biết, là một trường hợp đặc biệt
Nelson Sousa

1
Chương trình là một trường hợp đặc biệt như thế nào? Nó thậm chí không cần phải được gọi là Chương trình. Bất kỳ lớp nào có khoảng trống tĩnh Chính có thể là điểm vào cho ứng dụng bắt đầu
Caius Jard

Vậy, tại sao Microsoft không biến Chương trình thành một lớp tĩnh? Họ nên?
Nelson Sousa

2
Bất kỳ lớp nào có khoảng trống tĩnh Chính có thể là điểm vào cho ứng dụng bắt đầu
Caius Jard

Câu trả lời:


11

Nói một cách cơ bản hơn, thông điệp có thể được tưởng tượng để nói:

Lớp 'Chương trình' của bạn dường như chỉ chứa các phương thức được khai báo là tĩnh và kết quả là nó không thể tham gia vào hệ thống phân cấp thừa kế. Khai báo nó dưới dạng tĩnh (hoặc được niêm phong nếu bạn đang nhắm mục tiêu một phiên bản .net cổ không hỗ trợ các lớp tĩnh) để phản ánh chính xác hơn tình cảm thiết kế của nó là gì

Đó là một đề xuất, để đánh dấu lớp của bạn là tĩnh vì nó chỉ chứa nội dung tĩnh. Điều này sẽ ngăn bất kỳ ai phạm sai lầm khi cố gắng thừa kế từ nó và nghĩ rằng sau đó họ có thể làm điều gì đó hữu ích với sự kế thừa với phiên bản kế thừa

Microsoft không đánh dấu nó là tĩnh đối với bạn vì không có gì đặc biệt về Chương trình; bạn có thể đặt các phương thức không tĩnh trong đó hoặc bạn có thể đặt các phương thức của bạn static void Mainvào một lớp khác, như Person, đó là khả thi.

class Person{
  public string Name {get;set;}
  static void Main(){
    Person p = new Person();
    p.Name = Console.ReadLine();
  }
}

Điều này sẽ làm việc tốt; một lớp không phải tĩnh để lưu trữ điểm vào ứng dụng và trong trường hợp này, lớp không thể tĩnh vì nó không có thành viên tĩnh. Nó có thể (và là, trong chính) được khởi tạo trong chính. Nó không được gọi là Chương trình; không có lớp nào được gọi là Chương trình ở bất cứ đâu và ứng dụng nhỏ bé này vẫn sẽ chạy (không hoạt động nhiều ..)

Trong trường hợp của bạn, hãy làm như được đề xuất và thêm một công cụ sửa đổi tĩnh cho lớp của bạn, bởi vì nó sẽ làm cho chương trình của bạn được thiết kế mạnh mẽ hơn một chút, hoặc thêm một thành viên thể hiện nếu bạn có thể nghĩ ra một lý do hợp lệ để khởi tạo Chương trình hoặc bỏ qua thông báo và tiếp tục với lớp không tĩnh của bạn chỉ chứa các phương thức tĩnh - nó vẫn hoạt động

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.