namespace - c# public とは
public、private、protected、およびアクセス修飾子を持たない点の違いは何ですか? (10)
アクセス修飾子
パブリック
型またはメンバには、同じアセンブリ内の他のコードまたはアセンブリを参照する別のアセンブリからアクセスできます。
プライベート
型またはメンバは、同じクラスまたは構造体のコードでのみアクセスできます。
保護された
型またはメンバにアクセスできるのは、同じクラスまたは構造体のコード、または派生クラスのみです。
プライベートプロテクト (C#7.2で追加)
型またはメンバは、同じクラスまたは構造体のコード、または同じアセンブリの派生クラスにのみアクセスできますが、別のアセンブリからはアクセスできません。
内部
型またはメンバは、同じアセンブリ内の任意のコードでアクセスできますが、別のアセンブリからはアクセスできません。
保護された内部
型またはメンバには、同じアセンブリ内の任意のコード、または別のアセンブリ内の任意の派生クラスからアクセスできます。
アクセス修飾子が設定されていない場合は、デフォルトのアクセス修飾子が使用されます。 だから、たとえそれが設定されていなくても、常に何らかの形のアクセス修飾子があります。
静的
クラスのstatic修飾子は、そのクラスをインスタンス化できないこと、およびそのメンバーのすべてが静的であることを意味します。 静的メンバーは、囲みタイプのインスタンス数に関係なく、1つのバージョンを持ちます。
静的クラスは基本的に静的でないクラスと同じですが、1つの違いがあります。静的クラスを外部的にインスタンス化することはできません。 つまり、newキーワードを使用してクラスタイプの変数を作成することはできません。 インスタンス変数がないため、クラス名自体を使用して静的クラスのメンバーにアクセスします。
しかし、 静的なコンストラクタのようなものがあります 。 どのクラスも静的クラスを含むこれらのいずれかを持つことができます。 直接呼び出すことはできませんし、パラメータを持つこともできません(クラス自体の型パラメータ以外)。 静的コンストラクタは、最初のインスタンスが作成される前、または静的メンバーが参照される前に、クラスを初期化するために自動的に呼び出されます。 次のようになります。
static class Foo()
{
static Foo()
{
Bar = "fubar";
}
public static string Bar { get; set; }
}
静的クラスはしばしばサービスとして使用されますが、静的クラスは以下のように使用できます。
MyStaticClass.ServiceMethod(...);
私の大学時代、私はpublic
されてきました。 public
、 private
、 protected
違いを知りたいですか?
また、 static
は何も持たないのに対して何をするのですか?
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();
}
}
}
Nothingの問題について
- 名前空間の型はデフォルトで内部的です
- ネストされた型を含むすべての型メンバーは、デフォルトではプライベートです
Public - クラスが見える場合は、メソッドを見ることができます
プライベート - あなたがクラスの一員であれば、そうでなければメソッドを見ることができます。
Protected - Privateと同じですが、すべての子孫もメソッドを見ることができます。
静的(クラス) - "クラス"と "オブジェクト"の区別を覚えていますか? すべてを忘れて。 彼らは "静的"と同じです...クラスはそれ自身の1つの唯一のインスタンスです。
静的(メソッド) - このメソッドを使用すると、そのメソッドの一部であるクラスの実際のインスタンスとは独立した参照フレームを持ちます。
うーん...
静的とは、そのクラスのインスタンスを持たずにその関数にアクセスできることを意味します。
クラス定義から直接アクセスできます。
うーん。
参照: アクセス修飾子 。
手短に:
publicは、メソッドまたはタイプに、他のタイプ/クラスからの完全な可視性を与えます。
Privateは、プライベートメソッド/変数へのプライベートメソッド/変数アクセスを含む型だけを許可します(ネストされたクラスは、クラスを含むプライベートメソッド/変数にアクセスできます)。
Protectedは、派生クラスが保護されたメソッドにもアクセスできることを除けば、privateと似ています。
"Nothing"はVB.NETのnullと同じです。 あなたが明示的にアクセス修飾子を指定していない場合、メソッド/変数(つまり、アクセス修飾子)が明示的に指定されていない場合、宣言は通常それができる限り制限されています。 すなわち、
public class MyClass
{
string s = "";
}
効果的に同じです:
public class MyClass
{
private string s = "";
}
リンクされたMSDNの記事は、アクセス修飾子が明示的に指定されていない場合の完全な説明を提供します。
これらのアクセス修飾子は、メンバーが表示される場所を指定します。 あなたはおそらくこれを読むべきです。 IainMHのリンクを出発点にしてください。
静的メンバーはクラスごとに1つで、インスタンスごとに1つはありません。
クラスのアクセシビリティを注意深く監視します。 公開クラスと保護されたクラスとメソッドは、デフォルトですべての人がアクセスできます。
また、Microsoftは、Visual Studioの新しいクラスが作成されたときに、アクセス修飾子(public、protectedなど)を表示することはあまりありません。 だから、あなたのクラスのアクセシビリティについて考えてみてください。なぜなら、それはあなたのインプリメンテーション内部への扉だからです。
ステータスが「プライベート」の場合、変数には同じクラスのオブジェクトのみがアクセスできます。 保護されたステータスは、そのアクセスをクラスの子孫も含むように拡張します。
"上の表から私たちは私的なものと保護されたものとの間の差異を見ることができます...両者は同じだと思っています....だから、
詳細についてはMSDNリンクを確認してください
私はそれが良いOOPデザインに関連していると思います。 ライブラリの開発者は、ライブラリの内部の動作を隠したいと思っています。 そうすれば、後でライブラリ内部の動作を変更できます。 だからあなたのメンバーとヘルパーメソッドをプライベートとして置き、インターフェイスメソッドだけが公開されます。 上書きすべきメソッドは保護されるべきです。