C#中的嵌套类型

目录

一、什么是嵌套类型

二、嵌套类的示例

三、可见性和嵌套类型

1. 嵌套类型的访问修饰符

2. 嵌套类型和封闭类型之间的访问关系


一、什么是嵌套类型

在类或结构中声明类型(不是在命名空间中声明类型),嵌套类型可以是任意类型。

C#中的嵌套类型_第1张图片
如果一个类只是作为帮助方法并且只对封闭类型有意义,可能就需要声明为嵌套类型了。(嵌套指类型声明的位置而不是内存中对象的位置)

C#中的嵌套类型_第2张图片 

二、嵌套类的示例

    class MyClass //封闭类
    {
        class MyCounter //嵌套类:计数器
        {
            public int Count { get; private set; }

            public static MyCounter operator ++(MyCounter current) 
            {
                current.Count++;
                return current;
            }
        }

        MyCounter counter;

        public MyClass() 
        {
            counter = new MyCounter();
        }

        public int Incr() { return (counter++).Count; }//增量方法
        public int GetValue() { return counter.Count; }//获取计数值
    
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.Incr();
            mc.Incr();
            mc.Incr();
            mc.Incr();
            mc.Incr();
            mc.Incr();
            Console.WriteLine("Total:{0}",mc.GetValue());

        }
    }

C#中的嵌套类型_第3张图片

三、可见性和嵌套类型

1.嵌套类型的访问修饰符

类或类型的访问修饰符通常为public和internal,但是嵌套类型的可访问性类似于成员,嵌套类型拥有成员访问级别,而不是类型访问级别。

  1. 类内部的嵌套类型访问修饰符:public、protected、internal、protected internal、private
  2. 结构内部的嵌套类型访问修饰符:public、internal、private
  3. 嵌套类型的默认访问级别是private

2. 嵌套类型和封闭类型之间的访问关系

嵌套类型和封闭类型之间的访问关系是不对称的。

  1. 嵌套类型的成员对封闭类型的成员总是有完全访问权限。
  2. 封闭类型的成员:
    1. 总是可以访问嵌套类型本身
    2. 只能访问声明了有访问权限的嵌套类型成员

C#中的嵌套类型_第4张图片

 class SomeClass //封闭类
    {
        int Field1 = 15;
        int Field2 = 20;
        MyNested mn;

        public SomeClass() 
        {
            mn = new MyNested(this);
        }

        public void PrintMyMembers() 
        { class SomeClass //封闭类
    {
        int Field1 = 15;
        int Field2 = 20;
        MyNested mn;

        public SomeClass() 
        {
            mn = new MyNested(this);
        }

        public void PrintMyMembers() 
        {
            mn.PrintOutMembers();
        }

        public class MyNested
        {
            SomeClass sc;

            public MyNested(SomeClass SC) 
            {
                sc = SC;
            }

            public void PrintOutMembers() 
            {
                Console.WriteLine("Field1 : {0}",sc.Field1);
                Console.WriteLine("Field2 : {0}",sc.Field2);
            }
        }
    }

    internal class class1
    {
        static void Main(string[] args)
        {
            SomeClass sc = new SomeClass();
            sc.PrintMyMembers();
        }
    }
            mn.PrintOutMembers();
        }

        public class MyNested
        {
            SomeClass sc;

            public MyNested(SomeClass SC) 
            {
                sc = SC;
            }

            public void PrintOutMembers() 
            {
                Console.WriteLine("Field1 : {0}",sc.Field1);
                Console.WriteLine("Field2 : {0}",sc.Field2);
            }
        }
    }

    internal class class1
    {
        static void Main(string[] args)
        {
            SomeClass sc = new SomeClass();
            sc.PrintMyMembers();
        }
    }

 

(注:内容学习总结自《C#图解教程》)

你可能感兴趣的:(C#基础笔记,c#,开发语言,.net)