A partial class allows a single class to be divided into two separate physical files. During compile time these files get compiled into a single class. For instance, you can see in the following figure we have the customer class divided into two different files "customer1.cs" and "customer2.cs".
During compilation, these files get compiled into a single class internally. So when you create an object of the customer class you will be able to see methods lying in both the physical files. For instance, you can see the "Add" method belongs to "customer1.cs" and the "Delete" method belongs to "customer2.cs", but when the customer object is created we can see both "Add" and "Delete" methods.
Fundamentals of partial methods
There is one more important concept in partial classes called partial methods. Partial methods help us to define a method definition in one of the physical files and we can implement that method in the other physical files as shown in the following figure.
In the following figure, you can see we have defined the "Validate" method in "Customer1.cs" and this validate method is implemented in "Customer2.cs". Please note the partial keywords attached to both of these methods.
Use number 1: ASP.NET auto-generated code
The biggest use of partial classes is in technologies where there is code generation. The Microsoft team themselves use partial classes in ASP.NET, LINQ, and EF code generation. For instance, when we look at ASP.NET there are two parts, one is the auto-generated code of a page and the other is the code you write.
The custom logic is written in the ".aspx.cs" file while the auto-generated logic is in the ".aspx.designer.cs" file as shown in the following figure:
As a developer, you would like the auto-generated code to do his work i.e. generate code when you drag and drop a button the ASP.NET designer., as in:
The following is how the code snippet of the auto-generated code looks like:
- public partial class WebForm1 {
-
-
-
-
-
-
-
-
- protected global::System.Web.UI.HtmlControls.HtmlForm form1;
-
-
-
-
-
-
-
-
- protected global::System.Web.UI.WebControls.Button Button1;
-
-
-
-
-
-
-
-
- protected global::System.Web.UI.WebControls.Label Label1;
- }
At the same time, you would also like to customize the code in some other file so that the auto-generated part is not disturbed. For the same ASP.NET provides the ".aspx.cs" file which is a partial class wherein you can put your own custom logic.
- public partial class WebForm1: System.Web.UI.Page {
- protected void Page_Load(object sender, EventArgs e) {
-
- }
- }