2009-05-05 26 views
32

Trong Visual Studio khi bạn thêm một lớp mới, nó luôn được tạo mà không có bộ điều biến và làm cho lớp bên trong.Tại sao Visual Studio không tạo lớp công khai theo mặc định?

class MyClass 
{ 
} 

Tôi muốn lớp của mình theo mặc định được tạo dưới dạng công khai.

Tại sao nội bộ lại mặc định?

Bạn thích điều gì hơn?

+12

Bây giờ nếu chỉ có nó đã được niêm phong theo mặc định cũng như nó sẽ là hoàn hảo. –

+1

Đây không phải là câu hỏi trùng lặp với câu hỏi được đánh dấu. Câu hỏi này đặc biệt hỏi tại sao, không phải cách thay đổi nó. – Syndog

+0

Nếu bạn muốn thay đổi hành vi mặc định, hãy xem câu hỏi/câu trả lời này ... [http://stackoverflow.com/questions/700086/how-do-you-default-a-new-class-to-public- khi tạo-nó-trong-visual-studio] (http://stackoverflow.com/questions/700086/how-do-you-default-a-new-class-to-public-when-creating-it-in -visual-studio) –

Trả lời

25

Làm cho lớp học internal theo mặc định có ý nghĩa hoàn hảo với tôi: giữ bí mật của bạn và chỉ hiển thị rõ ràng các phần thực sự cần được phơi bày: mọi thứ khác chỉ là chi tiết triển khai và không hiển thị với thế giới bên ngoài.

Trong trường hợp bạn muốn kiểm tra internal lớp học của bạn, .NET 2.0 trở đi giới thiệu một thuộc tính mới gọi là InternalsVisibleToAttribute, mà

Chỉ định rằng các loại mà thông thường chỉ hiển thị trong lắp ráp hiện nay có thể nhìn thấy lắp ráp khác.

Nếu điều này thực sự làm phiền bạn, hãy xem %ProgramFiles%\Microsoft Visual Studio 8\Common7 IDE\ItemTemplates\CSharp\1033\Class.zip. Đây là một mẫu mà bạn có thể thay đổi cho phù hợp với nhu cầu của bạn. ReSharper có khả năng tương tự, nhưng nó có thể truy cập trực tiếp từ bên trong giao diện người dùng thứ.

+9

ReSharper theo mặc định sẽ tạo ra lớp công khai. Và điều đó hoàn toàn hợp lý với tôi. – Vadim

+0

Bạn chỉ có thể sử dụng InternalsVisbleToAttribute với các hội đồng được ký kết mạnh mẽ. – Vadim

+4

@Vadim: Bạn sai rồi. –

4

C# có xu hướng mặc định mọi thứ ở phạm vi tối thiểu cần thiết. Đây là một quy ước tốt đẹp và được trích dẫn trong cuốn sách Skeet (C# In Depth, p 224 "Note/Trivia"):

[Thuộc tính là những] chỉ đặt nơi “riêng” là cần thiết -Everywhere khác trong C#, các công cụ sửa đổi truy cập mặc định trong bất kỳ tình huống cụ thể nào là điều kiện riêng tư nhất có thể. Nói cách khác, nếu một cái gì đó có thể được khai báo là riêng, thì bỏ qua các bộ điều chỉnh truy cập hoàn toàn sẽ mặc định nó là riêng tư. Đây là một yếu tố hay của thiết kế ngôn ngữ, bởi vì rất khó để vô tình nhầm lẫn: nếu bạn muốn một thứ gì đó công khai hơn nó, bạn sẽ nhận thấy khi bạn cố gắng sử dụng nó.

+7

Thực ra, các lớp là nội bộ theo mặc định. Thành viên lớp học là riêng tư. –

+0

Hãy thử tạo một lớp học với Reflector. – Vadim

+2

Joe là chính xác. Các lớp * không thể * là riêng tư (trừ khi chúng được lồng trong các loại khác), mặc dù các thành viên của chúng theo mặc định là. – Noldorin

1

Điều thú vị này chỉ xảy ra trong C# - trong vb.net bạn nhận được một lớp công cộng theo mặc định.

Cá nhân, tôi thích lớp công khai theo mặc định vì thường các lớp khác cần quyền truy cập vào lớp học đó. (Hầu hết công việc của tôi là trong lớp dữ liệu mặc dù)

+1

Các lớp khác ngoài hội đồng của bạn có thực sự cần quyền truy cập vào hầu hết các lớp học của bạn không? Tôi nghi ngờ nó, nhưng nếu có, bạn nên xem xét lại cách bạn nhóm các lớp học thành các hội đồng! C# mặc định là nội bộ, trong đó tất cả các lớp trong cùng một assembly đều có quyền truy cập. –

+2

Họ làm trong lớp dữ liệu ... – Pondidum

1

Bạn có thể thay đổi mẫu cho một lớp C# - Thường nằm trong "C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC#"

hoặc thậm chí tạo mẫu của riêng bạn.

+0

sarnath'd - cá nhân tôi muốn được nhắc với một từ khóa thực tế, nhưng 99% thời gian các lớp học của tôi là công khai anyway. Hmm, có lẽ đó là một mùi thiết kế ... – annakata

2

Tôi thích nó theo cách của nó. Bằng cách này, bạn phải có ý thức quyết định rằng bạn muốn nó tiếp xúc với công chúng.Nó giống như đối số, bạn có muốn máy tính của bạn mở ra thế giới bên ngoài theo mặc định hay bạn sẽ thay vì định cấu hình nó để truy cập internet.

Cả hai cách tiếp cận đều có lợi thế, có một hàm ý bảo mật tiềm năng lớn mà tôi tin rằng bạn nên biết và đưa ra quyết định có ý thức hơn là chỉ tự động xảy ra.

+0

Đối số tốt, theo ý kiến ​​của tôi. Việc chọn tham gia hiển thị công khai là ưu tiên hơn khi chọn không tham gia. – Noldorin

1

Cá nhân tôi thích nó như là, Nó buộc bạn phải chủ động nghĩ rằng các lớp học bạn muốn công khai.

Cuối cùng, mặc định bạn sẽ trở thành một thiết kế API tuyệt vời hơn và do đó phần mềm thân thiện hơn. Bạn sẽ không muốn để lộ các hoạt động bên trong của mã của bạn, mà chắc chắn sẽ xảy ra nếu tất cả mọi thứ mặc định cho công chúng.

Đây là phần chủ quan, cá nhân tôi thích mọi thứ để tắt và chỉ bật những gì tôi không cần theo cách khác.

0

Thực hành tốt trong mọi lĩnh vực mã để giữ mọi thứ bị hạn chế nhất có thể. Nếu không có lý do cụ thể để được nếu không, mọi thứ nên được tư nhân, chỉ đọc (tốt hơn nhưng const), và tĩnh. Nếu một biến, phương pháp hoặc thuộc tính có thể là riêng tư, hãy đặt riêng tư. Nếu nó không thể là riêng tư, nhưng có thể được bảo vệ, hãy bảo vệ nó. Nếu nó có thể được chỉ đọc, làm cho nó chỉ đọc. Nếu nó có thể là tĩnh, làm cho nó tĩnh. Điều này cũng đúng đối với các lớp: chúng phải là nội bộ theo mặc định và được công khai chỉ khi bạn đã quyết định rằng đây là lớp bạn muốn xuất.

3

Để tạo một public class theo mặc định cho Visual Studio 2012:

Chỉnh sửa tập tin này: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs

Để trông như thế này:

using System; 
using System.Collections.Generic; 
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq; 
$endif$using System.Text; 
$if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks; 
$endif$ 
namespace $rootnamespace$ 
{ 
    public class $safeitemrootname$ 
    { 
    } 
} 

Thông tin thêm: http://aaron-hoffman.blogspot.com/2013/05/edit-default-visual-studio-2012-item.html

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