Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 受保护的内部和受保护的行为相似_C# - Fatal编程技术网

C# 受保护的内部和受保护的行为相似

C# 受保护的内部和受保护的行为相似,c#,C#,我在一个程序集中定义了以下类型 public class TestAccessSpecifiers { public int Public { get; set; } protected int Protected { get; set; } private int Private { get; set; } public void SetValues() { Public = 10;

我在一个程序集中定义了以下类型

public class TestAccessSpecifiers
    {
        public int Public { get; set; }
        protected int Protected { get; set; }
        private int Private { get; set; }
        public void SetValues()
        {
            Public = 10;
            Protected = 20;
            Private = 30;
        }
    }
    public class NewDerived : TestAccessSpecifiers
    {
        public void SetProtected()
        {
            Protected = 199;
        }
    }
在另一种类型中,我正在使用此类型,并且无论我为受保护的属性提供受保护或受保护的内部,我都能够从另一个程序访问它。那么,两者之间的区别是什么呢

class Program
    {
        static void Main(string[] args)
        {
            TestAccessSpecifiers obj = new TestAccessSpecifiers();
            obj.SetValues();
            obj.Public = 100;

            Console.WriteLine(Convert.ToString(obj.Public));
            Console.ReadLine();

        }
    }
    class Derived : TestAccessSpecifiers
    {
        public void SetNewValues()
        {
            Public = 200;
            Protected = 500;
        }
    }

受保护的:

同一程序集中的任何代码都可以访问该类型或成员,但不能从其他程序集中访问

public class TestAccessSpecifiers
    {
        public int Public { get; set; }
        protected int Protected { get; set; }
        private int Private { get; set; }
        public void SetValues()
        {
            Public = 10;
            Protected = 20;
            Private = 30;
        }
    }
    public class NewDerived : TestAccessSpecifiers
    {
        public void SetProtected()
        {
            Protected = 199;
        }
    }
受保护的内部

类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自其他程序集的访问必须在从声明受保护内部元素的类派生的类声明中进行,并且必须通过派生类类型的实例进行

MSDN中的源代码

请注意,在CLR级别上,还有一个类似的可访问性级别,无论是否允许从同一程序集和派生类进行访问,都具有更大的灵活性:

  • FamilyAndAssembly-类似于C#中的受保护内部,但在另一个程序集中定义的派生类无法访问此类成员;不幸的是,C#中没有等价物
  • FamilyOrAssembly-对应于C#的受保护内部

受保护

同一程序集中的任何代码都可以访问该类型或成员,但不能从其他程序集中访问

public class TestAccessSpecifiers
    {
        public int Public { get; set; }
        protected int Protected { get; set; }
        private int Private { get; set; }
        public void SetValues()
        {
            Public = 10;
            Protected = 20;
            Private = 30;
        }
    }
    public class NewDerived : TestAccessSpecifiers
    {
        public void SetProtected()
        {
            Protected = 199;
        }
    }
受保护的内部

类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自其他程序集的访问必须在从声明受保护内部元素的类派生的类声明中进行,并且必须通过派生类类型的实例进行

MSDN中的源代码

请注意,在CLR级别上,还有一个类似的可访问性级别,无论是否允许从同一程序集和派生类进行访问,都具有更大的灵活性:

  • FamilyAndAssembly-类似于C#中的受保护内部,但在另一个程序集中定义的派生类无法访问此类成员;不幸的是,C#中没有等价物
  • FamilyOrAssembly-对应于C#的受保护内部
来自:

保护内部

类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自其他程序集的访问必须在从声明受保护内部元素的类派生的类声明中进行,并且必须通过派生类类型的实例进行

protected internal
授予
protected
internal
访问权限,它比单独使用任何一个修饰符的限制性更小。

来自:

保护内部

类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自其他程序集的访问必须在从声明受保护内部元素的类派生的类声明中进行,并且必须通过派生类类型的实例进行


protected internal
授予
protected
internal
访问权限,它比单独使用任何一个修饰符的限制性更小。

这个问题与C有什么关系?从语法上判断,它是C++而不是java,实际上是C语言。意外地选择了错误的标记。我已经编辑过了。这个问题和C有什么关系?从语法上判断,它是C++而不是java,实际上是C语言。意外地选择了错误的标记。我已经编辑过了。