当前位置:  开发笔记 > 编程语言 > 正文

在C#中,public,private,protected和没有访问修饰符有什么区别?

如何解决《在C#中,public,private,protected和没有访问修饰符有什么区别?》经验,为你挑选了9个好方法。

我所有的大学四年我一直在使用public,并想知道的区别public,privateprotected

还有什么可以static做而不是什么都没有?



1> mbillard..:

访问修饰符

上市

类型或成员可以由同一程序集中的任何其他代码或引用它的另一个程序集访问.

私人的

类型或成员只能由同一类或结构中的代码访问.

保护

类型或成员只能由同一类或结构中的代码或派生类访问.

私人保护(在C#7.2中添加)

类型或成员只能通过相同类或结构中的代码访问,或者可以通过同一程序集中的派生类访问,但不能通过其他程序集访问.

内部

类型或成员可以由同一程序集中的任何代码访问,但不能从另一个程序集访问.

保护内部

类型或成员可以由同一程序集中的任何代码访问,也可以由另一个程序集中的任何派生类访问.

如果设置访问修饰符,则使用默认访问修饰符.因此,即使没有设置,也总会有某种形式的访问修饰符.

静态的

类上的static修饰符意味着该类无法实例化,并且其所有成员都是静态的.静态成员具有一个版本,无论其封闭类型的实例数量是多少.

静态类与非静态类基本相同,但有一个区别:静态类不能在外部实例化.换句话说,您不能使用new关键字来创建类类型的变量.因为没有实例变量,所以可以使用类名本身访问静态类的成员.

但是,有一个静态构造函数.任何类都可以包含其中一个,包括静态类.它们不能直接调用,也不能有参数(除了类本身的任何类型参数).在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类.看起来像这样:

static class Foo()
{
    static Foo()
    {
        Bar = "fubar";
    }

    public static string Bar { get; set; }
}

静态类通常用作服务,您可以像这样使用它们:

MyStaticClass.ServiceMethod(...);


你可以在非静态类中使用静态方法,对吧?
是的,它们的行为与我的例子相同.
"汇编"这个词在这个背景下意味着什么?

2> JosephStyons..:

公共 - 如果您可以看到该类,那么您可以看到该方法

私人 -如果你的部分类,然后就可以看到该方法,否则不是.

受保护 - 与私有相同,加上所有后代也可以看到该方法.

静态(类) - 还记得"类"和"对象"之间的区别吗?忘记这一切.它们与"静态"相同......类是它自己的唯一实例.

静态(方法) - 每当使用此方法时,它将具有独立于其所属类的实际实例的引用框架.


在谈论C#时,'对象'可能不是一个好词,因为所有类的基类型都是*System.Object*.'实例'将是一个更好的词,或'对象'(小写'O').

3> Stefan Steig..:

图形概述(简要总结)

能见度

对于默认值,如果您没有在前面放置访问修饰符,请参阅此处:
C#类和成员(字段,方法等)的默认可见性?

非嵌套

enum                              public
non-nested classes / structs      internal
interfaces                        internal
delegates in namespace            internal
class/struct member(s)            private
delegates nested in class/struct  private

嵌套:

nested enum      public
nested interface public
nested class     private
nested struct    private



4> Paul..:

从这个答案中重新发布真棒图表.

以下是维恩图中的所有访问修饰符,从更多限制到更多混杂:

private:
在此输入图像描述

private protected: - 在C#7.2中添加
在此输入图像描述

internal:
在此输入图像描述

protected:
在此输入图像描述

protected internal:
在此输入图像描述

public:
在此输入图像描述



5> Narottam Goy..:

在此输入图像描述

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();
        }
    }
}


这只是一个简单的解释.由于其他答案有点令人困惑,一半回答:)
@John Saunders:它通过分离该类在同一个类和该类在不同程序集中的派生类的可见性来区分.此外,他通过展示他的示例代码提供了他如何获得这些信息.所以它实际上增加了其他答案.我的回答可能是由我在回答中的评论引发的.
“不同程序集中的派生类”-这为另一个答案中已经给出的图表增加了价值。区别是有帮助的,特别是在“受保护的内部”情况下

6> leppie..:

关于什么都没有

命名空间类型默认为内部

默认情况下,任何类型成员(包括嵌套类型)都是私有的



7> user1810087..:

当前访问修饰符的另一种可视化方法(C#7.2)。希望该架构可以帮助您更轻松地记住它
(单击图像以进行交互式查看。)

外在内

如果您想记住两个单词的访问修饰符,请记住outside-inside

私有受保护私有 外部(同一程序集)受保护 内部(同一程序集)

受保护的内部受保护的 外部(相同的组件)内部的 内部(相同的组件)



8> CraigTP..:

嗯.

请参见此处: 访问修饰符.

简而言之:

Public提供方法或从其他类型/类中键入完整的可见性.

Private只允许包含私有方法/变量访问私有方法/变量的类型(请注意,嵌套类也可以访问包含类私有方法/变量).

受保护类似于private,但派生类也可以访问受保护的方法.

"没什么"是VB.NET相当于null.虽然如果你指的是"没有"意思是"没有访问修饰符",那么它取决于,虽然一个非常粗略的经验法则(当然在C#中)是如果你没有明确指定访问修饰符,方法/变量声明通常受到限制.即

public class MyClass
{
    string s = "";
}

实际上与以下内容相同:

public class MyClass
{
    private string s = "";
}

当没有明确指定访问修饰符时,链接的MSDN文章将提供完整描述.



9> Tony..:

公共 - 任何人都可以访问.
private - 只能在类中访问它.
protected - 只能在类或从类继承的任何对象中访问.

没有什么比null更像是在VB中.
静态意味着您拥有该对象的一个​​实例,该方法适用于该类的每个实例.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有