C# 5.0 Programmer's Reference
By Rod Stephens
()
About this ebook
Well-known C# expert Rod Stephens gives novice and experienced developers a comprehensive tutorial and reference to standard C#. This new title fully covers the latest C# language standard, C# 5.0, as well as its implementation in the 2013 release of Visual Studio. The author provides exercises and solutions; and his C# Helper website will provide readers and students with ongoing support. This resource is packed with tips, tricks, tutorials, examples, and exercises and is the perfect professional companion for programmers who want to stay ahead of the game.
Author Rod Stephens is a well-known programming authority and has written more than 25 programming books covering C#, Java, VB, and other languages. His books have sold more than 150,000 copies in multiple editions. This book's useful exercises and solutions are designed to support training and higher education adoptions.
- Learn the full range of C# programming language features
- Quickly locate information for specific language features in the reference section
- Familiarize yourself with handling data types, variables, constants, and much more
- Experiment with editing and debugging code and using LINQ
Beginning through intermediate-level programmers will benefit from the accessible style of C# 5.0 Programmer's Reference and will have access to its comprehensive range of more advanced topics. Additional support and complementary material are provided at the C# Helper website, www.csharphelper.com. Stay up-to-date and improve your programming skills with this invaluable resource.
Read more from Rod Stephens
Essential Algorithms: A Practical Approach to Computer Algorithms Using Python and C# Rating: 5 out of 5 stars5/5Beginning Software Engineering Rating: 5 out of 5 stars5/5Essential Algorithms: A Practical Approach to Computer Algorithms Rating: 5 out of 5 stars5/5Beginning Database Design Solutions Rating: 0 out of 5 stars0 ratingsC# 24-Hour Trainer Rating: 3 out of 5 stars3/5Beginning Database Design Solutions: Understanding and Implementing Database Design Concepts for the Cloud and Beyond Rating: 0 out of 5 stars0 ratingsVisual Basic 2012 Programmer's Reference Rating: 4 out of 5 stars4/5Visual Basic .NET and XML: Harness the Power of XML in VB.NET Applications Rating: 0 out of 5 stars0 ratingsMCSD Certification Toolkit (Exam 70-483): Programming in C# Rating: 3 out of 5 stars3/5The Modern C# Challenge: Become an expert C# programmer by solving interesting programming problems Rating: 0 out of 5 stars0 ratingsMachine Learning Security Principles: Keep data, networks, users, and applications safe from prying eyes Rating: 1 out of 5 stars1/5
Related to C# 5.0 Programmer's Reference
Related ebooks
Professional C# 4.0 and .NET 4 Rating: 0 out of 5 stars0 ratingsProfessional C# 2012 and .NET 4.5 Rating: 3 out of 5 stars3/5Professional C# 5.0 and .NET 4.5.1 Rating: 0 out of 5 stars0 ratingsBeginning Visual C# 2012 Programming Rating: 0 out of 5 stars0 ratingsProfessional Visual Studio 2015 Rating: 3 out of 5 stars3/5Mastering C# and .NET Framework Rating: 0 out of 5 stars0 ratingsExpert PHP 5 Tools Rating: 4 out of 5 stars4/5MCSD Certification Toolkit (Exam 70-483): Programming in C# Rating: 3 out of 5 stars3/5Professional Visual Studio 2013 Rating: 0 out of 5 stars0 ratingsIvor Horton's Beginning Visual C++ 2013 Rating: 0 out of 5 stars0 ratingsC# Mastery: A Comprehensive Guide to Programming in C# Rating: 0 out of 5 stars0 ratingsCompTIA Linux+ Study Guide: Exam XK0-005 Rating: 0 out of 5 stars0 ratingsExt.NET Web Application Development Rating: 0 out of 5 stars0 ratingsWeb Coding & Development All-in-One For Dummies Rating: 1 out of 5 stars1/5Beginning C# 7 Programming with Visual Studio 2017 Rating: 0 out of 5 stars0 ratingsAppleScript Rating: 5 out of 5 stars5/5JavaScript Bible Rating: 4 out of 5 stars4/5Learn Professional Programming in .Net Using C#, Visual Basic, and Asp.Net Rating: 0 out of 5 stars0 ratingsLPI Web Development Essentials Study Guide: Exam 030-100 Rating: 0 out of 5 stars0 ratingsCompTIA Network+ Study Guide: Exam N10-006 Rating: 0 out of 5 stars0 ratingsMicrosoft PowerShell, VBScript and JScript Bible Rating: 0 out of 5 stars0 ratingsBeginning Programming with C++ For Dummies Rating: 4 out of 5 stars4/5TypeScript: Modern JavaScript Development Rating: 0 out of 5 stars0 ratingsPattern-Oriented Software Architecture For Dummies Rating: 0 out of 5 stars0 ratingsBuilding Machine Learning Projects with TensorFlow Rating: 0 out of 5 stars0 ratingsLearn LLVM 12: A beginner's guide to learning LLVM compiler tools and core libraries with C++ Rating: 0 out of 5 stars0 ratingsNode.js Design Patterns - Second Edition Rating: 4 out of 5 stars4/5Microsoft SQL Server 2008 Bible Rating: 0 out of 5 stars0 ratingsBeginning C# 6 Programming with Visual Studio 2015 Rating: 0 out of 5 stars0 ratings
Programming For You
SQL QuickStart Guide: The Simplified Beginner's Guide to Managing, Analyzing, and Manipulating Data With SQL Rating: 4 out of 5 stars4/5SQL: For Beginners: Your Guide To Easily Learn SQL Programming in 7 Days Rating: 5 out of 5 stars5/5Coding All-in-One For Dummies Rating: 4 out of 5 stars4/5HTML & CSS: Learn the Fundaments in 7 Days Rating: 4 out of 5 stars4/5Excel : The Ultimate Comprehensive Step-By-Step Guide to the Basics of Excel Programming: 1 Rating: 5 out of 5 stars5/5Python Programming : How to Code Python Fast In Just 24 Hours With 7 Simple Steps Rating: 4 out of 5 stars4/5Learn to Code. Get a Job. The Ultimate Guide to Learning and Getting Hired as a Developer. Rating: 5 out of 5 stars5/5Learn PowerShell in a Month of Lunches, Fourth Edition: Covers Windows, Linux, and macOS Rating: 5 out of 5 stars5/5Grokking Algorithms: An illustrated guide for programmers and other curious people Rating: 4 out of 5 stars4/5C# Programming from Zero to Proficiency (Beginner): C# from Zero to Proficiency, #2 Rating: 0 out of 5 stars0 ratingsCode like a Pro in C# Rating: 0 out of 5 stars0 ratingsProgramming Arduino: Getting Started with Sketches Rating: 4 out of 5 stars4/5Python for Data Science For Dummies Rating: 0 out of 5 stars0 ratingsPYTHON: Practical Python Programming For Beginners & Experts With Hands-on Project Rating: 5 out of 5 stars5/5JavaScript All-in-One For Dummies Rating: 5 out of 5 stars5/5Python Machine Learning By Example Rating: 4 out of 5 stars4/5Linux Command-Line Tips & Tricks Rating: 0 out of 5 stars0 ratingsLinux: Learn in 24 Hours Rating: 5 out of 5 stars5/5Python QuickStart Guide: The Simplified Beginner's Guide to Python Programming Using Hands-On Projects and Real-World Applications Rating: 0 out of 5 stars0 ratings
Reviews for C# 5.0 Programmer's Reference
0 ratings0 reviews
Book preview
C# 5.0 Programmer's Reference - Rod Stephens
Part I
The C# Ecosystem
Chapter 1: The C# Environment
Chapter 2: Writing a First Program
Chapter 3: Program and Code File Structure
Chapter 1
The C# Environment
What’s in This Chapter
IL and the CLR
JIT compiling
Programs and assemblies
The .NET Framework
Wrox.com Downloads for This Chapter
Please note that all the code examples for this chapter are available as a part of this chapter’s code download on the book’s website at www.wrox.com/go/csharp5programmersref on the Download Code tab.
A C# program cannot exist in isolation. You can’t write C# programs without using other tools. You can’t even run a compiled C# program without libraries that provide runtime support.
This chapter describes the tools that you need in the Windows environment to write, compile, and execute C# programs. Most of the time those tools work smoothly behind the scenes, so you don’t need to be aware of their presence. It’s still worth knowing what they are, however, so you know how all the pieces of the C# environment fit together.
Visual Studio
You can write a C# program in a text editor and then use a command-line interface to compile the program. (For example, see Working with the C# 2.0 Command Line Compiler
at http://msdn.microsoft.com/library/ms379563.aspx for more information.)
That approach is a lot of work, however, so most C# programmers use Visual Studio.
Visual Studio is a powerful integrated development environment (IDE) that includes code editors, form and window designers, and flexible debugging tools. Some versions also include testing, profiling, team programming, and other tools.
The Visual Studio code editors provide IntelliSense help, which displays prompts and descriptions of items you need to enter into the code. The code editor’s features such as IntelliSense make writing correct C# programs much easier than it is with a simple text editor.
If you haven’t already installed Visual Studio, you should probably do it now. It takes a while, so be sure you have a fast Internet connection.
To learn about and download one of the Visual Studio Express Editions, go to www.visualstudio.com/products/visual-studio-express-vs.
To learn about the other Visual Studio editions, go to www.microsoft.com/visualstudio/eng/products/compare.
While Visual Studio is downloading and installing, you can read further.
The most important tool integrated into Visual Studio is the compiler, which turns C# code into a compiled executable program—well, sort of.
The C# Compiler
The C# compiler doesn’t actually compile code into a truly executable program. Instead it translates your C# code into an assembly-like language called Intermediate Language (IL).
What’s in a Name?
While under development, the intermediate language was called Microsoft Intermediate Language (MSIL). When .NET was released, the name was changed to IL.
The international standards organization Ecma created the Common Language Infrastructure (CLI) standard that defines a Common Intermediate Language (CIL).
To summarize the alphabet soup, MSIL is the old name for Microsoft’s intermediate language; IL is the current name; and CIL is the name for the non-Microsoft standard. There are some differences between IL and CIL but many .NET developers use MSIL, IL, and CIL interchangeably.
Programs and Assemblies
The C# compiler doesn’t compile only programs; it can also compile other kinds of assemblies. An assembly is the smallest possible piece of compiled code. Assemblies include programs, code libraries, control libraries, and anything else you can compile. An executable program consists of one or more assemblies.
Consider the following C# code.
static void Main(string[] args)
{
foreach (string arg in args) Console.WriteLine(arg);
Console.WriteLine(Press Enter to continue
);
Console.ReadLine();
}
The C# compiler translates this into the following IL code.
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 51 (0x33)
.maxstack 2
.locals init ([0] string arg,
[1] string[] CS$6$0000,
[2] int32 CS$7$0001,
[3] bool CS$4$0002)
IL_0000: nop
IL_0001: nop
IL_0002: ldarg.0
IL_0003: stloc.1
IL_0004: ldc.i4.0
IL_0005: stloc.2
IL_0006: br.s IL_0017
IL_0008: ldloc.1
IL_0009: ldloc.2
IL_000a: ldelem.ref
IL_000b: stloc.0
IL_000c: ldloc.0
IL_000d: call void [mscorlib]System.Console::WriteLine(string)
IL_0012: nop
IL_0013: ldloc.2
IL_0014: ldc.i4.1
IL_0015: add
IL_0016: stloc.2
IL_0017: ldloc.2
IL_0018: ldloc.1
IL_0019: ldlen
IL_001a: conv.i4
IL_001b: clt
IL_001d: stloc.3
IL_001e: ldloc.3
IL_001f: brtrue.s IL_0008
IL_0021: ldstr Press Enter to continue
IL_0026: call void [mscorlib]System.Console::WriteLine(string)
IL_002b: nop
IL_002c: call string [mscorlib]System.Console::ReadLine()
IL_0031: pop
IL_0032: ret
} // end of method Program::Main
Displaying IL
You can use the ildasm program to view a compiled program’s IL code. (Ildasm is pronounced eye-ell-dazm
so it rhymes with chasm.
The name stands for IL disassembler.
) For information about ildasm, see http://msdn.microsoft.com/library/f7dy01k1.aspx.
The IL code is fairly cryptic; although, if you look closely you can see the method’s declaration and calls to Console.WriteLine and Console.ReadLine.
IL code looks a lot like assembly language but it’s not. Assembly language is a (barely) human-readable version of machine code that can run on a specific kind of computer. If the program were translated into assembly or machine code, it could run only on one kind of computer. That would make sharing the program on different computers difficult.
To make sharing programs on multiple computers easier, IL provides another layer between C# code and machine code. It’s like a virtual assembly language that still needs to be compiled into executable machine code. You can copy the IL code onto different computers and then use another compiler to convert it into machine code at run time. In .NET, the Common Language Runtime (CLR) performs that compilation.
The CLR
CLR is a virtual machine component of the .NET Framework that translates IL into native machine code when you run a C# program. When you double-click a C# program’s compiled executable program, the CLR translates the IL code into machine code that can be executed on the computer.
The CLR uses a just-in-time compiler (JIT compiler) to compile pieces of the IL code only when they are needed. When the program is loaded, the loader creates a stub for each method. Initially, that stub points to the method’s IL code.
When the program invokes the method, the JIT compiler translates its IL code into machine code, makes the stub point to it, and then runs the machine code. If the program calls the method again later, its stub already points to the machine code, so the method doesn’t need to be compiled again.
Figure 1-1 shows the process graphically.
Usually, the time needed to compile a method is small, so you don’t notice the tiny bits of extra time used as each method is called for the first time. After a method is compiled, it runs a tiny bit faster when it is called later.
If a method is never called by the program, it is never compiled by the JIT compiler, so the compiler saves some time.
c01f001.epsFigure 1-1: Compilers translate C# code (and code in other languages) into IL code. At run time, the JIT compiler translates methods from IL code into machine code as needed.
Ahead-of-Time Compiling
Normally .NET programs use the JIT compiler, but if you want to, you can use the NGen.exe program to precompile a program into native code. Then when you run the program, it is already compiled, so each method doesn’t need to be compiled just in time.
This might not save you as much time as you would think. Hard drives are slow compared to operations performed in memory, so loading the compiled methods from disk may take much longer than the time saved precompiling the program.
You can speed things up if you give an assembly a strong name and install it in the system’s Global Assembly Cache (GAC, pronounced gack
). In that case, multiple programs that share the assembly may not need to load the compiled assembly from disk. The whole process is rather involved and only useful under specialized conditions, so it’s not described in any greater detail here. For more information about NGen and the JIT compiler, see Compiling MSIL to Native Code
at http://msdn.microsoft.com/library/ht8ecch6.aspx. For more information about using NGen and the GAC to improve performance, see The Performance Benefits of NGen
at http://msdn.microsoft.com/magazine/cc163610.aspx.
In addition to providing JIT compilation, the CLR also provides some low-level services used by programs such as memory management, thread management, and exception handling. (Chapter 12, Classes and Structures,
describes the .NET memory management model. Chapter 6, Methods,
and Chapter 22, Parallel Programming,
discuss using multiple threads. Chapter 9, Error Handling,
describes exception handling in C#.)
The .NET Framework
The .NET Framework includes the CLR and a large library of powerful tools that make C# programming simpler. Those tools include just about everything you normally use in a C# program that isn’t part of the C# language itself. Some of the tools included in the .NET Framework enable you to
Add attributes to classes and their members to give extra information to runtime tools.
Use collections such as lists, dictionaries, and hash tables.
Work with databases.
Find the computer’s physical location using methods such as GPS, Wi-Fi triangulation, and cell tower triangulation.
Interact with system processes, event logs, and performance data.
Create sophisticated two-dimensional drawings.
Interact with Active Directory.
Provide globalization so that programs use appropriate text and images in different locales.
Use LINQ (described in Chapter 8, LINQ
).
Create and use message queues.
Work with the filesystem.
Play audio and video.
Get information about and manage devices.
Interact with networks and the Internet.
Print documents.
Examine the code entities defined by the program or another compiled assembly.
Serialize and deserialize objects.
Control program security.
Support speech recognition.
Run multiple threads of execution simultaneously.
Process XML and JSON files.
Encrypt and decrypt files.
Much more.
By using all of these tools, you can build standalone programs to run on desktop systems, phone or tablet applications, websites, networked applications, and all sorts of other programs.
A compiled C# program needs the CLR to execute, and most programs also need the .NET Framework. That means to run a program, a computer must have the .NET Framework installed.
If Visual Studio is installed on the computer, the .NET Framework is also installed. That means you can usually copy a compiled C# application onto the computer and it will run. (Of course, you should never copy a compiled program from a source you don’t trust! This method works if you want to share a program with your friends, but don’t just grab any old compiled C# program off the Internet.)
Most installers also install the .NET Framework if needed, so if you use an installer, the .NET Framework will be installed if it’s not already on the machine. For example, ClickOnce deployment installs the .NET Framework if necessary.
You can also install the .NET Framework manually by downloading an installer or by using a web installer. To find the latest installers, go to Microsoft’s Download Center at www.microsoft.com/download/default.aspx and search for .NET Framework.
ClickOnce
To use ClickOnce deployment, select Build Publish, and let the Publish Wizard guide you through the process. The wizard enables you to determine
The location where the distribution package should be built
Whether the user will install from a website, a file, or a CD or DVD
Whether the application should check for updates when it runs
For more information on ClickOnce deployment, see http://msdn.microsoft.com/library/142dbbz4.aspx.
Most of the .NET Framework features are backward compatible, so usually you can install the most recent version, and programs built with older versions will still run. If you do need a particular version of the .NET Framework, search the Download Center for the version you need.
Summary
A C# program cannot stand completely alone. To create, compile, and run a C# program, you need several tools. You can create a C# program in a text editor, but it’s much easier to use Visual Studio to write and debug programs. After you write a program, the C# compiler translates the C# code into IL code. At run time, the CLR (which is part of the .NET Framework) uses JIT compilation to translate the IL code into native machine code for execution.
You can use NGen to precompile assemblies and install them in the GAC, so they don’t need to be compiled at run time by the JIT compiler. In many cases, however, that won’t save much time. If the program’s methods are called when the user performs actions such as clicking buttons and invoking menu items, the small additional overhead probably won’t be noticeable.
All that happens behind the scenes when you build and execute a C# program. The next chapter explains how you can start to build C# programs. It explains the most common types of C# projects and explains how you can use several of them to test C# code as you work through the rest of this book.
Exercises
Draw a diagram showing the major steps that Visual Studio performs when you write a C# program and press F5 to run it.
Suppose you have two applications. The first uses 50 methods to perform tasks as the user selects them. The second uses the same 50 methods to perform all the tasks when it starts. How will the performance of the two applications differ? How do NGen and the GAC apply to this situation?
For which of the following scenarios would NGen and the GAC be most useful?
An interactive application that displays forms on the screen
A code library that defines methods for performing tasks that your other programs use
A control library that defines custom buttons, scroll bars, and other controls
A console application that writes output to a console window
Suppose your program uses 100 methods as the user performs various actions. You add a parameter to each method, so you can tell it to return without doing anything. Then when the program starts (while the splash screen displays), the code calls every method telling it to return without doing anything. How would the CLR handle those methods?
Chapter 2
Writing a First Program
What’s in This Chapter
Solutions and projects
Creating console, Windows Forms, WPF, and Windows Store applications
Naming conventions
How the CLR starts programs
Wrox.com Downloads for This Chapter
Please note that all the code examples for this chapter are available as a part of this chapter’s code download on the book’s website at www.wrox.com/go/csharp5programmersref on the Download Code tab.
Unless you plan to edit C# files in a text editor and then use the command-line interface to compile them, you will probably end up using Visual Studio to write and build C# programs. Because of that, this book does cover Visual Studio to some extent.
The book’s goal, however, is to cover the C# language. This chapter explains the most common kinds of applications that you can build in C#. It shows how you can build programs that provide buttons or other methods for executing your C# code.
Visual Studio enables you to build many different kinds of applications. This chapter explains how to start with four of those types: console, Windows Forms, WPF, and Windows Store applications.
Types of Projects
A Visual Studio solution contains the files that you need to create some sort of result. Typically, the result is a single executable application; although, it could be a suite of related applications together with documentation and other related items.
The solution is defined by two files with .sln and .suo extensions. The .sln file stores information that defines the solutions and the projects it contains. The .suo file keeps track of customizations to the Visual Studio IDE.
A solution typically contains one or more projects. A project usually defines a compiled result such as a program, library, or custom control.
Simple applications often consist of a single solution that contains a single project that defines an executable program.
To create a new project in a new solution, select File ⇒ New Project to display the New Project dialog. (To add a new project to an existing solution, select File ⇒ Add ⇒ New Project.)
The New Project dialog displays a hierarchical set of categories on the left and the associated project templates on the right. The appearance of the dialog and the templates that it contains depends on the version of Visual Studio that you run. Figure 2-1 shows the New Project dialog for Visual Studio Express 2012 for Windows Desktop. In Figure 2-1 the selected category is Installed ⇒ Templates ⇒ Visual C#, and only four templates are available for that category.
c02f001.tifFigure 2-1: Visual Studio Express 2012 for Windows Desktop includes only a few C# project templates.
The following list summarizes the project types that are easiest to use with this book.
Windows Forms—A program that uses Windows Forms controls and that runs on the Windows desktop
WPF (Windows Presentation Foundation)—A program that uses WPF controls and that also runs on the Windows desktop
Console—A program that reads text input and displays text output in a console window
Windows Store—A Windows Store app
TIP For a more complete list of available project templates, see Creating Projects from Templates
at
msdn.microsoft.com/library/0fyc0azh.aspx.
Both WPF and Windows Store applications use extensible markup language (XAML) code to define the WPF controls that make up their user interfaces. WPF controls are more flexible and graphically powerful than Windows Forms controls. For example, WPF controls can display gradient backgrounds, scale or rotate images, play video, and use animation to change their appearance over time, all things that are hard for Windows Forms controls.
However, WPF controls use more resources than Windows Forms controls, so the designers that let you edit WPF and Windows Store applications are slower. Taking full advantage of WPF capabilities also requires a lot of effort, so Windows Forms applications are usually easier to build.
Console applications have only a text interface, so they are even simpler, as long as you don’t need graphical features such as a drawing surface or the mouse.
As you can see in Figure 2-1, Visual Studio Express 2012 for Windows Desktop enables you to make Windows Forms, WPF, and console applications.
Visual Studio Express 2012 for Windows 8 enables you to make Windows Store applications but not Windows Forms, WPF desktop, or console applications. (Both of these editions include a few other project types such as class libraries and control libraries.)
If you have a more full-featured version of Visual Studio than the Express edition, you can see other project templates. Figure 2-2 shows the New Project dialog for Visual Studio 2012 Ultimate. If you look closely you can see that the dialog includes all the templates provided by both of the Express editions plus many more.
c02f002.tifFigure 2-2: Visual Studio Ultimate 2012 includes many more project templates than the Express edition does.
This book focuses on the C# language and not on user interface design, so it doesn’t say too much more about creating fully functional applications. However, it is worth knowing a bit more about how the different kinds of projects work. The following sections provide a bit more information on the four main application project types: console, Windows Forms, WPF, and Windows Store.
Console Applications
When you make a console application, Visual Studio creates a file called Program.cs that defines a class named Program. The following code shows the initial Program class created by Visual Studio Express 2012 for Windows Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyConsoleApplication
{
class Program
{
static void Main(string[] args)
{
}
}
}
NOTE When you create a new project in Visual Studio Express 2012 for Windows Desktop, the New Project dialog makes you enter a project name. When you first save the project by using the File menu’s Save All command, Visual Studio prompts you for the directory in which to save the project.
When you create a new project in other versions of Visual Studio 2012, the New Project dialog makes you enter the project’s name and the directory where it should be stored. When you click OK to create the new project, the project is created in that location.
By default, when you run the program, Visual Studio searches for a static method named Main and executes it. Initially, there’s only one such method, so there’s no problem.
NOTE If you have previous programming experience, you probably know all about classes, objects, instances, and methods. If you don’t, you can learn all about them in Part III, Object-Oriented Programming,
of this book.
However, if you create another class and give it a static method named Main, Visual Studio cannot figure out which one to launch. You can resolve that problem in a couple ways. First, you can rename all but one of the Main methods, so Visual Studio can figure out which one to execute.
Another approach is to select Project ⇒ Properties to open the application properties window, as shown in Figure 2-3. Open the Startup Object drop-down, and select the class that contains the Main method that Visual Studio should execute.
c02f003.tifFigure 2-3: The application properties window enables you to specify the application’s startup class.
Inside the Main method, you can add whatever code you need the program to execute. For example, the following code displays a message and then waits for the user to press the Enter key.
static void Main(string[] args)
{
Console.WriteLine(Press Enter to continue
);
Console.ReadLine();
}
Figure 2-4 shows the running program. When you press the Enter key, the Console.ReadLine statement finishes and the Main method exits. When that method exits, the program ends and the console window disappears.
c02f004.tifFigure 2-4: A console application runs in a text-only console window.
WARNING A console application ends as soon as the Main method exits. If the code doesn’t include a Console.ReadLine statement or some other statement that pauses execution, the program may disappear before the user has a chance to read any output it produces.
Because console applications have no user interfaces, many C# books write all their examples as console applications. However, Windows Forms applications look nicer and have greater flexibility. For example, a Windows Forms application can display images, draw graphics, and display results in controls such as combo boxes or lists.
Windows Forms Applications
Figure 2-5 shows Visual Studio Express 2012 for Windows Desktop after it has created a new Windows Forms application.
c02f005.epsFigure 2-5: After creating a new Windows Forms application, Visual Studio displays the default form Form1.
The following list describes the numbered areas on Visual Studio, as shown in Figure 2-5.
Solution Explorer—This area lists the files associated with the project. Double-click a file to open it in the designer area.
Designer—This area contains designers that enable you to edit different kinds of files. For example, the Code Editor enables you to edit C# code, and the Form Designer enables you edit forms. Figure 2-5 shows the Form Designer editing the user interface for the form defined by the file Form1.cs.
Toolbox—While you are editing a form, you can click a control in the Toolbox to select it. Then you can click and drag to place an instance of that control on the form.
Properties—If you select a control in the Window Designer, this area displays that control’s properties and enables you to edit them. In Figure 2-5 the form is selected, so this area is showing the form’s properties. For example, you can see in the Properties Window that the form’s Text property is set to Form1. In the Form Designer, you can see that the form displays its text at the top.
Other windows—This area typically holds other windows such as the Error List and Output Window. The program shown in Figure 2-5 does not currently have any errors, so the Error List is empty.
NOTE Visual Studio is extremely configurable. You can hide or show windows, drag windows into new positions, dock windows next to other windows, and make multiple windows share the same area as tabs. If you rearrange things, your Visual Studio installation may not look much like the figures in this book.
The goal in this book is to let you build enough of a program to execute C# code behind the scenes. In a Windows Forms application, objects such as controls can execute code when events occur. For example, when the user clicks a button, the program can execute a Click event handler.
To create a button, click the Button tool in the Toolbox. Then click and drag in the Window Designer to place a button on the window. If you like, you can use the Properties window to set the button’s properties. For example, you can set its caption by setting the Text property to something like Click Me.
Scroll to the top of the Properties Window to set the control’s Name property. For example, if the button says Click Me, you might make its name clickMeButton.
To create a Click event handler for the button, double-click it in the Form Designer. When you do, Visual Studio creates the following empty Click event handler and opens it in the Code Editor.
private void clickMeButton_Click(object sender, EventArgs e)
{
}
C# Naming Conventions
The naming convention used by many C# developers uses Pascal Case for class names and CamelCase for instance names.
In Pascal Case, words are run together with the first letter of each word capitalized. For example, a class that holds detail information for customer orders might be called CustomerOrderDetail.
CamelCase is similar to Pascal Case except the first letter is not capitalized. For example, an instance of the CustomerOrderDetail class representing a new item in an order might be called newCustomerOrderDetail.
Therefore, for the current example a button labeled Click Me has the name clickMeButton.
Now you can add whatever code you want the event handler to execute inside the braces. For example, the following code changes the button’s caption to Clicked.
private void clickMeButton_Click(object sender, EventArgs e)
{
clickMeButton.Text = Clicked
;
}
Recall from the previous section that a console application starts by executing the Program class’s Main method. If you look closely at Figure 2-5, you can see that a Windows Forms program also includes a file named Program.cs. If you double-click that file, the Code Editor opens and displays the following code.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MyWindowsFormsApplication
{
static class Program
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
If you skip down a bit to the first indented line of code, you can see that this file defines a Program class that is somewhat similar to the one created for console applications. Like the version used by the console application, this Program class defines a static Main method. As before, when you run the program, Visual Studio executes this method.
In a Windows Forms application, the Main method initializes some visual style text rendering attributes. It then executes the Application.Run method passing it a new instance of the Form1 class. This is how the program displays its main form. The Application.Run method displays the form it is passed as a parameter and enters an event loop where it processes messages until the form closes.
When the form closes, the call to Application.Run finishes. That is the last statement in the Main method, so Main exits. As is the case with a console application, when the Main method exits, the application ends.
TIP Some C# developers build Windows Forms applications by creating a console application and then adding code similar to the previous code to display a form. That seems like a lot of unnecessary work. If you want to make a Windows Forms application, you may as well create one and let Visual Studio do some of the work for you.
WPF Applications
Creating a WPF application is similar to creating a Windows Forms application. Select File ⇒ New Project, select the WPF Application template, and enter a project name. If you do not use Visual Studio Express 2012 for Windows Desktop, enter a project location. Then click OK to create the project.
Figure 2-6 shows a newly created WPF application. If you compare Figures 2-6 and 2-5, you can see many of the same windows. The center of Visual Studio contains a Window Designer similar to the Form Designer in Figure 2-5. The Solution Explorer and Properties Window are on the right. (Although, there are many differences between the two versions of the Properties Window.) The Error List appears at the bottom of both figures.
One notable difference between the two displays is the XAML code window at the bottom of the Window Designer. The window’s controls and appearance are determined by the XAML code in this area. When you add controls to the window, the XAML code updates to reflect the new controls.
Conversely, if you modify the XAML code, the Window Designer updates to display your changes.
A second major difference between Figures 2-5 and 2-6 is the Document Outline to the left of the Window Designer in Figure 2-6. This window shows a hierarchical view of the structure of the window. In Figure 2-6, the main Window object contains a single Grid object. You would add new controls to the Grid.
If you look at the bottom of the Document Outline, you can see three tabs labeled Database... (Explorer
is cut off), Toolbox, and Document... (Outline
is cut off). You can click the Toolbox tab to get a toolbox similar to the one shown in Figure 2-5. Then you can add a button to the program much as you added one to the Windows Forms application. Click the button tool to select it. Then click and drag to create a button on the window.
Figure 2-6: After creating a new WPF application, Visual Studio displays the default window MainWindow.
Use the Properties Window to set the button’s properties. Note that in WPF applications the button’s Content property determines its caption or other contents, not the Text property used by a Windows Forms button.
To associate an event handler with the button, double-click it as you would for a Windows Forms application. The following code shows the initial empty Click event handler.
private void clickMeButton_Click(object sender, RoutedEventArgs e)
{
}
This is similar to the previous Windows Forms Click event handler. The only difference is the second parameter has the type RoutedEventArgs instead of EventArgs.
Add whatever code you want to execute when the button is pressed. For example, the following code changes the button’s caption to Clicked.
private void clickMeButton_Click(object sender, RoutedEventArgs e)
{
clickMeButton.Content = Clicked
;
}
If you look at the Solution Explorer in Figure 2-6, you won’t find the Program.cs class file created for a Windows Form application. Instead you find an App.xaml file.
If you double-click App.xaml, Visual Studio opens the file in the XAML editor. The following code shows an initial App.xaml file.
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
StartupUri=MainWindow.xaml
>
The Application element’s StartupUri attribute indicates that the program should initially display the window defined in the MainWindow.xaml file.
The App.xaml file is marked read-only, so you shouldn’t change the startup window by editing it. Instead select Project ⇒ Properties as you would for a Windows Forms application. This opens an application properties window similar to the one shown in Figure 2-3. Use the Startup Object drop-down to select the window that you want to display at startup.
Windows Store Applications
Windows Store applications are programs designed to run in Windows 8. They support the look and feel of Windows 8 applications. For example, they can display tiles on the start screen and can update those tiles at runtime to tell the user what they are doing. (For more information about the Windows Store, go to www.windowsstore.com.)
To create a Windows Store application, select File ⇒ New Project, select one of the Windows Store templates, enter a project name, and enter a project location. Then click OK to create the project.
Figure 2-7 shows a newly created Windows Store application in Visual Studio Express 2012 for Windows 8. Initially, the file App.xaml.cs displays in the code editor.
To add a button to the application, double-click MainPage.xaml in Solution Explorer to open the MainPage class in the designer. The MainPage class is similar to the MainWindow used by the WPF applications described in the previous section, and you can use the designer to edit them similarly. Use the Toolbox to place a button on the page. Use the Properties Window to set the button’s properties. Double-click the button to create an event handler for the button, and add whatever code you like to it.
c02f007.tifFigure 2-7: After creating a new Windows Store application, Visual Studio displays App.xaml.cs.
The way a Windows Store application starts is a bit more complicated than the way the previous kinds of applications start. The App.xaml.cs file defines a class named App. That class includes some startup code including the following OnLaunched method, which executes when the application starts normally.
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
// Create a Frame to act as the navigation context and navigate
// to the first page
rootFrame = new Frame();
if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
}
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a
// navigation parameter
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception(Failed to create initial page
);
}
}
// Ensure the current window is active
Window.Current.Activate();
}
If the application’s Frame is null, the code creates a new Frame.
Then if the Frame’s content was null, the bold line of code uses the Frame’s Navigate method to navigate to a new instance of the MainPage class. (If the Frame’s content is not null, it is a previously created instance of the MainPage class and it is reused.)
Finally, the code activates the current window, and at that point the MainPage appears.
Summary
Unless you plan to edit C# files in a text editor and then use the command-line interface to compile them, you will end up using Visual Studio to write and build C# programs. Because of that, the book does cover Visual Studio to some extent.
The book’s goal, however, is to cover the C# language. This chapter explains the most common kinds of applications that you can build in C#. It shows how you can build programs that provide buttons or other methods for executing your C# code.
Visual Studio enables you to build many different kinds of applications. This chapter explains how to start with four of those types: console, Windows Forms, WPF, and Windows Store applications. The remainder of this book assumes you can create one of those kinds of applications so that you can run C# code.
Although this book doesn’t explain user interface programming or Windows Forms, WPF, and Windows Store applications in more detail, you should look into them when you have a chance. C# code alone enables you to produce some amazing results, but you need a great user interface to actually show them off.
When you create a new program, Visual Studio creates all sorts of files to represent forms, windows, code, resources, and other data associated with the project. Chapter 3, Program and Code File Structure,
describes the most common kinds of files associated with C# projects.
Exercises
Create a new console application named ConsoleShowArgs and enter the following code into its main method.
foreach (string arg in args) Console.WriteLine(arg);
Console.WriteLine(Press Enter to continue
);
Console.ReadLine();
This code displays any command-line arguments passed to the program when it executes.
Save the program in a directory and run it. What happens?
Next, select Project ⇒ Properties, open the Debug tab, and in the Command Line Arguments text box, enter Red Green Blue. Run the program again. What happens this time?
Use File Explorer to find the compiled executable program that was created for the program you built in Exercise 1. (It is probably in the project’s bin\Debug directory and is named after the project with a .exe extension.) Double-click the program to run it. What happens?
Right-click File Explorer or the desktop, and select New ⇒ Shortcut. Browse to set the shortcut’s target to the location of the executable program you built. Add the text Apple Banana Cherry after the target’s path. For example, on my system I used the following target (all on one line and the double quotes are included):
"D:\Rod\Writing\Books\C# Prog Ref\Src\847282ch02src\
ConsoleShowArgs\bin\Debug\ConsoleShowArgs.exe" Apple Banana Cherry
Double-click the shortcut to run the program. What happens?
Open a command window, navigate to the executable program’s directory, type the program’s name, and press Enter to run the program. What happens?
Now run the program with command-line arguments by typing in the following text at the command prompt.
ConsoleShowArgs Ant Bear Cat
What happens this time?
Repeat Exercise 1 with a Windows Forms application named WindowsFormsShowArgs. Place a ListBox named argsListBox on the form and set its Dock property to Fill. Double-click the form (not the ListBox) and add the bold code in the following snippet to the form’s Load event handler.
private void Form1_Load(object sender, EventArgs e)
{
foreach (string arg in Environment.GetCommandLineArgs()) argsListBox.Items.Add(arg);
}
What do you think will happen when you run the program? Run the program to find out. Then define the command-line arguments as described in Exercise 1 and run the program again. What actually happens?
Repeat Exercise 2 for the program you built in Exercise 5. What do you think will happen when you run the program? What actually happens?
Repeat Exercise 3 for the program you built in Exercise 5. What do you think will happen when you run the program? What actually happens?
You’ve probably got the hang of this by now, but if you want to try WPF (or if you skipped the previous exercises because you care about only WPF), repeat Exercise 1 with a WPF application named WPFShowArgs. Place a ListBox named argsListBox on the form and set its Height and Width properties to Auto. Click the form (not the ListBox) to select it. In the Properties window, click the Event button (the lightning bolt) and double-click in the box to the right of the Loaded event. Add the bold code in the following snippet to the form’s Load event handler.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
foreach (string arg in Environment.GetCommandLineArgs()) argsListBox.Items.Add(arg);
}
What do you think will happen when you run the program? Run the program to find out. Then define the command-line arguments as described in Exercise 1 and run the program again. What actually happens?
Repeat Exercise 2 for the program you built in Exercise 8. What do you think will happen when you run the program? What actually happens?
Repeat Exercise 3 for the program you built in Exercise 8. What do you think will happen when you run the program? What actually happens?
Chapter 3
Program and Code File Structure
What’s in This Chapter
Project files, including hidden files
Changing project properties, references, resources, and assembly information
Preprocessor directives
The using directive and namespace statements
End-of-line, multiline, and XML comments
Wrox.com Downloads for This Chapter
Please note that all the code examples for this chapter are available as a part of this chapter’s code download on the book’s website at www.wrox.com/go/csharp5programmersref on the Download Code tab.
A C# solution contains one or more related projects. A project includes all the files related to whatever output it produces. That output might be an executable program, a custom control, or a code library that other programs can use. The files relating to the output might include files full of C# code, documentation, data files, and any other files you want to include in the project.
This chapter describes the structure of a typical C# project and explains the purposes of some of the most common types of files you can find in a C# project. This chapter also describes the basic structure of C# source code files. It explains how you can use regions and namespaces to group related pieces of code. It also describes some typographic features such as comments, XML comments, and line labels that you can use to make C# code easier to understand.
Hidden Files
Figure 3-1 shows the Solution Explorer window for a solution named TurtleSolution that contains two projects named TurtleLib and TurtleTest.
c03f001.tifFigure 3-1: A solution contains one or more projects that contain files related to the project.
Each project contains a Properties folder that represents the project’s properties. Each project also contains a References item that represents references to libraries used by the project.
In addition to the Properties and References items, the projects contain files related to the project. In this example, the TurtleLib project includes the class definition file Turtle.cs, and the TurtleTest project contains the form definition file Form1.cs.
In the TurtleTest project the Show All Files button has been clicked (the button third from the right at the top of the figure) so that you can see all the project’s files. The TurtleLib project has similar files, but they are hidden by default.
These files are generated by Visual Studio for various purposes. For example, the bin and obj directories contain files generated when the projects are compiled.
The following list describes the items contained in the TurtleTest project, as shown in Figure 3-1. The exact files you see for an application may be different from those shown here, but this list should give you an idea of what’s involved in building a project. Note that most of these files are generated automatically by Visual Studio, and you shouldn’t edit them manually. If you change them directly, you are likely to lose your changes when Visual Studio rebuilds them. You may even confuse Visual Studio so it can’t load the project.
TurtleTest—This item represents the entire project. You can expand or collapse it to show and hide the project’s details.
Properties—This item represents the project’s properties. To change the properties, either right-click this item and select Open or select Project ⇒ Properties. Figure 3-2 shows the TurtleTest project’s properties pages.
AssemblyInfo.cs—This file contains information about the project’s assembly. Instead of editing this file directly, select Project ⇒ Properties to open the project’s properties page, and then on the Application tab, click the Assembly Information button. Figure 3-3 shows the TurtleTest project’s assembly information.
Resources.Designer.cs—This file contains definitions of project resources such as strings and images. Instead of editing this file directly, select Project ⇒ Properties to open the project’s properties page and then go to the Resources tab.
Settings.Designer.cs—This file contains definitions of project settings. Instead of editing this file directly, select Project ⇒ Properties to open the project’s properties page and then go to the Settings tab.
c03f002.tifFigure 3-2: A project’s properties pages lets you set project properties, resources, and settings.
c03f003.tifFigure 3-3: A project’s assembly information lets you specify values such as the project’s name, copyright information, and version.
References—This item lists references to external components such as libraries and COM components. In this example, the TurtleTest project uses the Turtle class defined in the TurtleLib project, so its References section includes a reference to the TurtleLib library. (To add a reference, right-click the References item, and select Add Reference. Alternatively, you can select Project ⇒ Add Reference.)
bin—This folder is used to build the application before it is executed. The Debug or Release subfolder contains the compiled .exe file (depending on whether this is a debug or release build).
obj—This folder and its Debug and Release subfolders are used to build the application before it is executed.
App.config—This file contains configuration settings that the application reads when it starts.
Form1.cs—This is a form code file. It contains the C# code you write that goes into the form. This includes event handlers for the form and its controls, and any other methods you add to the form’s code. If you double-click this file in Solution Explorer, Visual Studio opens the form in the Form Designer.
Form1.Desginer.cs—This file contains designer-generated C# code that builds the form. It initializes the form when it is created, creates the controls you placed on the form in the Form Designer, and sets the controls’ properties. It also registers any event handlers that you have defined for the form and its controls. Instead of editing this file, use the Form Designer to modify the form and its controls.
Form1—This entry represents the code behind Form1. If you double-click this file in Solution Explorer, Visual Studio opens the form’s code in the code editor.
Program.cs—This file contains the automatically generated Main method that Visual Studio executes to start the program.
Resources and Settings
Resources are chunks of data distributed with the application but that are not intended to be modified by the program. These might include prompt strings, error message strings, icons, pictures, and sound files.
Settings are values that control the execution of the application. These might include flags telling the program what options to display or how to perform certain tasks. For example, you could build different profiles to provide settings that make the program run in a restricted demo mode or in a fully licensed mode.
If you expand code items such as Form1 and Program, Solution Explorer lists the program elements contained inside. That includes variables, methods, event handlers, and other class-level items defined inside the class. You can double-click one of these items to open its definition in the Code Editor.
If you look closely at the bottom of Figure 3-1, you can see that the Solution Explorer window has three tabs. The first tab displays the Solution Explorer, which lists the files that make up the project. In Figure 3-1 that tab is selected so Solution Explorer is displayed.
The second tab opens Team Explorer, a tool that helps you manage your work in a team environment. For more information, see msdn.microsoft.com/library/hh500420.aspx.
The third tab opens the Class View. This tool enables you to view the classes defined by your projects. You can expand the classes to learn about their inheritance hierarchies. If you click a class, the bottom of the window shows you the class’s properties, methods, and events. If you double-click one of these items, Visual Studio opens the code that defines it in the Code Editor.
Figure 3-4 shows the Class View displaying information about the Turtle class defined in the TurtleLib project.
c03f004.tifFigure 3-4: The Class View lets you examine the classes defined by a project.
Some projects may have other hidden files. For example, when you add controls to a form, the designer adds a resource file to the form to hold any resources needed by the controls.
Normally, you do not need to work directly with the hidden files, and doing so can mess up your application. At best, the changes you make will be lost. At worst, you may confuse Visual Studio, so it can no longer load your project.
Instead you should use other tools to modify the hidden files indirectly. For example, the files holding resources used by a form are automatically updated when you modify the form and its controls.
Preprocessor Directives
Preprocessor directives are commands for the C# compiler. They tell the compiler such things as which pieces of code to include in compilation and how the Code Editor should group lines of code.
The following sections describe the most useful C# preprocessor directives.
#define and #undef
The #define directive defines a preprocessor symbol that you can then use with the #if, #else, #elif, and #endif directives described next. Preprocessor symbols are either defined or not defined. They do not have values like constants inside the code do.
NOTE A program can create variables and constants with the same names as defined preprocessor symbols.
The #undef directive removes the definition of a defined symbol.
The #define and #undef directives must come before any programming statements including using directives. They apply for the entire file that contains them.
Why #undef?
If all #define and #undef directives must appear at the beginning of the file, you may wonder why you would ever use #undef. After all, if you’re going to undefine something you just defined, why bother defining it in the first place?
The answer is in the program’s property pages. If you select Project ⇒ Properties and then go to the Build tab, you see the property page, as shown in Figure 3-5.
By default, Visual Studio defines the DEBUG and TRACE symbols. Uncheck the appropriate boxes if you don’t want them defined.
You can also add your own symbols by typing their names in the Conditional Compilation Symbols text box.
The #undef directive enables you to define symbols on the Build property page and then undefine them as needed in specific files.
c03f005.tifFigure 3-5: The Build property page lets you define conditional compilation symbols.
Visual Studio defines different sets of compilation symbols for different build configurations. The two standard configurations are Debug and Release. By default, Visual Studio defines the DEBUG and TRACE symbols for Debug builds and defines only the TRACE symbol for Release builds.
To change these values, use the Configuration Manager (found by selecting Build ⇒ Configuration Manager) to select the Debug or Release build. Then use the Build property page to determine which symbols are defined.
The DEBUG and TRACE symbols play a special role in program debugging. The Debug and Trace classes provide tools that make it easier to tell what a program is doing as it runs. The Debug class’s methods execute only if the DEBUG symbol is defined. Similarly, the Trace class’s methods execute only if the TRACE symbol is defined. By defining or not defining these symbols, you can easily turn the Debug and Trace methods on and off. Chapter 10, Tracing and Debuging,
says more about these classes.
#if, #else, #elif, and #endif
These statements enable you to use compilation symbols to decide which code is included in the program when it is compiled.
For example, the following code displays a different message box depending on which symbols are defined.
private void Form1_Load(object sender, EventArgs e)
{
#if DEBUG_LEVEL1
MessageBox.Show(Debug level is 1
);
#elif DEBUG_LEVEL2
MessageBox.Show(Debug level is 2
);
#else
MessageBox.Show(Debug level is undefined
);
#endif
...
}
In this example, if the symbol DEBUG_LEVEL1 is defined, the first message box displays. If that symbol is not defined but DEBUG_LEVEL2 is defined, the second message box displays. If neither of those symbols is defined, the third message box displays.
Visual Studio evaluates compilation symbols while you write code and grays out code that won’t be included in the compilation, so it’s easy to see what code will be used.
In addition to the simple tests shown in the preceding code snippet, the #if and #elseif directives can include parentheses and the !, &&, and || boolean operators. For example, the following code displays a message if SKIP_DEBUG is defined, or DEBUG_LEVEL1 and DEBUG_LEVEL2 are both undefined.
#if SKIP_DEBUG || (!DEBUG_LEVEL1 && !DEBUG_LEVEL2)
MessageBox.Show(Don't display debugging messages.
);
#endif
You can also use the != and == operators to compare symbols to the values true and false. For example, the following code displays a message box if the symbol SHOW_GREETING is defined.
#if SHOW_GREETING == true
MessageBox.Show(Hello!
);
#endif
The syntax #if SHOW_GREETING is simpler and usually easier to read, so most developers use that approach.
Debugging Levels
Sometimes, it’s helpful to easily adjust the level of diagnostic output a program generates. You could define a set of conditional compilation symbols named DEBUG_LEVEL1, DEBUG_LEVEL2, and so forth. The program would then send diagnostic messages to the Output Window or to a log file depending on the debug level.
For example, you might place level 1 Debug statements in major subroutines, level 2 statements in secondary routines, and level 3 statements throughout important routines to provide step-by-step information. Then you can define the debug level symbols to quickly give you the amount of information you want.
This is particularly useful when you test and debug a program. Instead of removing test code from the program, you can surround it with #if #endif directives, so you can reactivate it later if you find bugs in the code.
For more information on debugging C# applications, see Chapter 10.
Note that the code not included by the conditional compilation statements is completely omitted from the executable program. That means excluded code doesn’t take up space in the executable program.
That also means Visual Studio doesn’t check the correctness of code that isn’t included. Visual Studio won’t warn you if excluded code contains typographical errors and invalid C# code.
#warning and #error
The #warning directive generates a level 1 warning. It is listed in the Error List but won’t stop the program from compiling. One reason to do this is to flag deprecated code so that developers know they are using old code, as in the following example.
#if OLD_VERSION
#warning You are using an old version of this library
#endif
The #error directive is similar to the #warning directive except it generates an error instead of a warning. An error prevents Visual Studio from compiling the program.
#line
The #line directive enables you to control the file’s line number and name for reporting purposes. This directive can take one of the three forms described in the following list.
#line number [file]—This sets the line number and optionally the filename for the following line. If a #warning or #error directive follows this directive, it reports the given line number and file. If it is included, the file must be enclosed in double quotes.
#line hidden—This hides the lines that follow from the debugger until the next #line directive is reached.
#line default—This restores the file’s line number and name to their true values.
The following example demonstrates the #line directives.
#if OLD_VERSION
#line 10 Tools Module
#warning This code is deprecated.
#endif
#line hidden
... lots of code omitted ...
#line default
If the symbol OLD_VERSION is defined, this code’s first #line directive sets the line number to 10 and the filename to Tools Module
. Then the #error directive displays a message in the Error List that says there’s an error on line 10 in the file Tools Module.
The #line hidden directive hides the omitted code from the debugger. If you try to step through the code in the debugger, the Code Editor skips over those lines. They are still executed, but you can’t step through them.
The final #line default directive restores the file to normal line numbering, name, and ends line hiding.
WARNING In some versions of Visual Studio, the Code Editor doesn’t seem to completely end line hiding until it reaches a #line default directive.
#region and #endregion
Some code constructs such as class and method definitions define regions that you can collapse in the Visual Studio Code Editor. If you look closely at a class statement, you can see a minus sign to the left in the Code Editor. If you click the minus sign, the editor collapses the class into a single line and changes the minus sign to a plus sign. Click the plus sign to expand the class again.
In Figure 3-6, the Person class and the PrintInvoice method in the Customer class are collapsed.
c03f006.tifFigure 3-6: The Code Editor lets you expand and collapse blocks of code such as classes and methods.
The #region directive enables you define other sections of code that you can collapse and expand in a similar manner. The section of code extends to a corresponding #endregion directive.
The #region and #endregion directives can be followed by a string that identifies them. You can use that string to identify the region, so you can make sure the directives match up. However, the Code Editor completely ignores that string, so if a #region directive’s string doesn’t match the string used in the corresponding #endregion directive, Visual Studio doesn’t care.
For example, suppose an Employee class contains a lot of code for calculating payroll. You could place the payroll-related properties, methods, and other code in a region. Then you could hide that region so that it doesn’t get in the way while you work on other code in the class. The following code snippet shows how you could define this kind of region.
public class Employee : Person
{
#region PayrollCode
... Payroll-related code here ...
#endregion PayrollCode
... Other Employee code ...
}
Sometimes, it may be easier to move