Nested Classes in C#

A class is a user-defined blueprint or prototype from which objects are created. Basically, a class combines the fields and methods (member function which defines actions) into a single unit. In C#, a user is allowed to define a class within another class. Such types of classes are known as nested class. This feature enables the user to logically group classes that are only used in one place, thus this increases the use of encapsulation, and create more readable and maintainable code.

Syntax:

class Outer_class {

       // Code..

       class Inner_class {

          // Code.. 
       }
}

Example:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to illustrate the
// concept of nested class
using System;
  
// Outer class
public class Outer_class {
  
    // Method of outer class
    public void method1()
    {
        Console.WriteLine("Outer class method");
    }
  
    // Inner class
    public class Inner_class {
  
        // Method of inner class
        public void method2()
        {
            Console.WriteLine("Inner class Method");
        }
    }
}
  
// Driver Class
public class GFG {
  
    // Main method
    static public void Main()
    {
  
        // Create the instance of outer class
        Outer_class obj1 = new Outer_class();
        obj1.method1();
  
        // This statement gives an error because
        // you are not allowed to access inner 
        // class methods with outer class objects
        // obj1. method2();
  
        // Creating an instance of inner class
        Outer_class.Inner_class obj2 = 
                    new Outer_class.Inner_class();
  
        // Accessing the method of inner class
        obj2.method2();
    }
}

chevron_right


Output:

Outer class method
Inner class Method

Important points:

  • A nested class can be declared as a private, public, protected, internal, protected internal, or private protected.
  • Outer class is not allowed to access inner class members directly as shown in above example.
  • You are allowed to create objects of inner class in outer class.
  • Inner class can access static member declared in outer class as shown in the below example:

    Example:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C# program to illustrate the
    // concept of nested class accessing
    // static members of the outer class
    using System;
      
    // Outer class
    public class Outer_class {
      
        // Static data member of the outer class
        public static string str = "Geeksforgeeks";
      
        // Inner class
        public class Inner_class {
      
            // Static method of Inner class
            public static void method1()
            {
      
                // Displaying the value of a
                // static member of the outer class
                Console.WriteLine(Outer_class.str);
            }
        }
    }
      
    // Driver Class
    public class GFG {
      
        // Main method
        static public void Main()
        {
      
            // Accessing static method1 
            // of the inner class
            Outer_class.Inner_class.method1();
        }
    }

    chevron_right

    
    

    Output :

    Geeksforgeeks
  • Inner class can access non-static member declared in outer class as shown in the below example:

    Example:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C# program to illustrate the
    // concept of nested class
    // accessing non-static member
    // of the outer class
    using System;
      
    // Outer class
    public class Outer_class {
      
        // Non-static data 
        // member of outer class
        public int number = 1000000;
      
        // Inner class
        public class Inner_class {
      
            // Static method of Inner class
            public static void method1()
            {
                // Creating the object of the outer class
                Outer_class obj = new Outer_class();
      
                // Displaying the value of a 
                // static member of the outer class
                // with the help of obj
                Console.WriteLine(obj.number);
            }
        }
    }
      
    // Driver Class
    public class GFG {
      
        // Main method
        static public void Main()
        {
      
            // Accessing static method1
            // of inner class
            Outer_class.Inner_class.method1();
        }
    }

    chevron_right

    
    

    Output :

    1000000
  • Instance Inner class can access non-static member declared in Outer class as shown in the below example:

    Example:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C# program to illustrate the
    // concept of nested class
    // accessing non-static member
    // of the outer class
    using System;
      
    // Outer class
    public class Outer_class {
      
        // Non-static data 
        // member of outer class
        public int number = 2000000;
      
        // Non-static reference to Inner_class
        // instance.
        public Inner_class Inner { get; set; }
      
        // Constructor to establish link between
        // instance of Outer_class to its 
        // instance of the Inner_class
        public Outer_class() {
            this.Inner = new Inner_class(this);
        }
      
        // Inner class
        private class Inner_class {
      
            // private field to hold
            // reference to an instance
            // of the Outer_class
            private Outer_class obj;
      
            // constructor that establishes
            // a reference to the Outer_class
            // to use within an Inner_cass instance
            public Inner_class(Outer_class outer) 
            {
                obj = outer;
            }
      
            // Method of Inner class
            public void method1()
            {
                // Displaying the value of a 
                // member of the outer class
                // with the help of obj
                Console.WriteLine(obj.number);
            }
        }
    }
      
    // Driver Class
    public class GFG {
      
        // Main method
        public void Main()
        {
            // Create instance of Outer_class
            Outer_class Outer = new Outer_class();
      
            // Accessing static method1
            // of inner class
            Outer.Inner.method1();
        }
    }

    chevron_right

    
    

    Output :

    2000000
  • The scope of a nested class is bounded by the scope of its enclosing class.
  • By default, the nested class is private.
  • In C#, a user is allowed to inherit a class (including nested class) into another class.

    Example:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C# program to illustrate the
    // concept inheritance
    using System;
      
    // Outer class
    public class Outer_class {
      
        // Method of outer class
        public void method1()
        {
            Console.WriteLine("Outer class method");
        }
      
        // Inner class
        public class Inner_class {
        }
    }
      
    // Derived class
    public class Exclass : Outer_class {
      
        // Method of derived class
        public void func()
        {
            Console.WriteLine("Method of derived class");
        }
    }
      
    // Driver Class 
    public class GFG {
      
        // Main method
        static public void Main()
        {
      
            // Creating object of 
            // the derived class
            Exclass obj = new Exclass();
            obj.func();
            obj.method1();
        }
    }

    chevron_right

    
    

    Output :

    Method of derived class
    Outer class method
    
  • In C#, the user is allowed to inherit a nested class from the outer class.


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :

1


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.