Semua tahun-tahun kuliah saya saya telah menggunakan publik
, dan ingin tahu perbedaan antara publik
, swasta
, dan dilindungi
?
Juga apa statis
lakukan sebagai lawan untuk memiliki apa-apa?
Dari docs.microsoft.com:
jenis atau anggota dapat diakses oleh kode lain di majelis yang sama atau yang lain perakitan bahwa referensi itu.
jenis atau anggota hanya dapat diakses oleh kode di kelas yang sama atau struct.
jenis atau anggota hanya dapat diakses oleh kode di kelas yang sama atau struct, atau di kelas yang diturunkan.
pribadi dilindungi
(ditambahkan dalam C# 7.2)
jenis atau anggota hanya dapat diakses oleh kode di kelas yang sama atau struct, atau di kelas yang diturunkan dari majelis yang sama, tapi tidak dari majelis lain.
jenis atau anggota dapat diakses oleh setiap kode di majelis yang sama, tapi tidak dari majelis lain.
jenis atau anggota dapat diakses oleh setiap kode di majelis yang sama, atau oleh setiap kelas yang diturunkan di majelis lain.
Ketika tidak ada akses modifier adalah set, default access modifier yang digunakan. Sehingga selalu ada beberapa bentuk akses modifier bahkan jika itu's tidak diatur.
statis
modifierStatic modifier pada class berarti bahwa kelas tidak dapat diturunkan, dan yang semua anggotanya bersifat statis. Statis anggota memiliki satu versi terlepas dari berapa banyak contoh yang melampirkan jenis yang dibuat.
Statis kelas pada dasarnya adalah sama sebagai non-statis kelas, tapi ada satu perbedaan: kelas statis eksternal tidak dapat diturunkan. Dengan kata lain, anda tidak dapat menggunakan kata kunci baru untuk membuat variabel dari tipe kelas. Karena tidak ada variabel instance, anda dapat mengakses anggota statis kelas dengan menggunakan nama kelas itu sendiri.
Namun, ada hal seperti itu sebagai konstruktor statis. Setiap class dapat memiliki salah satu dari ini, termasuk statis kelas. Mereka tidak dapat dipanggil secara langsung & tidak memiliki parameter yang (selain jenis parameter pada kelas itu sendiri). Statis konstruktor dipanggil secara otomatis menginisialisasi class sebelum contoh pertama dibuat atau statis anggota yang direferensikan. Terlihat seperti ini:
static class Foo()
{
static Foo()
{
Bar = "fubar";
}
public static string Bar { get; set; }
}
Statis kelas yang sering digunakan sebagai layanan, anda dapat menggunakan mereka seperti:
MyStaticClass.ServiceMethod(...);
Umum - Jika anda dapat melihat kelas, maka anda dapat melihat metode
* Swasta* - Jika anda bagian dari* kelas, maka anda dapat melihat metode, sebaliknya tidak.
Dilindungi - Sama sebagai Pribadi, ditambah semua keturunan dapat juga melihat metode.
Statis (class) - Ingat perbedaan antara "Kelas" dan "Objek" ? Lupakan itu semua. Mereka adalah sama dengan "statis"... kelas adalah satu-dan-satu-satunya contoh dari dirinya sendiri.
Statis (metode) - Setiap kali anda menggunakan metode ini, itu akan memiliki frame of reference independen yang sebenarnya instance dari kelas ini adalah bagian dari.
Gambaran grafis (ringkasan singkatnya)
Untuk default jika anda menempatkan tidak ada akses modifier di depan, lihat di sini:
https://stackoverflow.com/questions/3763612/default-visibility-for-c-sharp-classes-and-members-fields-methods-etc
Non-bersarang
enum public
non-nested classes / structs internal
interfaces internal
delegates in namespace internal
class/struct member(s) private
delegates nested in class/struct private
Bersarang:
nested enum public
nested interface public
nested class private
nested struct private
Reposting mengagumkan diagram dari jawaban.
Berikut ini adalah semua access modifier dalam diagram Venn, dari lebih membatasi untuk lebih promiscuous:
pribadi
:
pribadi dilindungi
: - ditambahkan dalam C# 7.2
internal
:
dilindungi
:
dilindungi internal
:
publik
:
using System;
namespace ClassLibrary1
{
public class SameAssemblyBaseClass
{
public string publicVariable = "public";
protected string protectedVariable = "protected";
protected internal string protected_InternalVariable = "protected internal";
internal string internalVariable = "internal";
private string privateVariable = "private";
public void test()
{
// OK
Console.WriteLine(privateVariable);
// OK
Console.WriteLine(publicVariable);
// OK
Console.WriteLine(protectedVariable);
// OK
Console.WriteLine(internalVariable);
// OK
Console.WriteLine(protected_InternalVariable);
}
}
public class SameAssemblyDerivedClass : SameAssemblyBaseClass
{
public void test()
{
SameAssemblyDerivedClass p = new SameAssemblyDerivedClass();
// NOT OK
// Console.WriteLine(privateVariable);
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
}
}
public class SameAssemblyDifferentClass
{
public SameAssemblyDifferentClass()
{
SameAssemblyBaseClass p = new SameAssemblyBaseClass();
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.internalVariable);
// NOT OK
// Console.WriteLine(privateVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
//Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
}
}
}
using System;
using ClassLibrary1;
namespace ConsoleApplication4
{
class DifferentAssemblyClass
{
public DifferentAssemblyClass()
{
SameAssemblyBaseClass p = new SameAssemblyBaseClass();
// NOT OK
// Console.WriteLine(p.privateVariable);
// NOT OK
// Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.publicVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
// Console.WriteLine(p.protectedVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protected_InternalVariable' is inaccessible due to its protection level
// Console.WriteLine(p.protected_InternalVariable);
}
}
class DifferentAssemblyDerivedClass : SameAssemblyBaseClass
{
static void Main(string[] args)
{
DifferentAssemblyDerivedClass p = new DifferentAssemblyDerivedClass();
// NOT OK
// Console.WriteLine(p.privateVariable);
// NOT OK
//Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
SameAssemblyDerivedClass dd = new SameAssemblyDerivedClass();
dd.test();
}
}
}
Belum lagi pendekatan visual saat ini akses modifier (C# 7.2). Mudah-mudahan skema membantu untuk mengingatnya lebih mudah (klik gambar untuk tampilan interaktif.)
Jika anda berjuang untuk mengingat dua-worded access modifier, ingat luar-dalam.
Hmm.
Lihat di sini: Access Modifier.
Singkatnya:
Publik memberikan metode atau jenis visibilitas lengkap dari jenis/kelas.
Pribadi yang memungkinkan hanya satu jenis yang berisi metode swasta/variabel akses ke metode swasta/variabel (perhatikan bahwa bersarang kelas juga memiliki akses ke kelas yang mengandung metode swasta/variabel).
Dilindungi mirip dengan swasta kecuali kelas turunan dapat juga akses yang dilindungi metode.
"Tidak" adalah VB.NET's setara dengan null. Meskipun jika anda're mengacu pada "tidak" yang berarti "tidak ada akses modifier", maka itu tergantung, meskipun sangat kasar rule of thumb (tentu saja di C#) adalah bahwa jika anda don't secara eksplisit menentukan sebuah access modifier, metode/deklarasi variabel ini biasanya sebagai dibatasi seperti itu bisa. yaitu
public class MyClass
{
string s = "";
}
adalah secara efektif yang sama seperti:
public class MyClass
{
private string s = "";
}
Terkait artikel MSDN akan menawarkan sepenuhnya keterangan ketika ada's tidak ada akses modifier ditentukan secara eksplisit.
umum - dapat di akses oleh siapa saja di mana saja.
* swasta - hanya dapat diakses dari dalam kelas itu adalah bagian dari.
dilindungi** - hanya dapat diakses dari dalam kelas atau objek apapun yang mewarisi dari kelas.
Tidak ada yang suka null tapi di VB.
Statis berarti anda memiliki satu instance dari objek, metode untuk setiap instance dari kelas tersebut.
Status dari Swasta menunjukkan bahwa variabel-variabel yang hanya dapat diakses oleh objek dari kelas yang sama. Status dilindungi meluas bahwa akses untuk memiliki keturunan dari kelas.
"dari tabel di atas dapat kita lihat hormat antara pribadi dan dilindungi... saya pikir keduanya sama ....jadi apa yang perlu bahwa dua perintah terpisah"
Check BACA link untuk informasi lebih lanjut
Hati-hati menonton aksesibilitas kelas anda. Publik dan dilindungi kelas dan metode yang secara default dapat diakses untuk semua orang.
Juga Microsoft isn't sangat explict dalam menunjukkan pengubah akses (public, protected, dll.. kata kunci) ketika kelas baru di Visual Studio yang dibuat. Jadi, jaga baik-baik dan berpikir tentang aksesibilitas kelas anda karena itu's pintu untuk penerapan internal.
Saya pikir hal itu berkaitan dengan baik OOP desain. Jika anda seorang pengembang dari perpustakaan anda ingin menyembunyikan cara kerja di dalam perpustakaan anda. Dengan cara itu, anda dapat memodifikasi perpustakaan inner nanti. Jadi anda menempatkan anggota dan metode pembantu pribadi, dan hanya antarmuka metode yang umum. Metode yang harus ditimpa harus dilindungi.
C# memiliki total 6 access modifier:
* swasta**: anggota dinyatakan dengan aksesibilitas ini dapat terlihat dalam mengandung jenis, hal ini tidak terlihat untuk setiap tipe turunan, jenis lain di majelis yang sama atau jenis luar yang mengandung perakitan. yaitu, akses yang terbatas ke yang mengandung jenis saja.
dilindungi: anggota dinyatakan dengan aksesibilitas ini dapat terlihat dalam jenis yang berasal dari mengandung jenis dalam yang mengandung perakitan, dan jenis-jenis yang berasal dari mengandung jenis luar yang mengandung perakitan. yaitu, dengan akses terbatas yang berasal dari jenis yang mengandung jenis.
internal: anggota dinyatakan dengan aksesibilitas ini dapat terlihat dalam majelis yang berisi anggota ini, hal ini tidak terlihat untuk setiap perakitan di luar mengandung perakitan. yaitu, akses terbatas untuk mengandung perakitan saja.
internal dilindungi: anggota dinyatakan dengan aksesibilitas ini dapat terlihat dalam jenis yang berasal dari mengandung jenis di dalam atau di luar mengandung majelis, hal ini juga terlihat untuk setiap jenis dalam yang mengandung perakitan. yaitu, akses terbatas untuk mengandung perakitan atau berasal jenis.
umum: anggota dinyatakan dengan aksesibilitas ini dapat terlihat dalam majelis yang berisi anggota ini, atau majelis yang referensi mengandung perakitan. yaitu, akses tidak terbatas.
C# 7.2 menambahkan baru tingkat aksesibilitas:
pribadi yang dilindungi: anggota dinyatakan dengan aksesibilitas ini dapat terlihat dalam jenis yang berasal dari ini mengandung jenis dalam yang mengandung perakitan. Hal ini tidak terlihat untuk setiap jenis tidak berasal dari mengandung jenis, atau di luar mengandung perakitan. yaitu, akses terbatas untuk tipe turunan hanya mengandung perakitan.
Sumber termasuk kode sampel dari baru pribadi protected access modifier