大学期间我一直在使用public,想知道public, private和protected之间的区别吗?

还有,相对于什么都没有,静态有什么作用呢?


当前回答

小心!注意类的可访问性。默认情况下,所有人都可以访问公共和受保护的类和方法。

此外,微软在显示访问修饰符(公共的,受保护的,等等。关键字)当Visual Studio中创建新类时。因此,请仔细考虑类的可访问性,因为它是通往实现内部的大门。

其他回答

Private状态表示变量只能被同一类的对象访问。受保护状态将这种访问权限扩展到该类的后代。

“从上表中我们可以看到隐私和受保护之间的区别……我认为两者是一样的....那么这两个单独的命令有什么用呢?

查看MSDN链接了解更多信息

c#总共有6个访问修饰符:

private:使用此可访问性声明的成员可以在包含类型中可见,但对任何派生类型、同一程序集中的其他类型或包含程序集中之外的类型都不可见。也就是说,访问仅限于包含类型。

protected:使用此可访问性声明的成员可以在包含程序集中从包含类型派生的类型中可见,也可以在包含程序集中从包含类型派生的类型中可见。也就是说,只能访问包含类型的派生类型。

internal:使用此可访问性声明的成员可以在包含该成员的程序集内可见,它对包含该成员的程序集之外的任何程序集都不可见。也就是说,访问仅限于包含程序集。

internal protected:使用此可访问性声明的成员可以在包含程序集内部或外部从包含类型派生的类型中可见,它也对包含程序集内的任何类型可见。也就是说,访问仅限于包含程序集或派生类型。

public:使用此可访问性声明的成员可以在包含此成员的程序集或引用包含该成员的程序集的任何其他程序集中可见。也就是说,访问不受限制。

在c# 7.2中,增加了一个新的可访问性级别:

private protected:使用此可访问性声明的成员可以在包含程序集中从此包含类型派生的类型中可见。对于非从包含类型派生的任何类型或包含程序集外部的任何类型都不可见。也就是说,访问权限仅限于包含程序集中的派生类型。

源代码,包括新的私有受保护访问修饰符的示例代码

访问修饰符

从learn.microsoft.com:

public The type or member can be accessed by any other code in the same assembly or another assembly that references it. private The type or member can only be accessed by code in the same class or struct. protected The type or member can only be accessed by code in the same class or struct, or in a derived class. private protected (added in C# 7.2) The type or member can only be accessed by code in the same class or struct, or in a derived class from the same assembly, but not from another assembly. internal The type or member can be accessed by any code in the same assembly, but not from another assembly. protected internal The type or member can be accessed by any code in the same assembly, or by any derived class in another assembly.

如果没有设置访问修饰符,则使用默认访问修饰符。所以总有某种形式的访问修饰符,即使它没有设置。

静态修饰符

类上的静态修饰符意味着该类不能被实例化,并且它的所有成员都是静态的。静态成员只有一个版本,不管创建了多少个其封闭类型的实例。

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

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

static class Foo()
{
    static Foo()
    {
        Bar = "fubar";
    }
    
    public static string Bar { get; set; }
}

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

MyStaticClass.ServiceMethod(...);

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

我创建了另一种类型的可视化。也许这是更好的理解方式

https://github.com/TropinAlexey/C-sharp-Access-Modifiers