+ All Categories
Home > Documents > c#basics

c#basics

Date post: 15-Jan-2016
Category:
Upload: kotirama
View: 1 times
Download: 0 times
Share this document with a friend
Description:
basics of c
Popular Tags:
399
.Net C# Data Types Data is physically stored inside cells of memory. This memory could be physical memory (Hard disk ) or logical memory (RAM). Any cell of memory is represented with a unique address. This address is more than some combination of numbers or symbols. C# language provides for practically all the data types . These types can be divided in three categories: value types, reference types and pointer types. There are some more basic concepts to be learnt before the discussion of the data types. This is about variables and constants. A Variable is a named cell of memory used for data storage . A Variable value can be changed anytime. Every variable must have a type and this type must be set before it is used. Qualifying a variable with a type is called as declaration of variable. The type of a variable is the most important aspect and it defines the behavior of variable. All variables can be divided into seven main categories depending on the context of usage: 1. Static variables. 2. Variable of instance. 3. Array's elements. 4. Parameters given by reference. 5. Parameters given by value. 6. Returned values. 7. Local variables. Static Variables will be alive throughout the life of a program. It can be declared using static modifier. An Instance variable is a variable declared without static modifier. Usually it is declared inside a class or structure definition.
Transcript
Page 1: c#basics

.Net C# Data Types   Data is physically stored inside cells of memory. This memory could be physical memory (Hard disk) or logical memory (RAM). Any cell of memory is represented with a unique address. This address is more than some combination of numbers or symbols.

   C# language provides for practically all the data types. These types can be divided in three categories: value types, reference types and pointer types.

   There are some more basic concepts to be learnt before the discussion of the data types. This is about variables and constants. A Variable is a named cell of memory used for data storage. A Variable value can be changed anytime. Every variable must have a type and this type must be set before it is used. Qualifying a variable with a type is called as declaration of variable. The type of a variable is the most important aspect and it defines the behavior of variable. All variables can be divided into seven main categories depending on the context of usage: 

1. Static variables.2. Variable of instance.3. Array's elements.4. Parameters given by reference.5. Parameters given by value.6. Returned values.7. Local variables.

   Static Variables will be alive throughout the life of a program. It can be declared using static modifier.

   An Instance variable is a variable declared without static modifier. Usually it is declared inside a class or structure definition.

   Parameter Values can be viewed as input parameters into methods:

public static void Sum(int a, int b){   Console.WriteLine("The sum of elements {0} and {1} is {2}",a,b,a + b);}

   This code writes in console values of variables a, b and their summary value. Now if the values of these parameters are modified inside the method, this

Page 2: c#basics

change will not be reflected inside the main function. It is because the compiler creates copies of them when it passes them as value types. This ensures that their original values are not modified.

   Instead if one wants to modify the parameter variables inside the function, C# has something called Reference variables. Reference variables also have a modifier out which can be used before their type. Look at the following example:

public static void SumRef(ref int a, ref int b){   a = 4;   b = 6;   Console.WriteLine("The sume of elements {0} and {1} is {2}",a,b,a + b);}

   Now this method modifies the value of variables a and b with values 4 and 6. These values are retained even after the execution of the function gets completed.If the parameters need to be returned then they can be qualified with out modifier or as returned parameter in method definition. Here is an example of both of them, in which both of them return the same value:

public static int SumOut(int a, int b, out int sum1){

sum1 = a+b;Console.WriteLine("The sum1 of elements {0} and {1} is {2}",a,b,a+b);return sum1;

In main function it must be called in the next manner:

int sume ;sume = SumeOut(2,2, out sume);

Constants in C#:

Constant type of data cannot be changed. To declare a constant the keyword const is used. An example for the constant declaration is: const double PI = 3.1415;

Page 3: c#basics

Values types in C#:

Value type stores real data. When the data are queried by different function a local copy of it these memory cells are created. It guarantees that changes made to our data in one function don't change them in some other function. Let see at a simple example:

public class IntClass {   public int I = 1;}

Here we have simple class that contains only one public data field of integer type. Now have a look on its usage in main function:

static void Main(string[] args){// test class int i = 10;int j = i;j = 11;IntClass ic1 = new IntClass();IntClass ic2 = ic1;ic2.I = 100;

Console.WriteLine("value of i is {0} and j is {1}",i,j);Console.WriteLine();Console.WriteLine("value of ic1.I is {0} and ic2.I is {1}",ic1.I,ic2.I);Console.WriteLine();}

Reference Types in C#:

   In the above example, assume that First we have two value type i and j. Also assume that the second variable is initialized with the value of the first one. It creates new copy in memory and after it the values of these variables will be next:

i = 10;j = i;

   There are a few more things written in the above example for explaining the Reference Types in C#. At first, the variable ic1 of IntClass is created using dynamic memory allocation. Then we initialize the variable ic2 with value of ic1.

Page 4: c#basics

This makes both the variables ic1 and ic2 referring to the same address. If we change a value of ic2, it automatically changes the value of ic1.

   Now, over to the discussions about the important value types used in C#. The category simple types contains some predefined or system types that also are commonly used in other programming languages. It contains integer types: byte, Sbyte, Long, Ulong, Short, Ushort, int, Uint. These common types differs only range of values and sign.

   Next simple type is character type. To declare a variable of this type need use keyword char. It can take values of characters or numbers as 16-digit symbol of the type Unicode.

   The Boolean type has only two values: true, false. But these values cannot be assigned with a 0 or 1 as in C++ language.

   Next category of simple types is floating point types. It contains two types float and double. Float type can get values in range from 1.5*10-45 to 3.4*1038. Double type has range of values from 5.0*10-324 to 1.7*10308.

   A structural value types are struct and enum. Struct is a the same as class but it uses real values not references. The following code snippet contains the definition for struct:

struct Point3D{

public float m_x;public float m_y;public float m_z;

public float [] GetArray(){

float [] arr = new float[3];arr[0] = m_x;arr[1] = m_y;arr[2] = m_z;return arr;

}

}

Page 5: c#basics

   The above is declaration for a simple structure of real 3D point. As you see a class declaration looks very similar to the struct except that the class also has a constructor.

   Enumerated types can be used to create some set of identifiers that can have values of simple type. Let us see at example of enum type:

public enum Days{

Monday, Tuesday, Wensday,Thursday,Friday,Saturday,Sunday

In example there are enum that has days of week names. The values of days by default are in range from 0 to 6.

Common types in C#:

   Object in C# language is universal; it means that all supported types are derived from it. It contains only a couple of methods: GetType() - returns a type of object, ToString() returns string equivalent of type that called.

Next type is class. It is declared in the same manner as structure type but it has more advanced features.

Interface is an abstract type. It is used only for declaring type with some abstract members. It means members without implementations. Please, have a look at piece of code with a declaration for a simple interface:

interface IRect{int Width{get;set;}

Page 6: c#basics

int Height{get;set;}

int CalculateArea();}

   The members of interface can be methods, properties and indexers.

   Next reference type to be dealt is delegate. The main goal of delegate usage is encapsulation of methods. It most like at pointers to function in C++.

   String is common type that is used in almost all programming languages of high level. An example of string declaration and initialization:

        string s = "declaration and init";

   The last very used reference type is array. Array it is set of elements that have the same type. Array contains list of references on memory cells and it can contain any amount of members. In C# there are three types of arrays: one-dimensional, two-dimensional and jagged array.

   So, this covers almost all types used in C#. All these types can be cast to another type using special rules. An implicit casting can be done with types when values of variables can be converted without losing of any data. There is special type of implicit casting called boxing. This enables us to convert any type to the reference type or to the object type. Boxing example:

// boxing char ch = 'b';object obj = ch;Console.WriteLine("Char value is {0}",ch);Console.WriteLine("Object value is {0}",obj);Console.WriteLine();

   This piece of code prints the same values of integer type variable and object type variable. The opposite process to the boxing is un-boxing. An example for un-boxing is as follows.

Page 7: c#basics

// unboxing float q = 4.6f;object ob = q; Console.WriteLine("Object value is {0}",ob);float r = (float)ob;Console.WriteLine("Float value is {0}",r);

   So, it is main item of common data type creating and using. All sources are attached. To compile and run it need to run .NET command line. Just type: csc DataTypes.cs. It creates DataTypes.exe that can be run as standard executable file.

.Net C# Tutorial Intermediate Language - MSIL

   Microsoft Intermediate Language (MSIL) is a platform independent language that gets compiled into platform dependent executable file or dynamic link library. It means .NET compiler can generate code written using any supported languages and finally convert it to the required machine code depending on the target machine.

   To get some clarity in this language we need to write some code. In this tutorial we?ll use a very simple piece of source code in C# .Net. Now we need to compile this code using csc command in Microsoft .NET on the command line. To do this, please type next string: csc ILSample.cs. After it compiler will create an executable file named ILSample.exe.

   After this type the command called ILDasm. It will open application called Intermediate Language Disassembler. In file menu choose open and find our executable file.This application opens our assembly showing all structural units viz., classes, methods, data fields and all global and local application data. Now if you click on the method it shows code in intermediate language. This code is most like at language with independent set of instructions. 

public double GetVolume(){    double volume = height*width*thickness;    if(volume<0)        return 0;

Page 8: c#basics

    return volume;} 

   You can get the strings of Microsoft Intermediate Language code using ILDasm:

.method public hidebysig instance float64 GetVolume() cil managed{// Code size 51 (0x33).maxstack 2.locals init ([0] float64 volume,[1] float64 CS$00000003$00000000)IL_0000: ldarg.0IL_0001: ldfld float64 OOP.Aperture::heightIL_0006: ldarg.0IL_0007: ldfld float64 OOP.Aperture::widthIL_000c: mulIL_000d: ldarg.0IL_000e: ldfld float64 OOP.Aperture::thicknessIL_0013: mulIL_0014: stloc.0IL_0015: ldloc.0IL_0016: ldc.r8 0.0IL_001f: bge.un.s IL_002dIL_0021: ldc.r8 0.0IL_002a: stloc.1IL_002b: br.s IL_0031IL_002d: ldloc.0IL_002e: stloc.1IL_002f: br.s IL_0031IL_0031: ldloc.1IL_0032: ret} // end of method Aperture::GetVolume

   To clearly understand that IL really is immediately language you should write the same code in VB .NET and look at these two sources in IL. These methods will be almost identical.

   The main advantages of IL are:

Page 9: c#basics

1. IL isn?t dependent on any language and there is a possibility to create applications with modules that were written using different .NET compatible languages.

2. Platform independence - IL can be compiled to different platforms or operating systems.

OOP & C#

   The skeleton of object - oriented programming is of course the concepts of class. This C# tutorial on OOPS explains classes and their importance in implementation of object ? oriented principles.

   Any language can be called object ? oriented if it has data and method that use data encapsulated in items named objects. An object ? oriented programming method has many advantages, some of them are flexibility and code reusability.

   All the programming languages supporting Object oriented Programming will be supporting these three main concepts:

1. Encapsulation2. Inheritance3. Polymorphism

Encapsulation in C#:

   Encapsulation is process of keeping data and methods together inside objects. In this way developer must define some methods of object?s interaction. In C# , encapsulation is realized through the classes. A Class can contain data structures and methods. Consider the following class.

public class Aperture{

public Aperture(){

}

protected double height;protected double width;

Page 10: c#basics

protected double thickness;

public double GetVolume(){

double volume = height*width*thickness;if(volume<0)return 0;return volume;

}

}

   In this example we encapsulate some data such as height, width, thickness and method GetVolume. Other methods or objects can interact with this object through methods that have public access modifier. It must be done using ?.? operator.

Inheritance in C#:

   In a few words, Inheritance is the process of creation new classes from already existing classes. The inheritance feature allows us to reuse some parts of code. So, now we have some derived class that inherits base class?s members. Consider the following code snippet:

public class Door : Aperture{

public Door() : base(){

}

public bool isOutside = true;

}

   As you see to inherit one class from another, we need to write base class name after ?:? symbol. Next thing that was done in code Door () ? constructor also

Page 11: c#basics

inherits base class constructor. And at last we add new private field. All members of Aperture class are also in Door class. We can inherit all the members that has access modifier higher than protected.

Polymorphism in C#:

   Polymorphism is possibility to change behavior with objects depending of object?s data type. In C# polymorphism realizes through the using of keyword virtual and override. Let look on the example of code:

public virtual void Out(){   Console.WriteLine("Aperture virtual method called");} //This method is defined in Aperture class. public override void Out(){   Console.WriteLine("Door virtual method called");}

   Now we need to re-define it in our derived Door class. The usage of virtual methods can be clarified when we creating an instance of derived class from the base class:

Aperture ap = new Door();ap.Out();

   In such cases, the runtime keeps record of all the virtual function details in a table called VMT(Virtual Method Table) and then in runtime dynamically picks the correct version of the function to be used. Here it uses Out() method from derived class of course.

.Net C# Tutorial Namespaces   A Namespace in Microsoft .Net is like containers of objects. They may contain unions, classes, structures, interfaces, enumerators and delegates. Main goal of using namespace in .Net is for creating a hierarchical organization of program. In this case a developer does not need to worry about the naming conflicts of classes, functions, variables etc., inside a project.

Page 12: c#basics

   In Microsoft .Net, every program is created with a default namespace. This default namespace is called as global namespace. But the program itself can declare any number of namespaces, each of them with a unique name. The advantage is that every namespace can contain any number of classes, functions, variables and also namespaces etc., whose names are unique only inside the namespace. The members with the same name can be created in some other namespace without any compiler complaints from Microsoft .Net.

   To declare namespace C# .Net has a reserved keyword namespace. If a new project is created in Visual Studio .NET it automatically adds some global namespaces. These namespaces can be different in different projects. But each of them should be placed under the base namespace System. The names space must be added and used through the using operator, if used in a different project.

   Please now have a look at the example of declaring some namespace:

using System;namespace OutNamespace{

namespace WorkNamespace{ /// can be placed some classes, structures etc. }

}

   In this example we create two namespaces. These namespaces have hierarchical structure. We have some outer one named OutNamespace and the inner one called WorkNamespace. The inner namespace is declared with a C# .Net class WorkItem.

   The next logical discussion after a namespace is classes. A class is the basis of object ? oriented programming. It encapsulates the data and methods into one itself and manipulates them through the interaction with that object. 

class WorkItem{public WorkItem(){

Page 13: c#basics

}

static WorkItem(){m_counter = 1;}public static int GetCounter(){return m_counter;}

private static int m_counter;

public virtual void Status(){

}

internal bool IsWorking{get{return m_isWorking;}set{m_isWorking = value;}}

private bool m_isWorking = true;

   The above sample contains the .Net namespace with the class WorkItem inside it.

   As already discussed, a class is the basis of Object oriented programming. A class must have a constructor. The constructor method is used for initialization purposes. Each class can have different modifiers which pertains to the type and functionality of the class. Some such modifiers are: new, public, protected, internal, private, abstract, and sealed. A class members can also have these modifiers. In the above example, there is declared special constructor type ?

Page 14: c#basics

static constructor. It uses only for class not for its instances. In the same way we can access to the static members of class.

OutNamespace.WorkNamespace.WorkItem item = new WorkItem();int i = WorkItem.GetCounter();

   In this piece of code there was created some instance of WorkItem but called using its full name (including all namespace?s names). The second line it is an access to the public static property of WorkItem. There are many advanced features that can be used in class constructing process. One of them polymorphism that can be realized though the virtual methods.

.Net Framework basics

   When we speak about .Net, we mean by .NET framework. .NET Framework is made up of the Common Language Runtime (CLR), the Base Class Library (System Classes). This allows us to build our own services (Web Services or Windows Services) and Web Applications (Web forms Or Asp .Net), and Windows applications (Windows forms). We can see how this is all put together.?

   Above Picture shows overall picture, demonstrating how the .NET languages follows rules provided by the Common Language Specifications (CLS). These languages can all be used?Independently to build application and can all be used with built-in data describers (XML) and data assessors (ADO .NET and SQL). Every component of the .NET Framework can take advantage of the large pre- built library of classes called the Framework Class Library (FCL). Once everything is put together, the code that is created is executed in the Common Language Runtime. Common Language Runtime is designed to allow any .NET-compliant language to execute its code. At the time of writing, these languages included VB .Net, C# and C++ .NET, but any language can become .NET- compliant, if they follow CLS rules. The following sections will address each of the parts of the architecture.

Page 15: c#basics

.Net Common Language Specifications (CLS):

   In an object-oriented environment, everything is considered as an object. (This point is explained in this article and the more advanced features are explained in other articles.) You create a template for an object (this is called the class file), and this class file is used to create multiple objects.TIP: Consider a Rectangle. You may want to create many Rectangle in your lifetime; but each Rectangle will have certain characteristics and certain functions. For example, each rectangle will have a specific width and color. So now, suppose your friend also wants to create a Rectangle. Why reinvent the Rectangle? You can create a common template and share it with others. They create the Rectangle based on your template. This is the heart of object-oriented programming?the template is the class file, and the Rectangle is the objects built from that class. Once you have created an object, your object needs to communicate with many other Objects. 

   Even if it is created in another .NET language doesn?t matter, because each language follows the rules of the CLS. The CLS defines the necessary things as common variable types (this is called the Common Type System CTS ), common visibility like when and where can one see these variables, common method specifications, and so on. It doesn?t have one rule which tells how C# composes its objects and another rule tells how VB .Net does the same thing . To steal a phrase, there is now ?One rule to bind them all.? One thing to note here is that the CLS simply provides the bare rules. Languages can adhere to their own specification. In this case, the actual compilers do not need to be as powerful as those that support the full CLS.

The Common Language Runtime (CLR):

   The heart of .net Framework is Common Language Runtime (CLR). All .NET-compliant languages run in a common, managed runtime execution environment. With the CLR, you can rely on code that is accessed from different languages. This is a huge benefit. One coder can write one module in C#, and another can access and use it from VB .Net. Automatic object management, the .NET languages take care of memory issues automatically. These are the few listed?benefits which you get from CLR.

Microsoft Intermediate Language (MSIL):

   So how can many different languages be brought together and executed together??Microsoft Intermediate Language (MSIL) or, as it?s more commonly known, Intermediate Language (IL). In its simplest terms, IL is a programming language.?If you wanted to, you could write IL directly, compile it, and run it. But why would want to write such low level code? Microsoft has provided with higher-level languages, such as C#, that one can use. Before the code is executed, the

Page 16: c#basics

MSIL must be converted into platform-specific code. The CLR includes something called a JIT compiler in which the compiler order is as follows. 

Source Code => Compiler => Assembley =>Class Loader =>Jit Compiler =>Manged Native Code=>Execution.

  The above is the order of compilation and execution of programs. Once a program is written in a .Net compliant language, the rest all is the responsibility of the frame work.

Methods and propertiesAny class in an object-oriented language has method and property members. These are the places where the actual business logic or functionality is written and executed. This tutorial explains how to create and use methods and properties in C#.

C# Methods:

Method is object-oriented item of any language. All C# programs are constructed from a number of classes and almost all the classes will contain methods. A class when instantiated is called an object. Object-oriented concepts of programming say that the data members of each object represent its state and methods represent the object behavior.

Method Signature in C#:

Each method is declared as follows:

    Return-type methodname ( Parameterslist );

For better understanding of methods let consider following example. We have a class Man. It can have many fields like that:

public class Man{    public Man(){}    private int m_old;    private string m_name;    public string WhatIsYourName()   {       Console.WriteLine(m_name);        return m_name;   }

Page 17: c#basics

   public string HowOldAreYou()  {      Console.WriteLine(m_old.ToString());      return m_old;   } }

   The private members m_old and m_name define some state of objects that can be created as instances of our class. Also the class Man has two methods, which serve some of our requests. Method string WhatIsYourName() writes current object?s name to the console and returns it, and the second one similar to first return age of man and also writes an output to the console.

   The return type in the example above returns strings, which is an in-built data type. The methods can also return any generic C# type or any custom types created by us.

Passing Parameters to Methods in C#:

The input parameters can be passed in two ways. Value type Reference type.

   If parameters are passed as value types a new copy of it will be created and passed inside the function. If they are created as reference types, only the address of the parameters will be passed.

See next example:

public int CalculateBirthYear(int year){     int b = year - m_old;     Console.WriteLine("Birth year is {0}",b);      return b; }

   If input parameter pass as reference type it must use keyword ref, in that way we operate with the same cell in memory. That?s mean it can be changed inside any method. A small example for a parameter passed by reference is:

public int CalculateBirthYear(ref int year) {   int b = year - m_old;   Console.WriteLine("Birth year is {0}",b);   return b;}

Page 18: c#basics

Now, the function CalculateBirthYear can even modify the value of year as it is passed by reference.

Output Parameters in Methods:   The return values in any function will be enough for any one if only one value is needed. But in case a function is required to return more than one value, then output parameters are the norm. This is not supported in C++ though it can be achieved by using some programming tricks. In C# the output parameter is declared with the keyword out before the data type. A typical example is as follows.

public void CalculateBirthYear(ref int year, out int birthyear){    int b = year - m_old;    Console.WriteLine("Birth year is {0}",b);     birthyear = b;      return; }

Strictly speaking there is no difference between ref and out parameters. The only difference is that the ref input parameters need an input value and the out parameters don?t.

Variable arguments in C#:   The C# language supports variable arguments through a keyword called params. A typical example for the declaration of a function with variable argument signature is as follows.

    Public void functionName(int a, params int[] varParam);

Method Overloading in C#:A method is considered to be an overloaded method, if it has two or more signatures for the same method name. These methods will contain different parameters but the same return types.

A simple example for an overloaded methods are:

Public void functionName(int a, params int[] varParam);Public void functionName(int a);

Property in C#:

Page 19: c#basics

Property ? it is a special method that can return a current object?s state or set it. Simple syntax of properties can see in the following example:

public int Old {   get {return m_old;}   set {m_old = value;} } public string Name {   get {return m_name;} }

Here are two types of properties. A first one can set or get field of class named m_old, and the second is read only. That?s mean it can only get current object?s state.

The significance of these properties is its usability. These properties need not be called with any function names like objectname.get or objectname.set etc., But they can be directly assigned the values or retrieve the values.

C# .Net and Java

This article compares the same program written in the C# and Java languages and then compares the dissembled code of both languages.

Java Hello Program:

class Hello{

public static void main(String args[]) {    System.out.println("Hello");}

}

Disassembled Java Hello Program:

Page 20: c#basics

class Hello{

Hello(){    // 0 0:aload_0     // 1 1:invokespecial #1 <Method void Object()>    // 2 4:return }

public static void main(String args[]){    System.out.println("Hello");    // 0 0:getstatic #2 <Field PrintStream System.out>    // 1 3:ldc1 #3 <String "Hello">    // 2 5:invokevirtual #4 <Method void PrintStream.println(String)>    // 3 8:return }

}

Explanation of Java program:

   To understand this you must have some knowledge of computer internals concepts for eg. Opcodes, instruction templates etc. I assume that you already know them.

   As usual this code will also start with main method. The first line tells that print ?Hello? it is a normal print statement. A specific instruction, with type information, is built by replacing the ?T? in the instruction template in the opcode column by the letter in the type column. In this case it is a load instruction for type reference.

   Invokespecial instruction must name an instance initialization method, a method in the current class, or a method in a superclass of the current class. Class and interface initialization methods are invoked implicitly by the Java virtual machine; they are never invoked directly from any Java virtual machine instruction, but are invoked only indirectly as part of the class initialization process.

Page 21: c#basics

invokevirtual or invokespecial is used to access a protected method of a superclass, then the type of the class instance being accessed must be the same as or a subclass of the current class.

   The Java virtual machine uses local variables to pass parameters on method invocation. On class method invocation any parameters are passed in consecutive local variables starting from local variable 0.

C# Hello Program:

using System; 

class Hello {

public static void Main(string[] args) {   Console.WriteLine("Hello"); }

Disassembled C# Hello Program :

.method private hidebysig static void Main() cil managed { .entrypoint // Code size 11 (0xb) .maxstack 8 IL_0000: ldstr "Hello" IL_0005: call void [mscorlib]System.Console::WriteLine(class System.String) IL_000a: ret } // end of method Hello::Main

Explanation of C# .Net Program:

   The first line defines the Main method by using the .method MSIL keyword. Note that the method is defined as being public and static, which are the default

Page 22: c#basics

modifiers for the Main method. Also note that this method is defined as managed. 

   The next line of code uses the MSIL .entrypoint keyword to designate this particular method as the entry point to the application. When the .NET runtime executes this application, this is where control will be passed to the program. 

   Next, look at the MSIL opcodes on lines IL_0000 and IL_0005. The first uses the the ldstr (Load String) opcode to load a hard-coded literal ("Hello") onto the stack. 

   The next line of code calls the System.Console.WriteLine method. Notice that the MSIL prefixes the method name with the name of the assembly that defines the method. This line also tells us the number of arguments (and their types) that are expected by the method. Here, the method will expect a System.String object to be on the stack when it's called. Finally, line IL_000a is a simple ret MSIL opcode to return from the method

C# .Net Tutorial Attributes   This article deals with the new C# .net features named attributes. This can be used as a Self paced C# .net training or C# tutorial material.

   C# .net Attributes provide a powerful method of associating declarative information with C# code. It can work with types, methods, properties and other language components.

   As a thumb-rule, a class is said to be an attribute class, if it directly or indirectly derives from the System.Attribute class. 

Attributes in C# .net - Sample:

   This C# tutorial on attributes uses custom attributes by defining an attribute class. The class ProductInfo is derived from System.Attribute class. This class contains information about application author and product version. The created class is:

[AttributeUsage(AttributeTargets.All)] public class ProductInfo : System.Attribute { 

public ProductInfo(double version,string name) { 

Page 23: c#basics

m_version = version; m_authorName = name; 

public double Version { 

get { return m_version; } 

private double m_version = 1.00; public string AuthorName { 

get { return m_authorName; } 

private string m_authorName; 

}

There is a new item in the first line of code. It is an attribute that allows us to use a c# attribute keyword AttributeUsage to all elements of our class (parameter AttributeTargets.All).

   Now we can use these c# attributes in declaration of any other custom class:

[ProductInfo(1.005,"CoderSource"])

public class AnyClass { }

   After creating simple custom type c# attributes, we can get information about all its attributes at runtime. Such run-time information can be pulled out from a class by using the namespace System.Reflection. In main function of our C# tutorial program we can get from our object all information about custom attributes. Next piece of code demonstrate it:

MemberInfo membInfo;membInfo = typeof(AnyClass);

Page 24: c#basics

object [] attributes;attributes = membInfo.GetCustomAttributes(typeof(ProductInfo),true); 

if(attributes.GetLength(0)!=0) { 

ProductInfo pr = (ProductInfo) attributes[0]; Console.WriteLine("Product author: {0}",pr.AuthorName); Console.WriteLine("Product version; {0}",pr.Version); 

}

  Using standard methods of getting type information and members of his type we can get all custom attributes.

   The example in this C# tutorial uses only one of three library c# attributes (AttributeUsage). It uses only with declaration some custom c# attribute. There is another standard attribute called Conditional. It calls method with that attribute only in case when method application has some needed condition. Most often it is used to define some preprocessor commands (?#?). And the last reserved attribute is Obsolete. It helps us to mark some elements of program that are old to use. These are basic things about attributes and their usage in applications. 

C# .Net Tutorial Exceptions   This article is a basic c# tutorial dealing with exceptions in c# .net.

   Practically any program including c# .net can have some amount of errors. They can be broadly classified as compile-time errors and runtime errors. Compile-time errors are errors that can be found during compilation process of source code. Most of them are syntax errors. Runtime errors happen when program is running.

   It is very difficult to find and debug the run-time errors. These errors also called exceptions. Rules of good coding style say that program must be able to handle any runtime error. Exception generates an exception call at runtime. Exceptions in C# can be called using two methods:

1. Using the throw operator. It call the manage code anyway and process an exception.

2. If using the operators goes awry, it can generate an exception.

Page 25: c#basics

Simple Exceptions - .Net C# Tutorial:

   C# language uses many types of exceptions, which are defined in special classes. All of them are inherited from base class named System.Exception. There are classes that process many kinds of exceptions: out of memory exception, stack overflow exception, null reference exception, index out of range exception, invalid cast exception, arithmetic exception etc. This c# tutorial deals with DivideByZero c# exception and custom classes in c# exceptions.

   C# has defined some keywords for processing exceptions. The most important are try, catch and finally. 

   The first one to be known is the try operator. This is used in a part of code, where there exists a possibility of exception to be thrown. But operator ?try? is always used with the operators: catch and finally. 

  See the following example of handling a simple exception in c#.

//Sample code for C# Exception tutorial using try , catch

// try catch exceptionint zero = 0;try{    int div = 100/zero;}catch(DivideByZeroException){    Console.WriteLine("Division by zero exception passed");}

   This code in runtime throws a DivideByZeroException and writes some message through the console. But if you want to release some resources that were created you must use try ? finally construction. Finally will be called even if there were no exceptions raised.

//Sample code for C# Exception tutorial using try, finally

Bitmap bit = null;// try finally exception

Page 26: c#basics

try{

    bit = new Bitmap(100,100);

}finally{

bit.Dispose();Console.WriteLine("bitmap is disposed");

}

   In the similar way we can use try ? catch ? finally construction. The attached c# tutorial program contains sample including all the three.

Custom Exception Classes - C# Tutorial:

   Some larger projects might have a requirement of creating their own custom exception classes. Let us try to create class that validates email address. It will validate for the ?@? symbol. Please have a look on the following piece of code: 

//Sample code for C# .Net Exception tutorial - validates an email address

public class TextException : Exception{

public TextException() : base()<br>{}

public TextException(string message) : base(message){

}

}

public class MailValidator{

Page 27: c#basics

MailValidator(){

}

private static char symbol = '@';

public static void TestEnteredMail(string mailAddress){

if(mailAddress.IndexOf(symbol)==-1){

Console.WriteLine("The string entered is not a valid email address");<br>throw(new TextException());

}

}

}

   Here were created a C# .Net TextException class that inherits from System.Exception class of .NET class library. Actually it does nothing, but there is an additional class MailValidator. It has TestEnteredMail method that raises a TextException. Now look at usage of it in Main function. 

try{

MailValidator.TestEnteredMail(Console.ReadLine());

}catch(TextException){

Console.WriteLine("Exception was passed");

}

Page 28: c#basics

   So, if user enters mail address without it throws an exception. All the sources are attached and compliable. The example can be compiled using .NET command line through the csc command line program. You only need to type csc filename.cs.

C# .Net Tutorial Interfaces   This C# Tutorial deals with interfaces in C# .Net. An Interface is a reference type and it contains only abstract members. Interface's members can be Events, Methods, Properties and Indexers. But the interface contains only declaration for its members. Any implementation must be placed in class that realizes them. The interface can't contain constants, data fields, constructors, destructors and static members. All the member declarations inside interface are implicitly public. 

Defining an Interface:

   Let us look at a simple example for c# interfaces. In this example interface declares base functionality of node object.

interface INode{ 

string Text { get;set; } 

object Tag { get;set; } 

int Height{ get;set; } 

int Width{ get;

Page 29: c#basics

set; } 

float CalculateArea(); 

}

   The above INode interface has declared a few abstract properties and function which should be implemented by the derived classes. 

//Sample for Deriving a class using a C# .Net interface -  c# tutorial

public class Node : INode { 

public Node(){}public string Text{ 

get{   return m_text;} 

set{    m_text = value; } 

private string m_text; public object Tag{ 

get{    return m_tag; } 

set{ 

Page 30: c#basics

   m_tag = value; } 

private object m_tag = null; public int Height{ 

get{    return m_height; } 

set{    m_height = value; } 

private int m_height = 0; public int Width{ 

get{    return m_width; } 

set{    m_width = value; } 

private int m_width = 0; 

public float CalculateArea(){ 

if((m_width<0)||(m_height<0))

Page 31: c#basics

    return 0; 

return m_height*m_width; 

}

   Now the above code has created a c# class Node that inherits from INode c# interface and implement all its members. A very important point to be remembered about c# interfaces is, if  some interface is inherited, the program must implement all its declared members. Otherwise the c# compiler throws an error.

   The above code was a simple example of c# interface usage. Now this has to be followed with some advanced details of interface building in C# .Net. The previous example used only names of methods or properties that have the same names as in interface. But there is another alternative method for writing the implementation for the members in class. It uses full method or property name e.g. INode.CalculateArea () {// implemetation}.

Multiple Inheritance using C# interfaces:

   Next feature that obviously needs to be explained is multiple inheritance using c# interfaces. This can be done using child class that inherits from any number of c# interfaces. The inheritance can also happen with a combination of a C# .Net class and c# interfaces. Now let us see a small piece of code that demonstrate us multiple inheritance using only interfaces as parent data types.

class ClonableNode : INode,ICloneable{ 

public object Clone(){return null; } 

// INode members }

Page 32: c#basics

   The above example created a class ClonableNode. It implements all the functionality of INode interface in the same way as it was done in Node class. Also it realizes Clone method only one item of IClonable interface of .NET library.

is Operator for C# .Net interfaces - C# Tutorial:

   At last a new C# operator that can be used to define that class should be explained. It is the is operator. Look at the following piece of code:

if(nodeC is INode)     Console.WriteLine("nodeC is object of INode type");else      Console.WriteLine("nodeC isn't object of INode type");

   In example nodeC object was created as ClonableNode type, but when we run program "if operator" returns true. It means that nodeC also is of INode type. 

C# .Net Tutorial Multithreading   Any Windows application must have one or more processes. A Process is structural unit with a memory block and using some set of resources. For each executable, the Windows operating system creates some isolated memory block. This C# .Net Tutorial tries to explain the basics of Multithreading in C# .Net.

   Every process must have at least one thread. The first thread is created with a process and is known as primary thread. This Primary Thread is entry point of application. In traditional Windows applications it is the method WinMain() and in console applications it is named main().

   Main goal of creating multithreading application is performance improvement. As an example, imagine a situation where in a user starts a long process (e.g. copying), he can?t use a single threaded application and wait for an infinite time for the operation to get completed. But if he uses multi?threading application he can set copying process in the background and interact with application without any problems.

   At first, if one wants to create a multi-threaded application an important point to be remembered is, a global variable, which is being accessed by different threads, can try to modify the same variable. This is a generic problem, which is solved using a mechanism called Synchronization of threads. Synchronization is nothing but the process of creating some set of rules to operate data or resources.

Page 33: c#basics

   The C# .Net language has a powerful namespace which can be used for programming with Threads as well as Thread Synchronization in C# .Net programming. The name of the namespace is Sytem.Threading. The most important class inside this namespace for manipulating the threads is the C# .Net class Thread. It can run other thread in our application process.

Sample program on C# Multithreading - C# Tutorial:

   The example it creates an additional C# .Net class Launcher. It has only one method, which output countdown in the console.

//Sample for C# tutorial on Multithreading using lock

public void Coundown(){

lock(this){

for(int i=4;i>=0;i--){

    Console.WriteLine("{0} seconds to start",i);

}

Console.WriteLine("GO!!!!!");

}

   There is a new keyword lock inside the above chunk of .Net C# tutorial code. This provides a mechanism for synchronizing the thread operation. It means at the same point of time only one thread can access to this method of created object. Unless the lock is released after completion of the code, the next routine or iteration cannot enter the block.

   To understand it more clearly please have a look at the piece of main method?s code:

Page 34: c#basics

Launcher la = new Launcher();

Thread firstThread = new Thread(new ThreadStart(la.Coundown));Thread secondThread =new Thread(new ThreadStart(la.Coundown));Thread thirdThread = new Thread(new ThreadStart(la.Coundown));

firstThread.Start();secondThread.Start();thirdThread.Start();

   As you see there were created three additional threads. These threads start a method of object that has Launcher type. The above program is a very simple example of using multi-threading in C#. Net. But C# .Net allows us to create more powerful applications with any level of complexity.

C# .Net Tutorial Reflection

   Reflection is the feature in .Net, which enables us to get some information about object in runtime. That information contains data of the class. Also it can get the names of the methods that are inside the class and constructors of that object.

   To write a C# .Net program which uses reflection, the program should use the namespace System.Reflection. To get type of the object, the typeof operator can be used. There is one more method GetType(). This also can be used for retrieving the type information of a class. The Operator typeof allow us to get class name of our object and GetType() method uses to get data about object?s type. This C# tutorial on reflection explains this feature with a sample class.

public class TestDataType{

public TestDataType(){   counter = 1;}

Page 35: c#basics

public TestDataType(int c){   counter = c;}

private int counter;

public int Inc(){   return counter++;}public int Dec(){   return counter--;}

At first we should get type of object that was created. The following C# .Net code snippet shows how to do it.

TestDataType testObject = new TestDataType(15);Type objectType = testObject.GetType();

   Now objectType has all the required information about class TestDataType. We can check if our class is abstract or if it is a class. The System.Type contains a few properties to retrieve the type of the class: IsAbstract, IsClass. These functions return a Boolean value if the object is abstract or of class type. Also there are some methods that return information about constructors and methods that belong to the current type (class). It can be done in a way as it was done in next example:

Type objectType = testObject.GetType();

ConstructorInfo [] info = objectType.GetConstructors();MethodInfo [] methods = objectType.GetMethods();

// get all the constructorsConsole.WriteLine("Constructors:");foreach( ConstructorInfo cf in info )

Page 36: c#basics

{   Console.WriteLine(cf);}

Console.WriteLine();// get all the methodsConsole.WriteLine("Methods:");foreach( MethodInfo mf in methods ){   Console.WriteLine(mf);}

   Now, the above program returns a list of methods and constructors of TestDataType class.

   Reflection is a very powerful feature that any programming language would like to provide, because it allows us to get some information about objects in runtime. It can be used in the applications normally but this is provided for doing some advanced programming. This might be for runtime code generation (It goes through creating, compilation and execution of source code in runtime).

   The Sample code can be downloaded from here. The attached example can be compiled using .NET command line csc command. Type csc Reflection.cs. This will create the executable Reflection.exe, which can be run as a normal executable.

COM InteropThe ultimate goal of COM Interop is to provide access to the existing COM

components without requiring that the original component be modified. This tries to make the .NET types equivalent to the COM Types.

COM Interop and Marshalling:

COM had a mechanism of marshalling and un-marshalling to convert between the source and target data types. This is now totally covered in COM Interop using RCW or Runtime Callable Wrapper. This automatically converts the .Net data types to the corresponding COM data types.

RegAsm and tlbimp in COM Interop

Page 37: c#basics

In addition, COM Interop allows COM developers to access managed objects as easily as they access other COM objects. It provides a specialized utility (RegAsm.exe) that exports the managed types into a type library and registers the managed component as a traditional COM component. At run time, the common language runtime marshals data between COM objects and managed objects as needed.

This tutorial shows how C# can use COM objects to develop applications. First thing to be done is the creation of wrapper class for the selected COM object. It can be done manually through the command line application called TlbImp.exe (Type Library Importer). This utility converts COM type library to the .NET Framework metadata. This procedure can be done automatically through the .NET environment. We just need to add reference to the COM object to our C# project. So, type in .NET command line next string: tlbimp $WindowsPath$\system32\quartz.dll /out: quartzNET.dll. This command will create a new dll with types that are compatible with any of Managed .NET languages. Now we can add this dll to our C# project or compile our C# file with additional feature "/r quartzNET.dll".

The following is an example of usage this COM object in C# managed code:

quartzNET.FilgraphManager manager = new quartzNET.FilgraphManagerClass();quartzNET.IMediaControl mc = (quartzNET.IMediaControl)manager;mc.RenderFile(args[0]);mc.Run();// Wait for completion.Console.WriteLine("Press Enter to continue."); Console.ReadLine();

Here is the MediaControl object, which was created in COM. This application gets a name of video file that we want to play from command line and shows it. So, this is a simple example of usage COM Interop. To compile an attached example we just need this quartzNET.dll (is attached too) and .NET command line. Type here next command csc InteropSample.cs /r:quartzNET.dll. It must create an executable file, but it can be run using command line, just type InteroPsample.exe some.avi. So, it opens a console application and also runs a standard Windows media player control to play the video.

Page 38: c#basics

.Net C# Delegates and Events

   This tutorial describes some basics about some of the great features of C# language namely Delegates and Events. These new constructs are used in object-oriented programming languages like C# and Java.

Delegates in C# .Net:

If we look at C++ there is a feature called callback function. This feature uses Pointers to Functions to pass them as parameters to other functions. Delegate is a similar feature but it is more type safe, which stands as a stark contrast with C++ function pointers. A delegate can hold reference/s to one more more functions and invoke them as and when needed.

A delegate needs the method's name and its parameters (input and output variables) when we create a delegate. But delegate is not a standalone construction. it's a class. Any delegate is inherited from base delegate class of .NET class library when it is declared. This can be from either of the two classes from System.Delegate or System.MulticastDelegate.

If the delegate contains a return type of void, then it is automatically aliased to the type of System.MulticastDelegate. This can support multiple functions with a += operator. If the delegate contains a non-void return type then it is aliased to System.Delegate class and it cannot support multiple methods.

Let us have a look at the following sample code.

class Figure{     public Figure(float a, float b, float c)    {        m_xPos = a;       m_yPos = b;       m_zPos = c;    }

    public void InvertX()    {        m_xPos = - m_xPos;     } 

   public void InvertY()  {     m_yPos = - m_yPos;   } 

Page 39: c#basics

   public void InvertZ()  {     m_zPos = - m_zPos;   }

   private float m_xPos = 0;   private float m_yPos = 0;   private float m_zPos = 0;

}

Now, we have a class named Figure and it has three private fields that use to store position and three methods to invert this position by every axis. In main class we declare delegate as follows:

public delegate void FigureDelegate();

And now in the main function we should use it like this: Figure figure = new Figure(10,20,30);FigureDelegate fx = new FigureDelegate(figure.InvertX); FigureDelegate fy = new FigureDelegate(figure.InvertY); FigureDelegate fz = new FigureDelegate(figure.InvertZ); MulticastDelegate f_del = fx+fy+fz;

In this example we create three delegates of FigureDelegate type and attach to these elements our three methods from Figure class. Now every delegate keeps the address of the attached function. The last line of code is very interesting, here we create a delegate of base type (MulticastDelegate) and attach three of our already created delegates. As all our methods are of void return type they are automatically of type MutlticastDelegate and a MulticastDelegate can support multiple methods invocation also. Hence we can write

Figure figure = new Figure(10,20,30); FigureDelegate fMulti = new FigureDelegate(figure.InvertX); fMulti += new FigureDelegate(figure.InvertY); fMulti();

 

Events in C# .Net:

  Delegate usefulness does not just lie in the fact that it can hold the references to functions but in the fact that it can define and use

Page 40: c#basics

function names at runtime and not  at compile time. A large goal of design delegates is their applicability in events model of .Net. Events are the actions of the system on user manipulations (e.g. mouse clicks, key press, timer etc.) or any event triggered by the program. To understand the usage of delegates for event model, the previous examples are used here. We should add to our Figure class next things: 

public delegate void FigureHandler(string msg); public static event FigureHandler Inverted; 

public void InvertZ() {

   m_zPos = - m_zPos;    Inverted("inverted by z-axis"); 

}

   Now we have a delegate declared and event that uses this delegate's type. In every function we should call our event. The next code snippet should explain it clearly:

static void Main(string[] args) { 

   Figure figure = new Figure(10,20,30);   Figure.Inverted+=new Test.Figure.FigureHandler(OnFigureInverted);    figure.InvertX();    figure.InvertZ(); } private static void OnFigureInverted(string msg) {   Console.WriteLine("Figure was {0}",msg); } 

   So, in the main function we should create an object of figure class and attach event handler to the method OnFigureInverted. And when we call any of invert methods the event is fired and it calls our event handler. The application will print the following string into the console: Figure was inverted by x-axis Figure was inverted by z-axis There was simple examples of using delegates and events and should be treated as a starting point to learn it more yourself. Download the C# Delegates source files from the link. To compile and run it need to run .NET

Page 41: c#basics

command line. Just type: csc TestClass.cs. It creates TestClass.exe that can be run as standard executable file.

C# Method Overloading

Last Update: 9 February, 2005

In complex applications written in C#, we may need many methods which do essentially similar functions but are just different enough to be considered unique. For example, we may have to calculate a person's tax liability and would need to implement a method for doing this calculation in our application program. However, there are many different rules when it comes to tax calculations and they vary throughout the world. While there may be many rules, one basic equation stays the same: Your net income equals your gross income minus a computed tax amount. It is the method of computing your tax that varies.

We would probably have to implement different methods for each type of tax calculation. And, we could give each method a unique name such as TaxCalc1, TaxCalc2, TaxCalc3, etc. But wouldn't it be nice to just name the method TaxCalc and pass different arguments to it based on the computation desired? 

For instance, let's say you live in a region within your country where you are taxed on your personal income, the value of your home, and any income you generate by doing business. On sales you generate through business activity, you must pay a gross receipts tax on all sales. If you own your home, you must pay a property tax on the imputed value of it. Then lastly, you must pay a tax on all income you generate through a job with another employer. 

An Example: Tax Calculation

For this article, we will use a hypothetical example of computing various taxes on a person's property, sales, and income. Let's summarize the logical flow through pseudocode:

HV = Home_ValueHR = Home_Tax_RateGS = Gross_SalesGR = Gross_Sales_Tax_RatePI = Personal Income

If YOU_OWN_YOUR_OWN_HOME and DO_NOT_OWN_A_BUSINESS THEN    Tax = TaxCalc(HV,HR)    ' Calculate tax on the home's valueELSE    If  YOU_DO_NOT_OWN_YOUR_OWN_HOME and OWN_A_BUSINESS THEN

Page 42: c#basics

        Tax = TaxCalc(GS,GR)   ' Calculate tax on your gross receipts from sales    ELSE         If YOU_OWN_YOUR_OWN_HOME and OWN_A_BUSINESS THEN            Tax = TaxCalc(HV,HR,GS,GR)   ' Calculate tax on both your home and gross receipts        ENDIF    ENDIFENDIF

Tax = Tax + TaxCalc(PI)   ' And everyone gets a tax calculation on personal income

The pseudo code says that if you own your own home but do not have a business, then you will calculate your tax based on the home's value and the tax rate on a home. If you don't own a home but you own a business then you will calculate your tax based on your gross sales and gross sales tax rate. Finally, if you own a home and a business then you will call TaxCalc and pass all four values. Everyone is run through the TaxCalc method for personal income tax. We don't have to pass a rate for personal income tax calculation because everyone is at a fixed rate which is embedded within the method.

Keep in mind that this example of tax calculation is all hypothetical. Tax codes and calculations, as you know, are much more complex than what is described here throughout the world. But for the sake of this example, we see that we have a method named TaxCalc that is able to take one, two, or four arguments based upon the type of tax we are calculating. Without method overloading, we would have to create a unique method name for each type of calculation we would have to do. We would probably name each TaxCalc1, TaxCalc2, and TaxCalc3 respectively.

How does C# know which method to call? It's easy. It knows which method to invoke based on the number and type of arguments passed to it. This is also referred to as the signature of the method. If C# sees you are calling TaxCalc with four arguments, then it will call that method with four receiving arguments. The same is true for the other two methods as well. 

The Overloaded Methods

Each method is defined as follows in our overloading example:

// This method takes for arguments: two amounts and two ratespublic static double TaxCalc(double pamt1, double prate1, double pamt2,                                                   double prate2){     double taxamt;

Page 43: c#basics

    Console.WriteLine("Using method with 4 arguments");    taxamt = (pamt1 * prate1) + (pamt2 * prate2);    return taxamt;

} // *** TaxCalc ***

// This method only takes two arguments: an amount and a ratepublic static double TaxCalc(double pamt1, double prate1){     double taxamt;    Console.WriteLine("Using method with 2 arguments");    taxamt = pamt1 * prate1;     return taxamt;

} // *** TaxCalc ***

// This method only takes one argument: an amountpublic static double TaxCalc(double pamt){     double taxrate = 0.15;     double taxamt = 0;    Console.WriteLine("Using method with 1 argument");    taxamt = pamt * taxrate;     return taxamt;

} // *** TaxCalc ***

The methods are all very similar however they are differ by the number of arguments used in the tax calculation. If we have two tax rates and two amounts, C# would pick the first method based on four arguments and invoke that. The same holds true for the other two methods.

Caveat

It is important to remember that C# determines which method to call based upon the method's signature. If you were to define two methods with the same name and the same number and type of passed arguments, you would get a compile-time error in Visual Studio .NET of:

Class1.cs(53): Class 'MethodOverload.MainClass' already defines a member called 'TaxCalc' with the same parameter types

However, you can have two methods with the same name and the same number of arguments as long as the argument types differ. Let's say, for instance, that you want to have another one-argument

Page 44: c#basics

method named TaxCalc that takes a string argument. If the string is the literal "TaxTable1", then it will return the tax rate used in personal tax calculations:

// This method only takes one argument as well but it differs// from the above in the argument type.

public static double TaxCalc(string whichtable){     double taxrate = 0;     Console.WriteLine("Calling the method with on string argument");     if (whichtable == "TaxTable1")         taxrate = 0.15;

     return taxrate;

} // *** TaxCalc ***

The Example Program: MethodOverLoad.exe

This article has an example application available for download with the above methods. It is a C#.NET console application and can be invoked from a Dos command window by typing in methodoverload in the folder containing methodoverload.exe. The main driver implements the pseudocode we defined previously:

static void Main(string[] args){     bool ownshome = false;     bool ownsbusiness = false;     string inputs;    double hr = 0;    double hv = 0;    double gr = 0;    double gs = 0;    double pi = 0;    double totaltax = 0;    double pitaxrate = 0;

    Console.WriteLine("Do you own a home? (y/n)");    inputs = Console.ReadLine();

    if (inputs == "y")    {          ownshome = true;

Page 45: c#basics

          Console.WriteLine("What is its value?");          inputs = Console.ReadLine();          hv = Convert.ToDouble(inputs);          Console.WriteLine("What is the home tax rate?");          inputs = Console.ReadLine();          hr = Convert.ToDouble(inputs);     }

     Console.WriteLine("Do you own a business? (y/n)");     inputs = Console.ReadLine();

     if (inputs == "y")     {           ownsbusiness = true;           Console.WriteLine("What was your total sales?");           inputs = Console.ReadLine();           gs = Convert.ToDouble(inputs);           Console.WriteLine("What is the gross sales tax rate?");           inputs = Console.ReadLine();           gr = Convert.ToDouble(inputs);      }

      if (ownshome && !ownsbusiness)      totaltax = TaxCalc(hv, hr);      else          if (!ownshome && ownsbusiness)          totaltax = TaxCalc(gs, gr);          else               if (ownshome && ownsbusiness)                    totaltax = TaxCalc(hv, hr, gs, gr);

       Console.WriteLine("How much did you make last year?");       inputs = Console.ReadLine();       pi = Convert.ToDouble(inputs);       totaltax = totaltax + TaxCalc(pi);       Console.WriteLine("Your total tax is {0}", totaltax);       pitaxrate = TaxCalc("TaxTable1");       Console.WriteLine("Personal tax rate is {0}", pitaxrate);

} // *** Main ***

 

Conclusion

Page 46: c#basics

Method overloading is a powerful concept in C# in that it helps to simplify code reusability and clarity. If our example method of TaxCalc was placed in a .dll file somewhere, I would only have to remember that I have to call TaxCalc and only fill in the appropriate arguments to pass. Without method overloading, I would have to try and remember which specific uniquely-named method to call. This would present a problem if you do not code everyday using a particular method in that time would be spent getting familiar with the methods all over.

Reflection in C#    This article is aimed to explain reflection in .NET Framework.

Reflection is one of the features of .Net framework and has greater importance during the development of large applications. In brief it is a powerful way of collecting and manipulate information present in application's assemblies and its metadata. Metadata contain all the Type information used by the application. The ability to obtain information at runtime also makes it even more advantageous. When reflection is used along with system.type, it allows the developer to get the valuable information about all the types and about the assemblies. We can even create the instances and then invoke various types that are used across the application.

What is Reflection?

 Reflection is the ability to find out information about objects, the application details (assemblies), its metadata at run-time.

  This allows application to collect information about itself and also manipulate on itself. It can be used effectively to find all the types in an assembly and/or dynamically invoke methods in an assembly. This includes information about the type, properties, methods and events of an object and to invoke the methods of object Invoke method can be used too. With reflection we can dynamically create an instance of a type, bind the type to an existing object, or get the type from an existing object and invoke its methods or access its fields and properties. If Attributes (C#) are used in application, then with help of reflection we can access these attributes. It can be even used to emit Intermediate Language code dynamically so that the generated code can be executed directly.

How to use Reflection in our applications?

Page 47: c#basics

System.Reflection namespace contains all the Reflection related classes. These classes are used to get information from any of the class under .NET framework. The Type class is the root of all reflection operations. Type is an abstract base class that acts as means to access metadata though the reflection classes. Using Type object, any information related to methods, implementation details and manipulating information can be obtained. The types include the constructors, methods, fields, properties, and events of a class, along with this the module and the assembly in which these information are present can be accessed and manipulated easily.

As mentioned earlier, we can use reflection to dynamically create an instance of any type, bind the type to an existing object, or get the type from an existing object. Once this is done appropriate method can be invoked, access the fields and properties. This can be done by specifying the Type of object or by specifying both assembly and Type of the object that needs to be created. By this the new object created acts like any other object and associated methods, fields and properties can be easily accessed. With reflection we can also find out about various methods associated with newly created object and how to use these object. To find out the attributes and methods associated with an object we can use the abstract class MemberInfo, this class is available under the namespace System.Reflection.

Understanding Constructors in C#Constructors are used for initializing the members of a class whenever an object is created with the default values for initialization.

If a class is not defined with the constructor then the CLR (Common

Language Runtime) will provide an implicit constructor which is called as Default Constructor.

A class can have any number of constructors provided they vary with the number of arguments that are passed, which is they should have different signatures.

Constructors do not return a value. Constructors can be overloaded.

Page 48: c#basics

If a class is defined with static and Non-static constructors then the privilege will be given to the Non-static constructors.

The following are the access modifiers for constructors,

Public : A constructor that is defined as public will be called whenever a class is instantiated.

Protected : A constructor is defined as protected in such cases where the base class will initialize on its own whenever derived types of it are created.

Private : A constructor is defined as private in such cases whenever a class which contains only static members has to be accessed will avoid the creation of the object for the class.

Internal : An internal constructor can be used to limit concrete implementations of the abstract class to the assembly defining the class. A class containing an internal constructor cannot be instantiated outside of the assembly.

External : When a constructor is declared using an extern modifier, the constructor is said to be an external constructor.

Types of Constructors

i) Static : Used for initializing only the static members of the class. These will be invoked for the very first time the class is being loaded on the memory. They cannot accept any arguments. Static Constructors cannot have any access modifiers.

Syntax ----

Static ClassName(){

//Initialization statements;

}

Page 49: c#basics

ii) Non-Static : are used for initializing the Non-Static and Static members of a class. These will be invoked everytime a new object is defined for a class.

Syntax ---

Public ClassName([argsInfo]){

//Initialization statements;

}

Example :

Using System;

Class SampleConstructor{

    public static int s;

    public int ns;

    static SampleConstructor()    {

       s = 10;

      //ns = 20; --- Error cannot be assigned like this

    }

    public SampleConstructor()   {

      ns=100;

      s=200;

    }

Page 50: c#basics

}

Class UseSampleConstructor{

    public static void Main()    {

        SampleConstructor sc = new SampleConstructor();

        Console.WriteLine(“{0},{1}â€,� sc.s, SampleConstructor.s, sc.ns);

    } l

} l

Error(Cannot call like this)

If you observe in the above example the static variable `ns' cannot be assigned a value in the static Constructor as it is a Non-static member of the class and a static constructor cannot initialize a Non-Static member.

Also as you see in the above code the Non-static constructor initializing the values for both the static and Non-Static members of class, when we say `sc' we are creating an object for the class and using the object we do the call the methods, it is not valid to call a static member of class using the object of the class we have to call it through the method name/Constructor name through the member will be invoked.

Methods help you to separate code into modules that perform a given task. Every program or application have a starting entry point to there application that decide the path execution and all. We already come across different application where the starting point or entry point is main ( ) method. Methods provide the flexibility where we can separate the code into modules. This will make easy understanding of code, more reusability and increase performance. The method can pass parameters to another method and return the value that is optional. If the method contains “void” keyword, this means method will not return any thing.

 

Page 51: c#basics

Syntax:

 

access specifier return-type methodname (parameter list) {

//Statement

}

 

Method Chaining:- The method chaining is the process by which one method calls another method. The caller method can pass parameters to the called method and in return the called method return some value (this is optional).

 

 

Example

 

The following example will demonstrate the method concepts along with the method chaining.

 

using System;

using System.Collections.Generic;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

Page 52: c#basics

{

  static class Program

    {

    /// <summary>

    /// The main entry point for the application.

    /// </summary>

        [ STAThread ]

    static void Main ()

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault( false );

            Application.Run( new Form1 ());

        }

    }

}

 

Page 53: c#basics

 

Method Chaining: Here we can add two values to the form and User can select the options i.e. 1 Add, 2 Subtract, 3 Multiply and 4 Divide. And result will be displayed when the user click Execute.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

Page 54: c#basics

{

 public partial class Form4 : Form

  {

  public Form4()

    {

        InitializeComponent();

    }

  private void Form4_Load( object sender, EventArgs e)

    {

        lblEnter.Text = "" ;

        lblEnter.Text = lblEnter.Text + "Enter 1 to Add" + "\n" ;

        lblEnter.Text = lblEnter.Text + "Enter 2 to Sub" + "\n" ;

        lblEnter.Text = lblEnter.Text + "Enter 3 to Multiply" +  "\n" ;

        lblEnter.Text = lblEnter.Text + "Enter 4 to Divide" + "\n" ;

    }

  private void btnExecute_Click( object sender, EventArgs e)

    {

        int _valDec = Int32 .Parse(txtdecision.Text);

        int _firstVal = Int32 .Parse(textBox1.Text);

        int _secondVal = Int32 .Parse(textBox2.Text);

Page 55: c#basics

      switch (_valDec)

        {

      case 1: fxadd(_firstVal, _secondVal); break ;

      case 2: fxsubtract(_firstVal, _secondVal); break ;

      case 3: fxmultiply(_firstVal, _secondVal); break ;

      case 4: fxdivide(_firstVal, _secondVal); break ;

            default :

        MessageBox .Show( "Please Enter Specified Value.." );

        break ;

        }

    }

 

  void fxadd( int firstarg, int secondarg) {

        int _add = firstarg + secondarg;

        txtResult.Text = _add.ToString();

    }

  void fxsubtract( int firstarg, int secondarg) {

        int _sub = (firstarg - secondarg);

        txtResult.Text = _sub.ToString();

    }

Page 56: c#basics

  void fxmultiply( int firstarg, int secondarg){

        int _mul = firstarg * secondarg;

        txtResult.Text = _mul.ToString();

    }

  void fxdivide( int firstarg, int secondarg){

        int _div = firstarg / secondarg;

        txtResult.Text = _div.ToString();

    }

  }

}

 

Output

 

Page 57: c#basics

Namespaces are C# program elements that are used for logical grouping of the classes. They also provide assistance in avoiding name clashes between two sets of codes. Namespaces doesn't corresponds to file or directory names. The using directives e.g.

Using System;

This contains number of classes, by including this namespace we can access those classes that are there in the System namespace.

 

Example:- Demonstrate Namespace

 

Page 58: c#basics

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Test = rootnamespace.firstlevelnamespace;

 

namespace cSHARPEXAMPLES

{

 public partial class Form5 : Form

Page 59: c#basics

  {

  public Form5()

    {

        InitializeComponent();

    }

  private void button1_Click( object sender, EventArgs e)

    {

        rootnamespace.firstlevelnamespace. TestDemo .fxTest();

        rootnamespace.firstlevelnamespace. TestDemo11 .fxDisplay();

        Test. TestDemo11 .fxDisplay();

    }

  private void button2_Click( object sender, EventArgs e)

    {

        secondnamespace.firstlevelnamespace. TestDemo1 .fxTest1();

        secondnamespace.firstlevelnamespace. TestDemo1 .fxTest();

    }

  }

}

 

namespace rootnamespace

Page 60: c#basics

{

 // nested namespace

 namespace firstlevelnamespace

 {

  class TestDemo

   {

  public static void fxTest()

    {

    MessageBox .Show( "Fire UP rootnamespace " );

    }

  }

 class TestDemo11

  {

  public static void fxDisplay()

    {

    MessageBox .Show( "Display under rootnamespace " );

    }

  }

}

}

Page 61: c#basics

 

namespace secondnamespace

{

// nested namespace

namespace firstlevelnamespace

{

 class TestDemo1

 {

 public static void fxTest1()

 {

    MessageBox .Show( "Fire UP secondnamespace" );

  }

 public static void fxTest()

  {

    MessageBox .Show( "Fire UP secondnamespace.firstlevelnamespace.fxTest" );

   }

 }

}

}

 

Page 62: c#basics

Example Explanation:

 

In above example we have 3 namespaces i.e. cSHARPEXAMPLES, rootnamespace, secondnamespace.Rootnamespace contains irstlevelnamespace namespace,2 classes i.e TestDemo, TestDemo11 and these classes contains methods i.e. fxTest(),fxDisplay(). Secondnamespace contains nested namespace i.e. firstlevelnamespace, 1 class i.e. TestDemo1 and the class contains methods i.e fxTest1(),fxTest().

Classes are the core of OOP's. Classes are declared by using the keyword classes. Classes contain data members that represent the class. We can create object of the class, objects are entities and we can create as many number of objects of a given class.

 

Syntax:

Class classname {

//Variable declaration

// Method declaration

}

 

Classes can contain the following entities inside its declaration:

Constructors

Destructors

Page 63: c#basics

Fields

Methods

Properties

Indexers

Delegates

Events

Nested Classes.

 

Constructors:- Constructors are called or initialized automatically whenever an object of the class is created. The purpose of the constructors is to initialize the class members whenever an object of the class is created.

Constructor name is same as of class name.

Constructor doesn't return any value, nor even void

Constructor initialize the class members at the time of its creation

There are different types of constructor:

Page 64: c#basics

Default Constructor

Parameterized Constructor

Copy Constructor

 

Destructor:- Destructor is used to deallocate any memory that is allocated to the object at the time of its creation. Destructor is used for memory management and avoids any memory leaks that occur in the case of reference variables that store on heap memory.

Destructor keeps tracks of all the unwanted and unused memory and frees it when we are not using it.

In .net the memory management is automatically done through GC i.e. garbage collection, this is responsible for deallocation of memory.

The reference variable memory allocated on heap and here the job of GC comes into picture, it will deallocate the memory that is not in used.

The value type variables allocated memory on stack, here the variable doesn't require any GC, they just fall from the stack if there are not in used.

 

Page 65: c#basics

Example: Demonstrate Constructor, Destructor and used of Static method .

 

 

 

TestDemo.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

  public class TestDemo

Page 66: c#basics

    {

      String str;

    static String str2 = "default" ;

    public TestDemo() {

    //Constructor

        str = "Hi" ;

        }

    public TestDemo( String strdefault) {

    //Parameterized Constructor

        str = strdefault;

        }

    public String display(){

      return str;

        }

    public static String staticfx() {

      return str2 + " This comes from Static fx" ;

        }

        ~TestDemo() {

    // Clean Up Code Here.

        }

Page 67: c#basics

    }

}

 

Form6.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

  public partial class Form6 : Form

    {

      public Form6()

            {

              InitializeComponent();

Page 68: c#basics

            }

      private void button1_Click( object sender, EventArgs e)

            { //Calling Default Constructor

                TestDemo obj = new TestDemo ();

        MessageBox .Show( "default Constructor :: " + obj.display());

            }

      private void button2_Click( object sender, EventArgs e)

            { //Calling Parameterized Constructor

                TestDemo obj1 = new TestDemo ( "Vikrant" );

        MessageBox .Show( "Parameterized Constructor :: " + obj1.display());

            }

      private void button3_Click( object sender, EventArgs e)

            { //Calling Static method of the class

          MessageBox .Show( "Static method :: " + TestDemo .staticfx());

            }

        }

}

 

Output:

 

Page 69: c#basics

Click on: Default Constructor Button

 

 

 

 

 

Click on: Parameterized Constructor Button

 

 

Click on: Static method Button

Page 70: c#basics

Inheritance is one of the primary concepts of object-oriented programming. Inheritance is the process by which we can inherits the properties or methods of one class into the other class. The concept behind inheritance, take the base class that contains methods and properties and inherits it into the derived class, that now contains all the members and properties of the base class as well as its own newly added members or properties. The following are the advantages of Inheritance:-

Reuse the existence code

Save time, we need not do the code verification and testing.

Here, we can add and modify the methods of the existing class.

Help in modularization of code.

Types of Inheritance:

 

The following are the types of inheritance exist in C# programming.

 

Single Inheritance:

Here we have single base class that is inherited by the derived class. Here the derived class has all the features of the base class and can add new features or modify existing features. The inheritance also depends on the access specifier that is used at the time of base class inheritance.

 

Multi-level Inheritance:

Page 71: c#basics

In the multi-level inheritance, here we having a chain of inheritance i.e. the base class A is inherited by derived class B, and it is further inherited by another derived class C. So, the feature we have in base class A, is also there in Derived class B, and all the combination features of class A and class B are there in derived class C.

 

Multiple Inheritance:

In C#, we don't have multiple inheritance where one class can inherit two base classes. So, the multiple inheritance can be done by using the concept of interfaces. Here one class can inherit one class and can implements more than one interface.

 

Hybrid Inheritance:

The hybrid inheritance can also be done through with the help of interface. Here the derived class cans implements more than two interfaces and only one class.

 

Example: Demonstrate Inheritance

 

Page 72: c#basics

 

DerivedClass7.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

 public class parentClass7

 {

    String str = "Parent:::" ;

    public parentClass7() {

        str = "Parent Constructor" ;

Page 73: c#basics

    }

  public String display() {

     return str;

    }

  public String Show() {

    return "Base Show" ;

    }

 }

 public class DerivedClass7 : parentClass7

 {

    String testStr = "Derived::" ;

  public DerivedClass7() {

        testStr = "Derived Constructor" ;

    }

  public String display1() {

    return testStr;

    }

  public String Show1()

    {

    return base.Show();

Page 74: c#basics

    }

 }

}

 

Form7.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

 public partial class Form7 : Form

 {

    public Form7()

        {

Page 75: c#basics

            InitializeComponent();

        }

    private void button1_Click( object sender, EventArgs e)

        {

            DerivedClass7 obj = new DerivedClass7 ();

      MessageBox.Show( "Call to Parent Method :: " + obj.display());

      MessageBox.Show( "Call to Derived Method :: " + obj.display1());

        }

    private void button2_Click( object sender, EventArgs e)

        {

            DerivedClass7 obj = new DerivedClass7 ();

      MessageBox.Show( "Call in Derived method that further call Base method ===>" +         obj.Show1());

        }

    }

}

 

OutPut:

 

When User Clicks On :Simple Inheritance Button

Page 76: c#basics

 

 

 

When User Clicks On :Calling Base Method in Derived Method Button

 

Polymorphism is the core concept of OOP's. Polymorphism means one name many forms.

 

Types of polymorphism

1. Compile Time Polymorphism

Page 77: c#basics

2. Run Time Polymorphism

 

Compile Time Polymorphism

The compile time polymorphism, here the polymorphism is implemented during compile time, that means at the time of compilation the compiler knows where to bind the method. The compile time polymorphism can be implemented through:

Method Overloading

Operator Overloading

 

Method Overloading:

In complex applications written in C#, we may need many methods which do essentially similar functions but are just different enough to be considered unique. So, we can define method overloading as if two or three method in a class has same name but they differ by number of arguments or type of argument.

 

Operator Overloading:

This provides a meaningful understanding of the operation by using operator overloading. Here what we did is we overload an operator and change its meaning, so that a valuable information is send to the programmer and this help in reducing the complexity.

Page 78: c#basics

E.g.

If we need to add two matrix of 3X3

Matrix result = Matrix.Add(mat1, mat2); // this doesn't give any relevant information

 

Run Time Polymorphism

The run time polymorphism, here the compiler doesn't know which method to call at runtime. Here we can call the derived method through base class pointer at runtime. The run time polymorphism can be implemented through: Virtual – Override Keyword.

 

Vitual function:

The virtual function is used to implement runtime polymorphism; here we have same name method in the base class as well as in the derived class. We can access the derived method using the base pointer. The virtual keyword should be write in front of the base class method and in the derived class we have to write override in front of the method. For Example:-

 

Class BaseClass {

Virtual void display () {//statements}

}

Class DerivedClass {

Override void display () {//statements}

}

Page 79: c#basics

 

Example: Demonstrate Polymorphism

 

 

BaseClass8.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

Page 80: c#basics

{

 class BaseClass8

  {

    String str = "Base" ;

  public BaseClass8() { }

  public String display() {

    return str + ": BaseClass Display" ;

    }

  public virtual String show() {

    return str + ": BaseClass Show" ;

    }

  }

}

DerivedClass8.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

Page 81: c#basics

{

 class DerivedClass8 : BaseClass8

 {

    String str = "Derived" ;

  public DerivedClass8() { }

  public new String display() { //NEW KEYWORD is USE TO HIDE THE

    //SAME METHOD IN TH BASE CLASS

    return str + ": Display Derived" ;

    }

  public override String show() { //OVERRIDE KEYWORD IS USED IF

    //THE METHOD IN THE BASE CLASS IS VIRTUAL

    return str + ": SHOW Derived:" ;

    }

  }

}

 

Form8.cs

 

 

using System;

Page 82: c#basics

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

 public partial class Form8 : Form

  {

  public Form8()

    {

        InitializeComponent();

    }   

  private void button1_Click( object sender, EventArgs e)

    { //Virtual: Polymorphism at RunTime

        BaseClass8 objBase = new DerivedClass8 ();

        label5.Text = objBase.display();

        label6.Text = objBase.show();

Page 83: c#basics

    }

  private void button2_Click( object sender, EventArgs e)

    {

        BaseClass8 objBase = new BaseClass8 ();

        label1.Text = objBase.display();

        label2.Text = objBase.show();

    }

  private void button3_Click( object sender, EventArgs e)

    {

        DerivedClass8 objDer = new DerivedClass8 ();

        label3.Text = objDer.display();

        label4.Text = objDer.show();

    }

  }

}

 

Output

 

Page 84: c#basics

Properties are used to protect the field in a class by reading and writing it through the property. Here the field consists of one getter and one setter that are associated with a given field. We can access this field through this getter/setter combination.

 

Two ways to declare property in the class

 

1. One way to declare:

class PropertyDemo {

private String name; //Declare a field

Page 85: c#basics

public String getName() { //Getter

return name;

}

public void setName( String Value) {//Setter

name = value;

}

}

2.

Another way to declare:

class PropertyDemo {

private String name; //Declare a field

Page 86: c#basics

 

public String Name{

 

get{ return name;} //Getter

set{ name = value;} // Setter

}

}

 Read-Only property:

We can declare a property as read-only; by only have its getter. So that the user can't set the value of the field, because there is no setter for the field. Hence we restrict the user to change the value of the field at any given time.

 

Write-Only property:

Page 87: c#basics

We can declare a property as write-only, by only have its setter. Here the user can't access the value that is there in the field. We can manipulate the value of the field by using its setter, but we can't get the value of this field.

 

Example: Demonstarte propery, Read-Only Property, Write Only Property.

 

 

 

ClsProperty9.cs

 

using System;

usingusing System.Collections.Generic;

using System.Text;

 

Page 88: c#basics

namespace cSHARPEXAMPLES

{

 class ClsProperty9

  {

  private int age;

  private String name;

  private String lastName = "Dogra" ;

  private String address;

  public int getAge() {

    return age;

    }

  public void setAge( int Value) {

        age = Value;

    }

  public String getName()

    {

    return name;

    }

  public void setName( String Value)

    {

Page 89: c#basics

    name = Value;

    }

    //Read-Only property:Only Getter

  public String getLastName()

    {

    return lastName;

    }

    //Write-Only Property: Only Setter

  public void setAddress( String Value)

    {

        address = Value;

    }

  public String displayAddress()

    {

    return address;

    }

  }

}

 

Form9.cs

Page 90: c#basics

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

 public partial class Form9 : Form

  {

    ClsProperty9 obj = new ClsProperty9 ();

  public Form9()

    {

        InitializeComponent();

    }

  private void button1_Click( object sender, EventArgs e)

    { //Setters Calls

Page 91: c#basics

        obj.setAge( Int16 .Parse(textBox1.Text));

        obj.setName(textBox2.Text);

        obj.setAddress( " Chandigarh " ); //Write Only Property

    }

  private void button2_Click( object sender, EventArgs e)

    { //Getters Calls

    MessageBox .Show( "Name: " + obj.getName());

    MessageBox .Show( "Age: " + obj.getAge());

    MessageBox .Show( "Last Name: " + obj.getLastName()); //Read

    //Only property

    MessageBox .Show( "Address: " + obj.displayAddress());

    }

  }

}

 

Output:

 

Page 92: c#basics

 

Click On: Set the Value

This will set the values in the class fields i.e. name, address

 

Click On: Get the Value

This will display the values that are set by the setters.

First value that we get is the name.

Second is the age value.

Page 93: c#basics

This field only has getter associated to it.

 

This field only has setter associated with it, we can

If properties are 'virtual fields', indexers are more like 'virtual arrays' . They allow a class to emulate an array, where the elements of this array are actually dynamically generated by function calls. They allow a class to be used just like an array. On the inside of a class, you manage a collection of values any way you want. These objects could be a finite set of class members, another array, or some complex data structure. The following are the advantages of the Indexers.

Regardless of the internal implementation of the class, its data can be obtained consistently through the use of indexers.

Indexers aren't differentiated by name, and a class cannot declare two indexers with the same signature. However, this does not entail that a class is limited to just one indexer. Different indexers can have different types and numbers of indexing elements (these being equivalent to method parameters, except that each indexer must have at least one indexing element, and the 'ref' and 'out' modifiers cannot be used).

Example: Demonstrate Indexers

Page 94: c#basics

 

ClsIndexers10.cs

 

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

  class ClsIndexers10

    {

    private String [] arrString;

    private int arrSize;

 

Page 95: c#basics

    public ClsIndexers10( int sizeofArray) { //Constructor

            arrSize = sizeofArray;

            arrString = new String [arrSize];

      for ( int i=0;i<arrSize;i++){

            arrString[i] = "No Value" ;

        }

    }

 

    public string this [ int indexValue]

        {

            get {

          return arrString[indexValue];

            }

            set {

                    arrString[indexValue] = value ;

            }

        }

    public string [] this [ string data]

        {

            get {

Page 96: c#basics

          for ( int i = 0; i < arrSize; i++)

                    {

            if (arrString[i] == data)

                        {

                            arrString[i] = "Hi" ;

                        }

                    }

          return arrString;

                }

                set

                {

            for ( int i = 0; i < arrSize; i++)

                        {

              if (arrString[i] == data)

                            {

                                arrString[i] = "Hi" ;

                            }

                        }

                }

        }

Page 97: c#basics

    }

}

 

Form10.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

 public partial class Form10 : Form

 {

  static int arrSize = 10;

    ClsIndexers10 obj = new ClsIndexers10 (arrSize);

    public Form10()

Page 98: c#basics

    {

      InitializeComponent();

    }

  private void button1_Click( object sender, EventArgs e)

    { //Indexers Implementation : Using Integer

        label1.Text = "" ;

        obj[2] = "HHHI" ;

        obj[5] = "Vikrant" ;

        obj[9] = "Amit" ;

    for ( int i = 0; i < arrSize; i++)

        {

            label1.Text = label1.Text + "Indexer at " + i + obj[i] + "\n" ;

        }

    }

  private void button2_Click( object sender, EventArgs e)

    { //Indexers Implementation : Using String

        label1.Text = "" ;

        String [] arrString = obj[ "No Value" ];

    for ( int i = 0; i < arrString.Length; i++)

        {

Page 99: c#basics

            label1.Text = label1.Text + "Indexer at " + i + obj[i] + "\n" ;

        }

    }

 }

}

 

Output:

 

Click On: Indexer Implementation

 

Click On: Indexer – With String

 

Page 100: c#basics

Structs is value-type user defined data type same as int, float, bool etc.

Structs features:

structs are value-type

In structs memory allocation can be done on stack.

No garbage collector required to remove structs variable because as they are value type, the memory allocated is on stack and so no memory allocated on heap, when structs variable are not in used they just fall from the stack.

Structs can't have destructors.

Page 101: c#basics

Structs can't inherit another class or structs. This means there is no concept of inheritance in structs.

Structs may inherit multiple interfaces. Interface is a reference type and any class or structs that implements interface must override all the methods that are there in the interface.

 

 

Example: Demonstrate Structs

 

 

 

ClsStruct11.cs

 

 

Page 102: c#basics

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

  interface ITest

  {

    string Test();

  }

 

  struct Rectangle : ITest

  {

  public int length;

  public int breath;

  public int height;

  public Rectangle( int length, int breath, int height)

    {

        this .length = length;

        this .breath = breath;

Page 103: c#basics

        this .height = height;

    }

  public Rectangle Add( Rectangle rect)

    {

        Rectangle newRect;

        newRect.length = length + rect.length;

        newRect.breath = breath + rect.breath;

        newRect.height = height + rect.height;

    return newRect;

    }

  public string Test()

    {

    return "Implements Interface in structs" ;

    }

}

 

class ClsStruct11

{

public String display()

{

Page 104: c#basics

    Rectangle rect1 = new Rectangle (10, 20, 30);

    Rectangle rect2 = new Rectangle (110, 120, 130);

    Rectangle rect3;

    rect3 = rect1.Add(rect2);

  return "Length :: " + rect3.length + "\n Breadth :: " + rect3.breath + "\n Height :: " +   rect3.height;

    }

 

  public string print()

    {

    Rectangle rect1 = new Rectangle (10, 20, 30);

  return rect1.Test();

    }

  }

}

 

Form11.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

Page 105: c#basics

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

public partial class Form11 : Form

{

public Form11()

{

    InitializeComponent();

}

 

private void button1_Click( object sender, EventArgs e)

{ // Structs Implementation

    label1.Text = "" ;

    ClsStruct11 obj = new ClsStruct11 ();

    label1.Text = obj.display();

}

Page 106: c#basics

 

private void button2_Click( object sender, EventArgs e)

{ // Structs Implementing Interface

    label2.Text = "" ;

    ClsStruct11 obj = new ClsStruct11 ();

    label2.Text = obj.print();

 }

}

}

 

Output:

 

Clicking On Both the Buttons: The concept behind the structs will be executed and displayed.

 

Page 107: c#basics

An interface looks like a class, but has no implementation. An interface is a C# reference type with members that do not have implementations. Interfaces only have method signatures. The following are the properties of the interfaces:-

It contains definitions of events , indexers , methods and/or properties .

The reason interfaces only provide definitions is because they are inherited by classes and structs , which must provide an implementation for each interface member defined.

Interfaces are like protocol or standard that needs to be maintained by the classes or structs that are implementing that interface.

We can have final variables and abstract methods in interface. This means the classes or structs that are implementing interfaces need to provide the body for all the methods that are there in interfaces.

No need to provide the access specifier for method that is there in interface, all the methods are public.

Page 108: c#basics

We have the concept of inheritance in interface. One interface can extends another interface.

Syntax:

Interface InterfaceName {

// method signature

}

 

Class implementing the Interfaces.

 

Class clsTest: ITestInterface

{

// method defined here

}

 

Structs Implementing Interface.

struct strTest: IstructsInterface

{

// method defined here

}

Page 109: c#basics

 

Interfaces may inherit other interfaces.

 

 

Example: Demonstrate Interfaces

 

 

 

ClsInterface12.cs

 

 

using System;

using System.Collections.Generic;

using System.Text;

Page 110: c#basics

 

namespace cSHARPEXAMPLES

{

 interface IParentInterace

  {

    String display();

   }

 interface IChildInterface : IParentInterace

  {

    String Show();

  }

 class ClsInterface12 : IChildInterface

  {

    String str = "Hi" ;

  public ClsInterface12( String pStr) {

    str = pStr;

    }

  public String Test() {

    return str;

    }

Page 111: c#basics

  public String display()

    {

    return str + " : Display Of Base Interface" ;

    }

  public String Show()

    {

    return str + " : Show Of Child Interface" ;

    }

  }

}

 

Form12.cs

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

Page 112: c#basics

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

 public partial class Form12 : Form

 {

  public Form12()

    {

      InitializeComponent();

    }

  private void button1_Click( object sender, EventArgs e)

    {

        ClsInterface12 obj = new ClsInterface12 ( "Hello" );

        label1.Text = obj.Test();

        label2.Text = obj.display();

        label3.Text = obj.Show();

    }

  private void Form12_Load( object sender, EventArgs e)

    {

        label1.Text = "" ;

Page 113: c#basics

        label2.Text = "" ;

        label3.Text = "" ;

    }

  }

}

 

Output:

 

Click On: Interface Executed Button

 

 

A delegate in C# language allows us to reference a method. The other way to say this delegate is a function pointer. The function pointer is same as we have pointer to an address now in this case we have pointer to a method address. There are two types of delegates :-

Page 114: c#basics

Single-Cast Delegate:- Here the delegate will refer to or point to single method or we can Say that the pointer is to single method from the delegate.

Multi-Cast Delegate:-In the multi-cast delegate, the delegate refer to or point to more than One method at runtime.

Delegates features:

Delegate is a function pointer.

Delegate declaration is same as method declaration, except they have delegate modifier in front of it.

The method that a delegate refers or pointing to must have same signature as of delegate method.

To use a delegate, we have to create the instance of the delegate and pass the method that it is pointing too or referring to.

Invoke (), This method can be used to invoke the delegate.

The delegates can be declared by adding a delegate keyword in front of any method. For Example- delegate void Mydelegate();

 

Note:- This is declaration of the delegate and it specifies the method signature that it is pointing or referring. This means the signature of the

Page 115: c#basics

method that a delegate pointing has no parameter and will not return any thing. But this is an example and we can say the delegate can refer to any type of method.

 

Example: Demonstrate Delegates

 

 

 

ClsDelegate13.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

Page 116: c#basics

  class ClsDelegate13

    {

    delegate void Mydelegate ();

    static String str = "" ;

    static String sd = "" ;

    public String singlecastfx()

        {

          sd = "" ;

          sd = "Single Cast Delegate ==> " ;

          Mydelegate d = null ;

          d += new Mydelegate (singlecastdelegatefx);

          d.Invoke();

          sd = sd + " :: appender" ;

    return sd;

        }

    public String multicastfx() {

          str = "" ;

          str = "starting Value ==> " ;

          Mydelegate d = null ;

          d += new Mydelegate (firstfx);

Page 117: c#basics

          d += new Mydelegate (secondfx);

          d();

          str = str + " :: appender" ;

      return str;

          }

    public void firstfx()

        {

          str = str + " :: firstfx" ;

        }

    public void secondfx()

        {

          str = str + " :: secondfx" ;

        }

    public void singlecastdelegatefx()

        {

          sd = sd + " ::singlecastdelegatefx" ;

        }

    }

}

 

Page 118: c#basics

Form13.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

public partial class Form13 : Form

{

  public Form13()

    {

        InitializeComponent();

    }

  private void button1_Click( object sender, EventArgs e)

    { //Multi-cast delegate

Page 119: c#basics

      ClsDelegate13 objDelegate = new ClsDelegate13 ();

    MessageBox .Show(objDelegate.multicastfx());

    }

 

  private void button2_Click( object sender, EventArgs e)

    { //Single-cast delegate

      ClsDelegate13 objDelegate = new ClsDelegate13 ();

    MessageBox .Show(objDelegate.singlecastfx());

    }

  }

}

 

 

Output:

 

Clicking On: Single-cast Delegate Button

 

 

Page 120: c#basics

 

Clicking On: Mutil-cast Delegate Button

 

Exceptions are unforeseen errors that happen in your programs. Programmers always detect and most of the time writes correct code to avoid all the errors or exceptions that can distract the execution of the code and cause unwanted results.

 

However, there are times when you don't know if an error will occur. For example, you can't predict when you'll receive a file I/O error, run out of system memory, or encounter a database error. These things are generally unlikely, but they could still happen and you want to be able to deal with them when they do occur. This is where exception handling comes in. When exceptions occur, they are said to be "thrown". What is actually thrown is an object that is derived from the “S ystem. Exception” class

 

Try/catch and Finally Block:

 

Page 121: c#basics

This is a way we can handle exceptions in C#.

Try Block:- In this block, we include all the suspected code. This means the code that is most likely to cause exception.

Catch Block:- In this block we include all handlers that will be take care of exception that occurs. We can have number of catch blocks associated to single try block.

Finally Block : The finally block contains the cleanup code that we needed whether the code is succeed or not. Most of the time we write a code that will deal locate the memory that we associated in the beginning like memory allocated to connection object.

Example: Exception Handling

 

 

 

 

Page 122: c#basics

Form14.cs

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

 

namespace cSHARPEXAMPLES

{

  public partial class Form14 : Form

   {

    public Form14()

        {

            InitializeComponent();

        }

Page 123: c#basics

 

    private void button1_Click( object sender, EventArgs e)

        { //Simple Try/Catch Block

            int dividebyZero = 0;

            int a = 20;

            int b = 0;

      try

            {

                dividebyZero = (a / b);

            }catch ( DivideByZeroException ex)

            {

        MessageBox .Show( "2nd EXCEPTION :: " + ex.ToString());

            }catch ( Exception ex) {

        MessageBox .Show( "EXCEPTION :: " +ex.ToString());

            }

        }

 

    private void button2_Click( object sender, EventArgs e)

        { //Try,Catch and Finally Block

            FileStream outputStream = null ;

Page 124: c#basics

            FileStream inputStream = null ;

      try {

                outputStream = File.OpenWrite( "DestinationFile.txt" );

                inputStream = File.OpenRead( "BogusInputFile.txt" );

            }catch ( Exception ex) {

        MessageBox .Show(ex.ToString());

            }finally {

        if (outputStream != null ) {

                outputStream.Close();

        MessageBox .Show( "OutputStream Closed." );

                }

        if (inputStream != null ) {

                   inputStream.Close();

         MessageBox .Show( "InputStream Closed." );

                }

            }

        }

    }

}

 

Page 125: c#basics

Output:

 

Click On: Simple Try/catch Block Button

 

Click On: Try/catch and Finally Block Button

 

 

Page 126: c#basics

Attributes are elements that allow you to add declarative information to your programs. This declarative information is used for various purposes during runtime and can be used at design time by application development tools. Attributes are also used extensively in securing .NET assemblies, forcing calling code to be evaluated against pre-defined security constraints. Attribute declared using the ‘[‘and ‘]' brackets before any type declaration.

 

The following are the advantages the attributes provide:

Declarative information to your program

This information can be used at runtime or at compile time by programmers.

DllImportAttribute: This attribute provide information to communicate with the Win32 libraries.

ObsoleteAttribute: This provides compile time information to the developer that this method is now deprecated.

Attribute add what is called metadata to your program.

Attributes are classes that can be written in C# and used to decorate your code with declarative information.

Many attributes have parameter lists that allow inclusion of additional information that customizes a program even further.

Examples of Attributes:-

Page 127: c#basics

 

[ Obsolete ]

public String firstDeprecatedFX(){}

[ ObsoleteAttribute ]

public String secondDeprecatedFX(){}

Obsolete ( "Don't Use This Method." )]

public String thirdDeprecatedFX()

[ STAThread ]

static void Main () {}

 

Note:- This attribute declare that this is the entry point for the application. This indicates that C# program should communicate with unmanaged COM code using the single threading apartment. The parameter provide additional information about the attribute

 

Example To Demonstrate Attributes

 

The following is the screen appeared when run the form 15 program in the source.

 

 

Page 128: c#basics

 

 

ClsAttribute15.cs

 

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

  class ClsAttribute15

    {

    [ Obsolete ]

    public String firstDeprecatedFX()

        {

Page 129: c#basics

      return "Call firstDeprecatedFX" ;

        }

 

    [ ObsoleteAttribute ]

    public String secondDeprecatedFX()

        {

      return "Call secondDeprecatedFX" ;

        }

 

    [ Obsolete ( "Don't Use This Method." )]

    public String thirdDeprecatedFX()

        {

      return "Call thirdDeprecatedFX" ;

        }

 

    }

}

 

 

Form15.cs

Page 130: c#basics

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

  public partial class Form15 : Form

    {

    public Form15()

        {

          InitializeComponent();

        }

    private void button1_Click( object sender, EventArgs e)

        { //Attribute : use to create method deprecated

            ClsAttribute15 obj = new ClsAttribute15 ();

Page 131: c#basics

      obj.firstDeprecatedFX();

      //Deprecated Methods

      obj.secondDeprecatedFX();

      MessageBox .Show(obj.thirdDeprecatedFX());

            }

      }

}

 

 

Output:

 

Clicking On: Attribute fire up Button

 

An enumeration is a special kind of value type limited to a restricted and unchangeable set of numerical values. Enums are strongly typed constants. They are essentially unique types that allow you to assign symbolic names to integral values.

 

Page 132: c#basics

Advantages of Enums:-

In the C# tradition, they are strongly typed, meaning that an enum of one type may not be implicitly assigned to an enum of another type even though the underlying value of their members are the same.

By default, these numerical values are integers, but they can also be longs, Bytes, etc.

When you define an enumeration you provide literals which are then used as Constants for their corresponding values.

Values specified in enumeration are static.

These values are final and you can't change the value at runtime.

The System.Enum BCL type is the base class of enum types and contains methods that allow you to work with enums in different ways, such as working with a list of names or values, converting from value to name, and converting from name to value.

 

Syntax

enum enumname { //values}

Example:-

enum DayOfWeek {

Monday=2,

Page 133: c#basics

Tuesday,

Wednesday,

Thursday=10,

Friday,

Saturday,

Sunday

}

Note:-

The first literal, is unassigned then it value is set to 0.

For any other literal, if the value is unassigned then the value set is greater than the value of the preceding literal.

By this the value of Monday is set to 0 and the value of Sunday is 6.

We can also specify the value to the literal in the enums.

Note:- Here the value will be Monday-2, Tuesday-3, Wednesday-4 and Thursday-10, Friday-11, Saturday-12, Sunday-13.

 

Example: Demonstrate Enums

 

Page 134: c#basics

 

 

 

ClsEnum16.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

 enum DayOfWeek {

    Monday,

    Tuesday,

Page 135: c#basics

    Wednesday,

    Thursday,

    Friday,

    Saturday,

    Sunday

    }

 enum ValuesEnum : byte

  {

    One = 1,

    two,

    three=5,

    four,

    five

  }

 

class ClsEnum16

{

    public String GetvalueEnteredByUser( int enteredValue) {

    //user entered value

        ValuesEnum valuesEnum = ( ValuesEnum )enteredValue;

Page 136: c#basics

        String str = "" ;

    switch (valuesEnum)

        {

        case ValuesEnum .One: str = "FIRST" ;

            break ;

        case ValuesEnum .two: str = "SECOND" ;

            break ;

        case ValuesEnum .three: str = "THIRD" ;

            break ;

        case ValuesEnum .four: str = "FOURTH" ;

            break ;

        case ValuesEnum .five: str = "FIFTH" ;

            break ;

        default : str = "default" ; break ;

        }

    return str;

    }

 

    public String CreateAndUseEnumType(){

        DayOfWeek dayofWeek = DayOfWeek .Thursday;

Page 137: c#basics

    //DayOfWeek dayofWeek = (DayOfWeek)4;

        String strDay = "" ;

    switch (dayofWeek)

        {

        case DayOfWeek .Monday:  strDay = "Monday" ;

            break ;

        case DayOfWeek .Tuesday:  strDay = "Tuesday" ;

            break ;

        case DayOfWeek .Wednesday: strDay = "Wednesday" ;

            break ;

        case DayOfWeek .Thursday: strDay = "Thursday" ;

            break ;

        case DayOfWeek .Friday: strDay = "Friday" ;

            break ;

        case DayOfWeek .Saturday: strDay = "Saturday" ;

            break ;

        case DayOfWeek .Sunday: strDay = "Sunday" ;

            break ;

        }

    return strDay;

Page 138: c#basics

    }

  }

}

Form16.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

  public partial class Form16 : Form

    {

    public Form16()

        {

            InitializeComponent();

Page 139: c#basics

        }

    private void button1_Click( object sender, EventArgs e)

        { //Create and use Enums

      ClsEnum16 obj = new ClsEnum16 ();

      MessageBox .Show(obj.CreateAndUseEnumType());

        }

 

     private void button2_Click( object sender, EventArgs e)

        { //Enter Enum Value From User

 

            int _userEnterValue = Int32 .Parse(textBox1.Text);

      ClsEnum16 obj = new ClsEnum16 ();

      MessageBox .Show(obj.GetvalueEnteredByUser(_userEnterValue));

        }

    }

}

 

Output

Click On: Enter Enum value from user Button

 

Page 140: c#basics

 

Click On: Create and Use Enums Type

 

 

Encapsulation is the process of wrapping up of data and members in a class. Encapsulation provides the way to hide data from the external usage. This is important in the scenario when we don't want our precious data to be used or manipulated by external user. Encapsulation is an object-oriented principle of hiding the internal state and behavior of an object, making your code more maintainable.

 

Advantages of Encapsulation

Page 141: c#basics

Data-hiding through the access specifier private.

Reduce coupling between objects.

Increases the maintainability of code.

Wrapping up of data variables and members inside the class.

 

The following table will give the description of the Access modifiers available in C#.

 

Page 142: c#basics

Access Modifier Description (who can access)

Private

 

Private members can be accessed within the class where they are declared. We can't access private members outside the class, not even with the object of the class.

This basically provides the concept of Data-Hiding.

Protected Protected members scope can be outside the class but only limited to the immediate derived class that is inheriting the base class where the protected members resides.

The protected can be used by the members of same class or the members of derived class.

Internal Here the internal members are accessible within the same assembly.

If you don't specify any modifier, by default it is of internal type.

 

Protected Internal Here either accessed in the same assembly or the

Page 143: c#basics

derived assembly also. This is basically a combination of protected and internal access modifiers.

Public Public members can be accessed anywhere. No restriction associated with this access modifier.

 

 

Sealed Class

The sealed keyword provides the restriction that no other class in the context can inherit this class. By this, we can make our class not to be inherited by other class. If the class tries to inherit the class that is declared as sealed, the compile time error occurs.

 

1] Class declared as sealed

sealed class ClsSealed17 {// Any members }

 

Abstract Class

The class declared with abstract keyword, this means the class is only provide the essential elements and not including the background details. Abstraction is the process of including the essential elements and hiding the details. In layman terms, we can say that a computer is the abstract form, because we are not aware of the internal technicality.

If the class is declared as abstract, we have to give the body to all the methods that are declared as abstract.

 

Page 144: c#basics

1] Class declared as abstract

 

abstract class clsAbstractDemo{

// This can contains abstract or concrete methods.

}

 

2] Abstract Members

public abstract string displayname();

Note:- The abstract methods can only include the signature of the method.

   

Example: Demonstrate Encapsulation

 

Page 145: c#basics

 

 

ClsEncapsulation17.cs

 

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

class Customer

Page 146: c#basics

{

  public void CustomerRecord()

    {

      AddNewRecord();

      UpdateExistingRecord();

      DeleteRecord();

    }

  protected virtual string AddNewRecord()

    { return "Base: AddNewRecord" ; } //ADD NEW RECORD

  protected virtual string UpdateExistingRecord()

    { return "Base: UpdateExistingRecord" ; } //UPDATE EXISTING RECORD

  protected virtual string DeleteRecord()

    { return "Base: DeleteRecord" ; } //DELETE EXISTING RECORD

}

class ClsEncapsulation17 : Customer

{

  private string name = "" ; //Can't Access Outside the Class

  private string address = "" ; //Can't Access Outside the Class

  private string pri_Display() //Can't Access Outside the Class

    {

Page 147: c#basics

    return "This method can't be access outside the class" ;

    }

 

  public string CustomerName { //Public Property

      get { return name; }

      set { name = value ; }

    }

  public string CustomerAddress //Public property

    {

      get { return address; }

      set { address = value ; }

    }

  public string CombineDisplay() //Public Method

    {

      return CustomerName + " :::" + CustomerAddress;

    }

  protected override string AddNewRecord() //Protected Method

    {

      return "protected method :: AddNewRecord" ;

    }

Page 148: c#basics

  protected override string UpdateExistingRecord() //Protected Method

    {

      return "protected method :: UpdateExistingRecord" ;

    }

  protected override string DeleteRecord() //Protected Method

    {

        base .DeleteRecord();

    return "protected method :: DeleteRecord" ;

    }

  public string combineString()

    {

        string cmbStr = "" ;

        cmbStr = cmbStr + AddNewRecord() + "\n" ;

        cmbStr = cmbStr + UpdateExistingRecord() + "\n" ;

        cmbStr = cmbStr + DeleteRecord();

    return cmbStr;

    }

  }

}

 

Page 149: c#basics

ClsSealed17.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

  sealed class ClsSealed17

  {

  private string name = "" ;

  public string CustomerName

    {

    get { return name; }

    set { name = value ; }

    }

  public string displayName()

    {

    return name;

    }

Page 150: c#basics

  }

//Can't inherited a Sealed Class

  class derivedClass //: ClsSealed17

   { 

   }

 }

 

 

ClsAbstract17.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace cSHARPEXAMPLES

{

 abstract class clsAbstractDemo

  {

      private int _number = 10;

   public string _name = "" ;

Page 151: c#basics

 

   public abstract string displayname(); // Abstract method

   public int calcTotal() //Concreate Method

    {

     return (_number * 10);

    }

}

  class ClsAbstract17 : clsAbstractDemo

    {

    public override string displayname() { //Abstract Method

    return "Abstract Method Provide Body in Derived Class" ;

    }

  }

}

 

Output

 

Click On: Private Members Button

 

Click On: Public Members Button

Page 152: c#basics

 

Click On: Protected Members Button

 

Click On: Sealed

 

 

Click On: Abstract

 

Page 153: c#basics

A method's parameters are the types that get passed to it when the method is called. The list of parameters begins by specifying zero or more 'fixed parameters', and it may finish by specifying a single parameter-array. This latter element - declared using the 'params' keyword - means that it is possible to pass an arbitrary number of types to a single method.

 

Syntax: [Modifier] parameter-type parameter-identifier

[Modifier]: This is optional and can be either 'ref' or 'out'.

Parameter-type: This declares the type of the parameter.

Parameter-identifier: The name of the parameter.

 

There are 3 type of parameter that are passed to the method

Passing by Value

Passing by Reference

‘Output' Parameter.

 

 

Page 154: c#basics

Passing By Value:

The parameter modifiers 'ref' and 'out' relate to how the parameter is passed into the method. Where neither of these modifiers is used, the parameter is passed in 'by value'. By default we are passing variable by value. Here the new copy of the variable is send to the called method. So changes done to the variables are not reflected on the actual parameter.

 

Syntax:

passValueByValueType(_initialValue); //Call a method

private void passValueByValueType( int iV)

{ iV = 20; }

 

Passing By Reference:

In C# we can pass variables into methods 'by reference'. Where a variable is passed by reference, the 'ref' modifier must be used both in the method head and the method invocation (illustrated by the next code block). The changes made to the formal argument will reflect on the actual argument.

 

Syntax:

passValueByReferenceType( ref _initialValue); //Calling Method

private void passValueByReferenceType( ref int iV)

{ iV = 20; }

 

 

Page 155: c#basics

‘Output' parameter:

Where a method parameter is defined (and invoked) using the 'out' modifier, it is passed by reference. The difference between the 'out' and the 'ref' modifier is this: a parameter modified by the 'out' keyword need not be assigned a value before being passed into the method, but must be assigned a value in the method.

 

Syntax:

passValueByOutParameter( out _initialValue, out _bValue);//Calling

   

‘Params' Modifier

One can pass an arbitrary number of types to a method by declaring a parameter array with the 'params' modifier.

 

Syntax:

public int getTheTotalUsingParam( params int [] intArr)

 

Example: Demonstrate Parameter Passing in C#

 

Page 156: c#basics

 

 

Form18.cs:

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace cSHARPEXAMPLES

{

Page 157: c#basics

public partial class Form18 : Form

{

 public Form18()

 {

    InitializeComponent();

 }

 private void btnValue_Click( object sender, EventArgs e)

  { //Value

    int _initialValue = Int16 .Parse(textBox1.Text);

  MessageBox .Show( "Before Calling " +

    _initialValue.ToString());

    passValueByValueType(_initialValue);

    textBox1.Text = _initialValue.ToString();

  MessageBox .Show( "After Calling " +

    _initialValue.ToString());

  }

 private void btnReference_Click( object sender, EventArgs e)

    { //Reference

        int _initialValue = Int16 .Parse(textBox2.Text);

    MessageBox .Show( "Before Calling " +

Page 158: c#basics

        _initialValue.ToString());

        passValueByReferenceType( ref _initialValue);

        textBox2.Text = _initialValue.ToString();

    MessageBox .Show( "After Calling " +

        _initialValue.ToString());

    }

 

 private void btnOut_Click( object sende    r, EventArgs e)

    { //Out

        bool _bValue;

        int _initialValue = Int16 .Parse(textBox3.Text);

    MessageBox .Show( "Before Passing " +

        _initialValue.ToString());

        passValueByOutParameter( out _initialValue, out _bValue);

        textBox3.Text = _initialValue.ToString();

    MessageBox .Show( "After getting the value " +

        _initialValue.ToString());

    }

 private void passValueByReferenceType( ref int iV)

    {

Page 159: c#basics

        iV = 20;

    }

 private void passValueByValueType( int iV)

    {

        iV = 20;

    }

 private void passValueByOutParameter( out int iV, out bool bValue)

    {

        bValue = false ;

        iV = 2;

    if (iV > 40)

            bValue = true ;

    else

            bValue = false ;

        iV = iV * 20;

    }

 }

}

 

OutPut:

Page 160: c#basics

 

 

Clicking On:- Passing Parameter By Value

 

 

 

Clicking On:- Passing Parameter By Reference

 

 

Page 161: c#basics

 

Clicking On:- Passing Parameter By Out

 

C# is a language. The classes defined in the class libraries are used to communicate with the database and we are using C# language to interact with the database. In Ado.Net components we have number of classes that are responsible to communicate with the database.

 

Introducing ADO.NET

 

Ado.Net is an Object-oriented set of libraries that allows you to interact with data sources. Following are the data providers in ado.net.

1. System.Data.SqlClient:- contains classes that communicate with Ms SQLServer.

2. System.Data.OracleClient:- communicate with Oracle.

3. System.Data.Oledb:- communicate to a data source that has an OLEDB provider.

4. System.Data.Odbc:- communicate to a data source that has an ODBC provider

Page 162: c#basics

ADO.NET OBJECTS

Ado.net includes many objects you can use to work with data. Some of the primary objects are as follows:-

1. SqlConnection:- To interact with a database, you must have a connection to it. The connection objects helps identifying the database server, database name, user name and password. The connection object is used by command objects.

2. SqlCommand:- You can use this object to send SQL statements to the database. This can represent a SQL Statement or stored procedure.

3. SqlDataReader:- The data reader object allows you to obtain the results of a Select statement from a command object. The data returned from a data reader is a fast forward-only stream of data. This fetch data in a sequential manner.

4. DataSet:- You can imagine dataset as a database. This contain multiple datatable objects, which further contains columns and rows objects. We can also define relationship among tables in the dataset. This is disconnected approach.

5. SqlDataAdapter:- The SqlDataAdapter is used to fill dataset object when reading the data and writes in a single batch when persisting changes back to the database. A data adapter contains a reference to the connection object and opens and closes the connection automatically when reading from or writing to the data base. The data adapter contains 4 command objects i.e. SELECT, UPDATE, DELETE, and INSERT

Example: Demonstrate Database Interaction

Page 163: c#basics

 

This example will provide the interaction with the database. The user will enter his credentials, if the user is valid and the credentials matched with the database, he is able to view all the other users' credentials that are valid.

 

 

 

Form20.cs

 

using System;

Page 164: c#basics

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Data.SqlClient;

 

namespace cSHARPEXAMPLES

{

  public partial class Form20 : Form

    {

    public Form20()

        {

            InitializeComponent();

        }

    private void btnLogin_Click( object sender, EventArgs e)

        { //Login

      try

            {

Page 165: c#basics

                SqlConnection con = null ;

                string conStr = "" ;

                int _ExistFlag = 0;

                conStr = "Data Source=localhost;initial catalog=TestDB;uid=sa;pwd=sa" ;

        con = new SqlConnection (conStr);

        _ExistFlag = fnUserExists(con,txtName.Text,txtPassword.Text);

            if (_ExistFlag == 0)

                { //Not A Valid User

          MessageBox .Show( "Not A Valid User" );

                }

        else

                { // If Valid user Than Display all the Valid User that are there in the DataBase

          MessageBox .Show( "Valid User :: Display All the Valid User" );

                    fillgridWithValidUser(con);

                }

            }

      catch ( Exception ex)

            {

        MessageBox .Show( "Exception Occurs.........." +ex.Message);

Page 166: c#basics

            }

      finally

            {

        txtName.Text = "" ;

        txtPassword.Text = "" ;

            }

        }

 

    /*

    * Function: Whether a Valid User or Not

    * Depending on the creadentials enter by user

    */

    private int fnUserExists( SqlConnection con, string strUserName, string strPassword)

        {

          SqlCommand cmd = null ;

          int _ExistFlag = 0;

          cmd = new SqlCommand ( "select count(*) from tblLogin where UserName=@UserName and password=@Password " , con);

          cmd.Parameters.Add( "@UserName" , SqlDbType.NVarChar).Value = strUserName;

Page 167: c#basics

          cmd.Parameters.Add( "@Password" , SqlDbType.NVarChar).Value = strPassword;

          cmd.CommandType = CommandType .Text;

          con.Open();

      _ExistFlag = Int16 .Parse(cmd.ExecuteScalar().ToString());

          con.Close();

      return _ExistFlag;

          }

 

    /*

    * if the Credentials Enter By user is Valid:

    * Then Display List Of all The Other Valid Users.

    */

    private void fillgridWithValidUser( SqlConnection con)

        {

          SqlDataAdapter ada = null ;

          DataSet dst = null ;

          ada = new SqlDataAdapter ( "select * from tblLogin" , con);

          dst = new DataSet ();

          ada.Fill(dst, "Login" );

        dataGridView1.DataSource = dst.Tables[0].DefaultView;

Page 168: c#basics

        }

    }

}

 

Output:

 

On Click: Login Button

 

 

Page 169: c#basics

There are varieties of operators available for use in C#. The C# language defines the behavior of these operators when used in an expression with the C# built-in data types. C# gives user the flexibility to change the default behaviour of the operators that means, user can define the behavior of many of the standard operators with his own structures and classes.

 

Suppose, for example, that you're writing a class that manages a set of records read from a database. If another piece of code has two objects of your class, it may want to write an expression that joins the records together into a third object. This sounds like an addition operation, and it seems natural for other pieces of code to write code like the following:

Records Records1;

Records Records2;

Records Records3;

Records3 = Records1 + Records2;

 

Your Records class would include a method that specifies "how objects of the class will behave when used in an expression with the addition operator. These methods are called user-defined operator implementations , and the object-oriented terminology for defining operator behavior in a class is called operator overloading .

Note: All operator overloading methods must be declared with both the static and public keywords.

Page 170: c#basics

 

Overloading Unary Plus /Unary Minus:

If you need to overload the unary plus operator, the following characteristics must be enjoyed by the method that is used to overload the unary plus.

A return type of your choice

The keyword operator

The operator being overloaded

A parameter list specifying a single parameter of the type of class or structure containing the overloaded operator method

Overloading Prefix Increment and Decrement Operator:

If you need to overload the prefix increment or prefix decrement operators in your class or structure, define a method with the following characteristics:

A return type specifying the type of class or operator method

The keyword operator

The operator being overloaded

A parameter list specifying a single parameter containing the overloaded operator method

Page 171: c#basics

Example: Demonstrate Overloading of Unary Plus, Unary Minus, Prefix Increment, Prefix Decrement.

 

Overloading Unary Plus

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace _CSharpApplication

{

  class ClsOverLoadUnaryPlus

    {

    public int X;

    public int Y;

 

    public static ClsOverLoadUnaryPlus operator +( ClsOverLoadUnaryPlus RValue)

        {

            ClsOverLoadUnaryPlus NewObj = new ClsOverLoadUnaryPlus ();

      if (RValue.X < 0)

Page 172: c#basics

         NewObj.X = -(RValue.X);

      else

        NewObj.X = RValue.X;

      if (RValue.Y < 0)

        NewObj.Y = -(RValue.Y);

      else

        NewObj.Y = RValue.Y;

      return NewObj;

        }

    }

}

 

Overloading Unary Minus

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace _CSharpApplication

{

Page 173: c#basics

class ClsOverLoadingUnaryMinus

{

    public int X;

    public int Y;

    public static ClsOverLoadingUnaryMinus operator – ( ClsOverLoadingUnaryMinus RValue)

        {

        ClsOverLoadingUnaryMinus objNew = new ClsOverLoadingUnaryMinus ();

    if (RValue.X > 0)

        objNew.X = -(RValue.X);

    else

        objNew.X = RValue.X;

    if (RValue.Y > 0)

        objNew.Y = -(RValue.Y);

    else

        objNew.Y = RValue.Y;

    return objNew;

        }

    }

}

Page 174: c#basics

 

Overloading Prefix Increment

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace _CSharpApplication

{

class ClsOverloadingIncrement

{

    public int X;

    public int Y;

 

    public static ClsOverloadingIncrement operator ++( ClsOverloadingIncrement RValue)

        {

        ClsOverloadingIncrement objIncrement = new ClsOverloadingIncrement ();

    objIncrement.X = RValue.X + 1;

    objIncrement.Y = RValue.Y + 1;

Page 175: c#basics

    return objIncrement;

        }

    }

}

 

Overloading Prefix Decrement

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace _CSharpApplication

{

class ClsOverLoadingDecrement

{

    public int X;

    public int Y;

    public static ClsOverLoadingDecrement operator – ( ClsOverLoadingDecrement RValue)

        {

Page 176: c#basics

        ClsOverLoadingDecrement objDecrement = new ClsOverLoadingDecrement ();

    objDecrement.X = RValue.X - 1;

    objDecrement.Y = RValue.Y - 1;

    return objDecrement;

        }

    }

}

 

 

Form2.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace _CSharpApplication

Page 177: c#basics

{

public partial class Form2 : Form

{

    public Form2()

    {

    InitializeComponent();

    }

 

    private void button1_Click( object sender, EventArgs e)

        { //Overloading Unary Plus

        ClsOverLoadUnaryPlus objUnaryPlus = new ClsOverLoadUnaryPlus ();

    objUnaryPlus.X = -100;

    objUnaryPlus.Y = 200;

    MessageBox.Show((objUnaryPlus.X).ToString());

    MessageBox.Show((objUnaryPlus.Y).ToString());

    objUnaryPlus = +objUnaryPlus;

    MessageBox.Show((objUnaryPlus.X).ToString());

    MessageBox.Show((objUnaryPlus.Y).ToString());

        }

Page 178: c#basics

 

    private void button2_Click( object sender, EventArgs e)

        { //Overloading Unary Minus

        ClsOverLoadingUnaryMinus objUnaryMinus = new ClsOverLoadingUnaryMinus ();

    objUnaryMinus.X = -10;

    objUnaryMinus.Y = 20;

    MessageBox.Show((objUnaryMinus.X).ToString());

    MessageBox.Show((objUnaryMinus.Y).ToString());

    objUnaryMinus = -objUnaryMinus;

    MessageBox.Show((objUnaryMinus.X).ToString());

    MessageBox.Show((objUnaryMinus.Y).ToString());

        }

 

    private void button3_Click( object sender, EventArgs e)

        { //Overlading Prefix Increment

        ClsOverloadingIncrement objIncrement = new ClsOverloadingIncrement ();

    objIncrement.X = 100;

    objIncrement.Y = 200;

    MessageBox.Show((objIncrement.X).ToString());

Page 179: c#basics

    MessageBox.Show((objIncrement.Y).ToString());

    objIncrement = ++objIncrement;

    MessageBox.Show((objIncrement.X).ToString());

    MessageBox.Show((objIncrement.Y).ToString());

        }

 

    private void button4_Click( object sender, EventArgs e)

        { //Overloading Prefix Decrement

        ClsOverLoadingDecrement objDecrement = new ClsOverLoadingDecrement ();

    objDecrement.X = 100;

    objDecrement.Y = 200;

    MessageBox.Show((objDecrement.X).ToString());

    MessageBox.Show((objDecrement.Y).ToString());

    objDecrement = --objDecrement;

    MessageBox.Show((objDecrement.X).ToString());

    MessageBox.Show((objDecrement.Y).ToString());

        }

    }

}

 

Page 180: c#basics

 

Output:

 

 

 

Click on Overloading Unary Plus:

     

Click on Overloading Unary Minus:

     

Click on Prefix Increment:

   

Click on Prefix Decrement:

Page 181: c#basics

   

Overloading Boolean Operator:

If you need to overload the true or false operators in your class or structure, define a method with the following characteristics:

A return type of bool

The keyword operator

The operator being overloaded

A parameter list specifying a single parameter of the type of class or structure containing the overloaded operator method

Overloading Conversion Operator:

You can also write operator overload methods that convert one type into another type. If you need to define a new conversion operator in your class or structure, define a method with the following characteristics:

The keyword implicit if the conversion is to be treated as an implicit conversion, or the keyword explicit if the conversion is to be treated as an explicit conversion

Page 182: c#basics

The keyword operator

A type specifying the target type of the conversion

A parameter list specifying the source type of the conversion

 

Overloading Binary Operators:

The operators that fall under this category are : Addition, Subtraction, Division, Multiplication, Remainder, AND, OR, Exclusive OR, Shift left, Shift Right, Equality, Inequality, Greater than, less than. If you need to overload any of the binary operators in your class or structure, define a method with the following characteristics:

A return type of your choice

The keyword operator

The operator being overloaded

A parameter list specifying two parameters, at least one of which must be of the type of class or structure containing the overloaded operator method

Example: Demonstrate Boolean Overloading, Conversion Overloading and Binary Operators Overloading

 

Page 183: c#basics

ClsOverloadingBooleanOpertors.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace _CSharpApplication

{

  class ClsOverloadingBooleanOpertors

    {

    public int X;

    public int Y;

 

    public static bool operator true ( ClsOverloadingBooleanOpertors RValue)

        {

    if ((RValue.X == 0) && (RValue.Y == 0))

        return true ;

    return false ;

        }

Page 184: c#basics

    public static bool operator false ( ClsOverloadingBooleanOpertors RValue)

        {

    if ((RValue.X == 0) && (RValue.Y == 0))

        return false ;

    return true ;

        }

    }

}

 

ClsOverloadingConversion.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace _CSharpApplication

{

  class ClsOverloadingConversion

    {

    public int X;

Page 185: c#basics

    public int Y;

    public static implicit operator double ( ClsOverloadingConversion RValue)

        {

    double total_Distance;

    double total_Sum;

        total_Sum = (RValue.X * RValue.X) + (RValue.Y * RValue.Y);

        total_Distance = System. Math .Sqrt(total_Sum);

    return total_Distance;

        }

    }

}

 

ClsOverloadingEqualityInequality.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace _CSharpApplication

Page 186: c#basics

{

  class ClsOverloadingEqualityInequality

    {

    public int X;

    public int Y;

        public static bool operator ==( ClsOverloadingEqualityInequality objFirst,         ClsOverloadingEqualityInequality objSecond)

        {

    if (objFirst.X != objSecond.X)

        return false ;

    if (objFirst.Y != objSecond.Y)

        return false ;

    return true ;

        }

    public override bool Equals( object o)

        {

        return true ;

        }

    public override int GetHashCode()

        {

        return 0;

Page 187: c#basics

        }

    public static bool operator !=( ClsOverloadingEqualityInequality objFirst,     ClsOverloadingEqualityInequality objSecond)

        {

    if (objFirst.X != objSecond.X)

        return true ;

    if (objFirst.Y != objSecond.Y)

        return true ;

    return false ;

        }

    }

}

 

Form3.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

Page 188: c#basics

using System.Text;

using System.Windows.Forms;

 

namespace _CSharpApplication

{

  public partial class Form3 : Form

    {

    public Form3()

        {

    InitializeComponent();

        }

 

    private void button1_Click( object sender, EventArgs e)

        { //Overloading True and False operator

            ClsOverloadingBooleanOpertors objBoolean = new ClsOverloadingBooleanOpertors ();

      objBoolean.X = 20;

      objBoolean.Y = 30;

      if (objBoolean)

        MessageBox.Show( "The point is at the origin." );

      else

Page 189: c#basics

        MessageBox.Show( "The point is not at the origin." );

        }

 

    private void button2_Click( object sender, EventArgs e)

        { //Overloadable Conversion Operator

            double conDistance;

            ClsOverloadingConversion objConversion = new ClsOverloadingConversion ();

      objConversion.X = 100;

      objConversion.Y = 200;

            conDistance = objConversion;

      MessageBox.Show(conDistance.ToString());

        }

 

    private void button3_Click( object sender, EventArgs e)

        { //Overloading Equality/Inequality Operator

            ClsOverloadingEqualityInequality MyFirstPoint = new ClsOverloadingEqualityInequality ();

            ClsOverloadingEqualityInequality MySecondPoint = new ClsOverloadingEqualityInequality ();

            ClsOverloadingEqualityInequality MyThirdPoint = new ClsOverloadingEqualityInequality ();

Page 190: c#basics

      MyFirstPoint.X = 100;

      MyFirstPoint.Y = 200;

      MySecondPoint.X = 500;

      MySecondPoint.Y = 750;

      MyThirdPoint.X = 100;

      MyThirdPoint.Y = 200;

      if (MyFirstPoint == MySecondPoint)

        MessageBox.Show( "MyFirstPoint and MySecondPoint are at the same coordinates." );

      else

        MessageBox.Show( "MyFirstPoint and MySecondPoint are not at the same coordinates." );

      if (MyFirstPoint == MyThirdPoint)

        MessageBox.Show( "MyFirstPoint and MyThirdPoint are at the same coordinates." );

      else

        MessageBox.Show( "MyFirstPoint and MyThirdPoint are not at the same coordinates." );

 

        }

    }

}

Page 191: c#basics

 

Output:

 

 

Clicking on Overloading True/False Operator

Clicking on Overloading Conversion Operator

 

Clicking on Overloading Equality/Inequality Operator

Page 192: c#basics

 

Overloading Boolean Operator:

If you need to overload the true or false operators in your class or structure, define a method with the following characteristics:

A return type of bool

The keyword operator

The operator being overloaded

A parameter list specifying a single parameter of the type of class or structure containing the overloaded operator method

Overloading Conversion Operator:

You can also write operator overload methods that convert one type into another type. If you need to define a new conversion operator in your class or structure, define a method with the following characteristics:

Page 193: c#basics

The keyword implicit if the conversion is to be treated as an implicit conversion, or the keyword explicit if the conversion is to be treated as an explicit conversion

The keyword operator

A type specifying the target type of the conversion

A parameter list specifying the source type of the conversion

 

Overloading Binary Operators:

The operators that fall under this category are : Addition, Subtraction, Division, Multiplication, Remainder, AND, OR, Exclusive OR, Shift left, Shift Right, Equality, Inequality, Greater than, less than. If you need to overload any of the binary operators in your class or structure, define a method with the following characteristics:

A return type of your choice

The keyword operator

The operator being overloaded

A parameter list specifying two parameters, at least one of which must be of the type of class or structure containing the overloaded operator method

Page 194: c#basics

Example: Demonstrate Boolean Overloading, Conversion Overloading and Binary Operators Overloading

 

ClsOverloadingBooleanOpertors.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace _CSharpApplication

{

  class ClsOverloadingBooleanOpertors

    {

    public int X;

    public int Y;

 

    public static bool operator true ( ClsOverloadingBooleanOpertors RValue)

        {

    if ((RValue.X == 0) && (RValue.Y == 0))

Page 195: c#basics

        return true ;

    return false ;

        }

    public static bool operator false ( ClsOverloadingBooleanOpertors RValue)

        {

    if ((RValue.X == 0) && (RValue.Y == 0))

        return false ;

    return true ;

        }

    }

}

 

ClsOverloadingConversion.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace _CSharpApplication

Page 196: c#basics

{

  class ClsOverloadingConversion

    {

    public int X;

    public int Y;

    public static implicit operator double ( ClsOverloadingConversion RValue)

        {

    double total_Distance;

    double total_Sum;

        total_Sum = (RValue.X * RValue.X) + (RValue.Y * RValue.Y);

        total_Distance = System. Math .Sqrt(total_Sum);

    return total_Distance;

        }

    }

}

 

ClsOverloadingEqualityInequality.cs

 

using System;

using System.Collections.Generic;

Page 197: c#basics

using System.Text;

 

namespace _CSharpApplication

{

  class ClsOverloadingEqualityInequality

    {

    public int X;

    public int Y;

        public static bool operator ==( ClsOverloadingEqualityInequality objFirst,         ClsOverloadingEqualityInequality objSecond)

        {

    if (objFirst.X != objSecond.X)

        return false ;

    if (objFirst.Y != objSecond.Y)

        return false ;

    return true ;

        }

    public override bool Equals( object o)

        {

        return true ;

Page 198: c#basics

        }

    public override int GetHashCode()

        {

        return 0;

        }

    public static bool operator !=( ClsOverloadingEqualityInequality objFirst,     ClsOverloadingEqualityInequality objSecond)

        {

    if (objFirst.X != objSecond.X)

        return true ;

    if (objFirst.Y != objSecond.Y)

        return true ;

    return false ;

        }

    }

}

 

Form3.cs

 

using System;

using System.Collections.Generic;

Page 199: c#basics

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace _CSharpApplication

{

  public partial class Form3 : Form

    {

    public Form3()

        {

    InitializeComponent();

        }

 

    private void button1_Click( object sender, EventArgs e)

        { //Overloading True and False operator

            ClsOverloadingBooleanOpertors objBoolean = new ClsOverloadingBooleanOpertors ();

      objBoolean.X = 20;

Page 200: c#basics

      objBoolean.Y = 30;

      if (objBoolean)

        MessageBox.Show( "The point is at the origin." );

      else

        MessageBox.Show( "The point is not at the origin." );

        }

 

    private void button2_Click( object sender, EventArgs e)

        { //Overloadable Conversion Operator

            double conDistance;

            ClsOverloadingConversion objConversion = new ClsOverloadingConversion ();

      objConversion.X = 100;

      objConversion.Y = 200;

            conDistance = objConversion;

      MessageBox.Show(conDistance.ToString());

        }

 

    private void button3_Click( object sender, EventArgs e)

        { //Overloading Equality/Inequality Operator

Page 201: c#basics

            ClsOverloadingEqualityInequality MyFirstPoint = new ClsOverloadingEqualityInequality ();

            ClsOverloadingEqualityInequality MySecondPoint = new ClsOverloadingEqualityInequality ();

            ClsOverloadingEqualityInequality MyThirdPoint = new ClsOverloadingEqualityInequality ();

      MyFirstPoint.X = 100;

      MyFirstPoint.Y = 200;

      MySecondPoint.X = 500;

      MySecondPoint.Y = 750;

      MyThirdPoint.X = 100;

      MyThirdPoint.Y = 200;

      if (MyFirstPoint == MySecondPoint)

        MessageBox.Show( "MyFirstPoint and MySecondPoint are at the same coordinates." );

      else

        MessageBox.Show( "MyFirstPoint and MySecondPoint are not at the same coordinates." );

      if (MyFirstPoint == MyThirdPoint)

        MessageBox.Show( "MyFirstPoint and MyThirdPoint are at the same coordinates." );

      else

        MessageBox.Show( "MyFirstPoint and MyThirdPoint are not at the same coordinates." );

Page 202: c#basics

 

        }

    }

}

 

In socket-based network programming, you do not directly access the network interface device to send and receive packets. Instead, an intermediary file descriptor is created to handle the programming interface to the network. The special file descriptors used to reference network connections are called sockets . The socket defines the following:

A specific communication domain, such as a network connection or a Unix Interprocess Communication (IPC) pipe

A specific communication type, such as stream or datagram

A specific protocol, such as TCP or UDP

After the socket is created, it must be bound to either a specific network address or port on the system, or to a remote network address and port. Once the socket is bound, it can be used to send and receive data from the network.

Network Addresses

After the socket is created, it must be bound to a network address/port pair. UNIX offers an IP-specific address structure, sockaddr_in , which uses the following elements. Using the sockaddr_in structure requires placing the appropriate IP address and port values in the proper data element.

Page 203: c#basics

1. sin_family An address family, defined as a short type

2. sin_port A port number, defined as a short type

3. sin_addr An address, defined as a long type (4-byte) IP address

4. sin_data 8 bytes of padding.

 

.NET defines two classes in the System.Net namespace to handle various types of IP address information.The classes are IPAddress and IPEndPoint IPAddress object is used to represent a single IP address. This value can be used in the various socket methods to represent the IP address.

IPAddress Methods:-

Page 204: c#basics

Method Description

Equals Compares two IP addresses.

GetHashCode Returns a hash value for an IPAddress object.

GetType Returns the type of the IP address instance.

Converts an IP address from host byte order to

Page 205: c#basics

HostToNetworkOrder network byte order.

IsLoopBack Indicates whether the IP address is considered the loopback address.

NetworkToHostOrder Converts an IP address from network byte order to host byte order.

Parse Converts a string to an IPAddress instance.

ToString Converts an IPAddress to a string representation of the dotted decimal format of the IP address.

IPEndPoint: object is used when binding sockets to local addresses, or when connecting sockets to remote addresses. The following two constructors are used to create IPEndPoint instances:

IPEndPoint (long address , int port )

IPEndPoint(IPAddress address , int port )

PEndPoint Methods:

Page 206: c#basics

Method Description

Create Creates an EndPoint object from a SocketAddress object

GetType Returns the type of the IPEndPoint instance

Equals Compares two IPEndPoint objects

Serialize Creates a SocketAddress instance of the IPEndPoint instance

Creates a string representation of the IPEndPoint

Page 207: c#basics

ToString instance

GetHashCode Returns a hash value for an IPEndPoint object

 

 

 

Example: Demonstrate Socket Programming

Form4.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Net;

 

namespace _CSharpApplication

{

public partial class Form4 : Form

Page 208: c#basics

{

public Form4()

{

InitializeComponent();

}

 

private void button1_Click( object sender, EventArgs e)

{ //Introduction to IP Addresses.

IPAddress _address1 = IPAddress .Parse( "192.168.1.1" );

IPAddress _address2 = IPAddress .Broadcast;

IPAddress _address3 = IPAddress .Loopback;

IPAddress _address4 = IPAddress .None;

IPAddress _address5 = IPAddress .Any;

IPHostEntry _hostName = Dns .GetHostEntry( Dns .GetHostName());

IPAddress _myMachine = _hostName.AddressList[0];

if ( IPAddress .IsLoopback(_address3))

lstAddresses.Items.Add( "Loopback address is: " + _address3.ToString());

else

lstAddresses.Items.Add( "Error obtaining the LoopbackAddress" );

lstAddresses.Items.Add( "Local IP address is: " + _myMachine.ToString());

Page 209: c#basics

 

if (_myMachine == _address3)

lstAddresses.Items.Add( "Loopback Address Is Same AsLocal Address.\n" );

else

lstAddresses.Items.Add( "The loopback address is not the local address.\n" );

lstAddresses.Items.Add( "Given Address is: " + _address1.ToString());

lstAddresses.Items.Add( "Broadcast address: " + _address2.ToString());

lstAddresses.Items.Add( "ANY address is: " + _address5.ToString());

lstAddresses.Items.Add( "NONE address is: " + _address4.ToString());

}

 

private void button2_Click( object sender, EventArgs e)

{ //Introduction To IPEndPoint

IPAddress test1 = IPAddress .Parse( "192.168.1.1" );

IPEndPoint _endPoint = new IPEndPoint (test1, 8000);

 

lstIPEndPoint.Items.Add( "IPEndPoint is ::" + _endPoint.ToString());

lstIPEndPoint.Items.Add( "AddressFamily is ::" +_endPoint.AddressFamily);

Page 210: c#basics

lstIPEndPoint.Items.Add( "Address is :: " + _endPoint.Address);

lstIPEndPoint.Items.Add( "Port is :: " + _endPoint.Port);

lstIPEndPoint.Items.Add( "Min port number is :: " + IPEndPoint .MinPort);

lstIPEndPoint.Items.Add( "Max port number is :: " +IPEndPoint .MaxPort);

_endPoint.Port = 80;

lstIPEndPoint.Items.Add( "Changed IPEndPoint is :: " + _endPoint.ToString());

SocketAddress _socketAddress = _endPoint.Serialize();

lstIPEndPoint.Items.Add( "SocketAddress is :: " + _socketAddress.ToString());

}

}}

 

 

Output:

 

 

Clicking on both the buttons the output will be:

Page 211: c#basics

To simplify the unwieldy state of computer naming, the Domain Name System (DNS) was created. It allows the master host database to be split up and distributed among multiple systems on the Internet. DNS uses a hierarchical database approach, creating levels of information that can be split and stored on various systems throughout the Internet.

DNS Structure

The structure of a hierarchical database is similar to an organization chart with nodes connected in a treelike manner (that's the hierarchical part). The top node is called the root . The root node does not explicitly show up in Internet host addresses, so it is often referred to as the “nameless” node. Multiple categories were created under the root level to divide the database into pieces called domains . Each domain contains DNS servers that are responsible for maintaining the database of computer names for that area of the database (that's the distributed part).

The first (or top) level of distribution is divided into domains based on country codes. Additional top-level domains for specific organizations were created to prevent the country domains from getting overcrowded.

Page 212: c#basics

Domain Description

.mil U.S. military sites

.com Commercial organizations

Page 213: c#basics

.edu Educational institutions

.gov U.S. government organizations

.net Internet Service Providers (ISPs)

.us Other U.S. organizations (such as local governments)

.org Nonprofit organizations

.ca Canadian organizations

.de German organizations

[other countries] Organizations from other countries

Using DNS

The last way to determine system IP information is to utilize the C# DNS (Domain Name System) classes. DNS can be used to obtain Internet hostnames and IP Addresses. The C# System.Net namespace contains the DNS class, which comprises several methods that allow you to obtain DNS information about hosts. The GetHostName() method retrieves the hostname of the local system. The GetHostByName() method attempts to find the IP address of a hostname.

 

Page 214: c#basics

DNS Configuration

When your C# application is running on a customer's system, you have no guarantee that there are any DNS servers configured. You can find out what (if any) DNS servers are configured by using the .NET Registry class methods to examine the DNS Registry values.

Fortunately, all Windows platforms store the DNS server information in the same place:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters   Registry Data Values for DNS Servers

Page 215: c#basics

Data Value Description

DatabasePath The location of the host's file

Domain The name of the system's domain

NameServer The list of DNS servers

Hostname The name of the system's DNS host

SearchList A list of DNS domains to append to the end of hostnames in DNS name searches

The value of most interest here is NameServer . This should contain a single string value representing all the configured DNS servers, separated by spaces. The primary DNS server will be listed first, followed by the alternate servers.

 

 

Example: Demonstrate DNS and its Configuration in Registry

using System;

using System.Collections.Generic;

using System.ComponentModel;

Page 216: c#basics

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Net;

using Microsoft.Win32;

 

 

namespace _CSharpApplication

{

  public partial class Form6 : Form

    {

    public Form6()

        {

     InitializeComponent();

        }

 

    private void button1_Click( object sender, EventArgs e)

        { //Demonstrate DNS..

            string _hostName = Dns .GetHostName();

Page 217: c#basics

            lstDNS.Items.Add( "Local hostname :: " + _hostName);

            IPHostEntry _ipHostEntry = Dns .GetHostByName(_hostName);

            foreach ( IPAddress _address in _ipHostEntry.AddressList)

            {

                lstDNS.Items.Add( "IP Address ::" + _address.ToString());

            }

        }

 

    private void button2_Click( object sender, EventArgs e)

        { //DNS Configuration in Registry

            RegistryKey start = Registry .LocalMachine;

            string DNSservers = @"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" ;

            RegistryKey DNSserverKey = start.OpenSubKey(DNSservers);

      if (DNSserverKey == null )

            {

                lstDNSConfiguration.Items.Add( "Unable to open DNS servers key" );

        return ;

            }

            string serverlist = ( string )DNSserverKey.GetValue( "NameServer" );

Page 218: c#basics

            lstDNSConfiguration.Items.Add( "DNS Servers: " + serverlist);

            DNSserverKey.Close();

            start.Close();

            char [] token = new char [1];

            token[0] = ' ' ;

            string [] servers = serverlist.Split(token);

      foreach ( string server in servers)

            {

                lstDNSConfiguration.Items.Add( "DNS server: " + server);

            }

        }

    }

}

File access in .NET is generally handled with stream objects. In this section, we will discuss about the two classes BinaryWriter and BinaryReader to demonstrate the file handling in C#. The BinaryReader and BinaryWriter classes support binary file access. These classes permit binary operations to and from streams.

 

BinaryWriter

The BinaryWriter class allows primitive data types to be written to streams; and with the use of subclassing, you can override the methods of this class

Page 219: c#basics

and fulfill your own unique character encoding requirements. The following table will summarize the properties of the class:-

 

 

Name Type Purpose

Page 220: c#basics

BaseStream Property Allow access to binary writer underlying stream.

Close Method Close the Binary writer class and the underlying stream.

Flush Method Flushes out all data to the underlying stream and then clears buffers.

Seek Method Sets the current position within the current stream.

Write Method This overloaded method writes a value out to the current stream.

 

BinaryReader

The BinaryReader class, much like the BinaryWriter class, relies on a FileStream object to read files .

 

 

Page 221: c#basics

Method  

Description

Close  Close the binary reader object and the base stream.

 

Page 222: c#basics

PeekChar Reads the next available byte from the stream but does not advance the byte or character position within the file.

ReadBoolean  Reads a Boolean [True/False] value from the stream.

ReadByte  Reads a single byte from the stream. There is also a readbytes method for specifying the number of bytes to read.

ReadChar  Reads a single char value from the stream. There is also a readchars method for specifying the number of chars to read.

ReadInt16  Reads an integer value (2 bytes).

ReadInt32  Reads a long value (4 bytes).

ReadInt64  Reads an eight-byte signed integer.

 

Example: Demonstrate working with files

 

 

using System;

using System.Collections.Generic;

Page 223: c#basics

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

 

namespace _CSharpApplication

{

public partial class Form4 : Form

{

 public Form4()

 {

  InitializeComponent();

 }

 

private void button1_Click( object sender, EventArgs e)

{ //Writing to the file

     FileStream myFStream = new FileStream ( "G:\\2CSharpApplication\\Test.txt" , FileMode         .OpenOrCreate, FileAccess .ReadWrite);

     BinaryWriter binWrit = new BinaryWriter (myFStream);

Page 224: c#basics

    string testString = "Writing into a File..This is a test Value." ;

  binWrit.Write(testString);

  binWrit.Close();

  myFStream.Close();

}

 

private void button2_Click( object sender, EventArgs e)

{ //Reading from the file.

    long imageWidth = 0;

    long imageHeight = 0;

    int imagePlanes = 0;

    int imageBitCount = 0;

    string [] cma = Environment .GetCommandLineArgs();

  if (cma.GetUpperBound(0) >= 1)

    {

        FileStream myFStream = new FileStream (cma[1], FileMode .Open, FileAccess .Read);

        BinaryReader binRead = new BinaryReader (myFStream);

    binRead.BaseStream.Position=0x12;

    imageWidth = binRead.ReadInt32();

Page 225: c#basics

    imageHeight= binRead.ReadInt32();

    imagesPlanes= binRead.ReadInt16();

    imagesBitCount = binRead.ReadInt16();

    Console .WriteLine( "[{0}] {1}x{2} {3}- bit" ,cma[1], imageWidth, imageHeight, imageBitCount);

    binRead.Close();

    myFStream.Close();

    }

}

private void button3_Click( object sender, EventArgs e)

{ //Copying File.

    string [] strcla = Environment .GetCommandLineArgs();

  if (strcla.GetUpperBound(0) == 2)

    {

        FileInfo cpyfi = new FileInfo (strcla[1]);

    cpyfi.CopyTo(strcla[2], true );

    MessageBox .Show( "Copied " + cpyfi.Length + " bytes." );

    }

  else

    MessageBox .Show( "Usage: cp <input file> <output file>" );

}

Page 226: c#basics

 

private void button4_Click( object sender, EventArgs e)

{ //Deleting File.

    string [] strcla = Environment .GetCommandLineArgs();

  if (strcla.GetUpperBound(0) == 1)

    {

        FileInfo delfi = new FileInfo (strcla[1]);

    delfi.Delete();

    MessageBox .Show( "File : " + strcla[1]);

    MessageBox .Show( "Attributes: " + delfi.Attributes.ToString());

    MessageBox .Show( "File Deleted..." );

    }

  else

    MessageBox .Show( "Usage: rm <filename>" );

}

 

private void button5_Click( object sender, EventArgs e)

{ //Moving File.

    string [] strcla = Environment .GetCommandLineArgs();

  if (strcla.GetUpperBound(0) == 2)

Page 227: c#basics

    {

        FileInfo movfi = new FileInfo (strcla[1]);

    movfi.MoveTo(strcla[2]);

    MessageBox .Show( "File Created : " +movfi.CreationTime.ToString());

    MessageBox .Show( "Moved to : " + strcla[2]);

    }

  else

    MessageBox .Show( "Usage: mv <source file> <destination file>" );

  }

 }

}

An interesting feature of the C# compiler is to generate XML documentation from the comments. C# compiler reads specially formatted comments and generates XML documentation from the comments. You can then displays this XML on the Web to provide an extra level of documentation to developers who need to understand the structure of your applications.

 

Pre-requisites to generate XML documentation from the comments are:

Use three slashes for comments(///). The C# compiler does not generate any XML Documentation for any comments that do not begin with three slashes. Nor does the C# compiler generates any XML documentation for regular, multi line, comments.

Page 228: c#basics

Use the /doc option of the C# compiler to specify the name of the file that should contain the generated XML documentation.

 

Example: Demonstrate XML documentation from Comments

 

Step1: In the first step we create the C# code file.

 

using System;

using System.Collections.Generic;

using System.Windows.Forms;

 

namespace _CSharpApplication

{

  static class Program

    {

    /// <summary>

    /// The main entry point for the application.

    /// Developed By : C# Team

    /// Developed On : 21 Oct,07

Page 229: c#basics

    /// </summary>

    [ STAThread ]

    static void Main ()

        {

        Application .EnableVisualStyles();

        Application .SetCompatibleTextRenderingDefault( false );

                System.Console.WriteLine( "StartUp for C# World!" );

        }

    }

}

Step2: The following command is used to generate the help file. The command will create two files i.e. “Program.exe” and other is “ProgramHelpFile.xml” .

 

Command: csc /doc: HelpFile.xml ProgramFile.cs

 

   

Output:-

The following xml will be generated by the above command.

 

ProgramHelpFile.xml

Page 230: c#basics

 

<?xml version="1.0"?>

<doc>

    <assembly>

        <name>Program</name>

    </assembly>

    <members>

        <member name="M:_CSharpApplication.Program.Main">

            <summary>

            The main entry point for the application.

            Developed By : C# Team

            Developed On : 21 Oct,07

            </summary>

        </member>

    </members>

</doc>

 

Note: -Main portion of XML documentation is found in <member> element: This element contains one <member> tag for each documented item in the source code. The <member> tag contains one attribute, name, which names the member being documented. The value of the name attribute starts with a one-letter prefix describing the type of information being described. Options

Page 231: c#basics

for the first letter of the name attribute's value and its meaning. <member> “name” = Attribute Prefixes >

 

Other Important Tags:

 

The following is the list of more help file tags which can be used in the C#.

1. <c>:- T ag to indicate that a small part of your comment should be treated as code. Style sheets may use this element to display the code portion of your comment E.g. /// This is the <c> Main ()</c> function for the /// Program class.

2. <code>:- Tag to indicate that multiple lines of text in your comments should be treated as code: E.g. /// <code>/// Argument[0]: command line argument 1 /// Argument[1]: command line argument 2/// Argument[2]: command line argument 3 /// </code>

3. <exception>:- You can use the <exception> tag to document any exceptions that may be raised from the member's code. The <exception> tag must contain an attribute called cref whose value specifies the type of exception being documented. The cref attribute value must be enclosed in quotes. The text of the element describes the conditions under which the exception is thrown: E.g. /// <exception cref="System.Exception">/// Raised if the input is less than 0. /// </exception>

4. <permission>:- Use the <permission> tag to document the permissions available on a given function or variable. Access to a

Page 232: c#basics

class's code and data can mean access to all of the code or it can be restricted to a certain subset of code. You can use the <permission> tag to document the availability of your code and data. The <permission> tag makes use of one attribute: cref. The value of the cref element must name the function or variable whose permissions are being documented: E.g. /// <permission name="Main()"> /// Everyone can access Main (). /// </permission>

5. <remarks>:- Use the <remarks> tag to add information about an item. The <remarks> element is great for providing an overview of a method or variable and its usage. The <remarks> tag carries no attributes and its text contains the remarks: E.g. /// <remarks> /// The Main () function is the entry point into the /// application. The CLR will call Main () to start /// the application after the application loads/// </remarks>

Code access security is a feature of .NET that manages code, dependent on our level of trust. If the CLR trusts the code enough to allow it to run, it will begin executing the code. Depending on the permissions provided to the assembly, however, it might run within a restricted environment. If the code is not trusted enough to run, or if it runs but then attempts to perform an action, for which it does not have the relevant permissions, a SecurityException is thrown. The code access security system means that we can stop malicious code running, but we can also allow code to run within a protected environment where we are confident that it cannot do any damage.

 

CAS is part of .Net security model that determines whether or not a piece of code is allowed to run and what resources it can use while running. CAS grants rights to program depending on the security configuration of the machine. For e.g. the program has rights to edit or create a new file but the

Page 233: c#basics

security configuration of machine does not allow the program to delete a file.

 

Code access security is based on two concepts Code Groups and Permissions. The following sections will discuss both in detail.

 

Code Group

Code Group is the concept of bringing together the code with similar characteristics. Two examples for code groups are Internet and Intranet. The group Internet defines code that is sourced from the Internet, the group Intranet defines code sourced from the LAN. Code groups have an entry requirement called membership condition . Each code group has one, and only one, membership condition.

 

Following is the available list of code group memberships:

Zone: The region from which the code originated. A zone is one of the commonly used condition. A zone is the region of origin of a piece of code and refers to one of the following: My Computer, Internet, Intranet, Trusted, or  not trusted.

Site: The Web site from which the code originated.

Strong Name: A unique, verifiable name for the code.

Publisher: The publisher of the code.

URL: The specific location from which the code originated.

Page 234: c#basics

Hash Value: The hash value for the assembly.

Skip Verification: This condition requests that it bypasses code verification checks.

Application Directory: The location of the assembly within the application.

All Code: All code fulfills this condition.

Custom: A user-specified condition.

Code groups are arranged hierarchically with the All Code membership condition at the root.

 

Permissions

Permissions are the actions we allow each code group to perform? For example, permissions include “able to access the user interface” and “able to access local storage.” The system administrator usually manages the permissions at the enterprise, machine, and user levels.

A thread is a sequence of execution in a program. All our C# programs up to this point have one entry point—the Main () method. Execution starts with the first statement in the Main () method and continues until that method returns. A thread is the basic unit to which the operating system allocates processor time.

Page 235: c#basics

 

Processes are made up of one or more threads. A thread is defined as a single flow of operation within a program. When a program executes on the CPU, it traverses the program statements in a single thread until the thread is complete. A multithreaded application distributes functions among multiple program flows, allowing two or more paths of execution to occur. Each path of execution is a separate thread.

 

Multi-tasking: It's a feature of modern operating systems with which we can run multiple programs at same time example word, excel etc

 

Multi-Threading: Multi-threading forms subset of multi-tasking instead of having to switch between programs this feature switches between different parts of the same program. Example we are writing a word document and at the same time word is doing a spell check in background.

Multithreaded programs create their own threads that can be executed separately from the main thread of the program. All threads created by the primary thread share the same memory address space as the primary thread. Often the secondary threads are used to perform computationally intensive functions, allowing the main thread to continue responding to Windows events. Without the secondary threads, the user could not select anything from the menu or click any buttons while an application computed a mathematical function

 

 

System.Threading: This namespace has all the classes that are related to implement threading. Any .Net application who wants to implements threading has to import this namespace.

Note: In .Net program, there are always at least two threads running, i.e. one is the main program and other is the garbage collector.

Page 236: c#basics

 

States:

Threads have several operational states, which are enumerated using the .NET Thread State enumeration, found in the System.Threading namespace.

Initialized: The thread has been initialized but not started.

Ready: The thread is waiting for a processor.

Running: The thread is currently using the processor.

Standby: The thread is about to use the processor.

Terminated: The thread is finished and is ready to exit.

Transition: The thread is waiting for a resource other than the processor.

Unknown: The system is unable to determine the thread state.

Wait: The thread is not ready to use the processor

 

The Thread Class

 

Page 237: c#basics

Use the Thread class to create a new Thread object, which produces a new thread within the current process. The format of the Thread constructor is as follows, where start is a ThreadStart delegate:

Thread (ThreadStart start) The ThreadStart delegate points to the method that will be performed within the new thread.

 

E.g. Thread newthread= new Thread (new ThreadStart (anyMethod));

Void anyMethod () {}

After the Thread object is created, it can be controlled using various Thread class methods, which are as under:

 

Abort (): Terminate the thread.

Equals (): Determines whether two thread objects are same.

GetHashCode (): Get a unique representation for the thread.

GetType (): Get the type of the current thread.

Interrupt (): Interrupts a thread that is in a wait state.

Join (): Blocks the calling thread until the thread terminates.

Resume (): Resumes a thread that has been suspended.

Page 238: c#basics

Start (): Change the state of the thread to running.

Suspend (): Suspend the execution of the thread.

ToString (): gets a string representation of the Thread object.

 

Thread priority: The thread priority determines the order in which thread has to execute. The thread priority can be changed by using Threadname.Priority = ThreadPriority.Highest.

Different levels of priority provided by .Net:

ThreadPriority.Highest

ThreadPriority.AboveNormal

ThreadPriority.Normal

ThreadPriority.BelowNormal

ThreadPriority.Lowest

 

Thread.Sleep (): Thread execution can be paused by calling the Thread.Sleep method. This method takes an integer value that determines how long the thread should sleep.

Page 239: c#basics

 

 

 

Example: Demonstrate Threading

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.Remoting;

using System.Threading;

 

namespace ConsoleApplication1

{

  class Program1

   {

    static void Main ( string [] args)

       {

        Program1 ts = new Program1 ();

       }

    public Program1()

Page 240: c#basics

        {

            int i;

            Thread firstThread = new Thread ( new ThreadStart (FirstMethod));

            Thread secondThread = new Thread ( new ThreadStart (SecondMethod));

            firstThread.Start();

            secondThread.Start();

      for (i = 0; i < 10; i++)

            {

        Console.WriteLine( "Main: {0}" , i);

                Thread .Sleep(1000);

            }

        }

    void FirstMethod()

        {

            int i;

      for (i = 0; i < 10; i++)

            {

        Console.WriteLine( " First thread: {0}" , i);

                Thread .Sleep(2000);

Page 241: c#basics

            }

        }

    void SecondMethod()

        {

            int i;

      for (i = 0; i < 10; i++)

            {

        Console.WriteLine( " Second thread2: {0}" , i);

                Thread .Sleep(3000);

            }

        }

    }

}

When writing applications for international distribution, different cultures and regions must be kept in mind. Different cultures have diverging calendars and use different number and date formats, and also the sort order with the letters A-Z may lead to various results. To make applications fit for global markets you have to globalize and localize them.

Globalization is about internationalizing applications: preparing applications for international markets. With globalization, the application supports number and date formats depending on the culture, different calendars, and so on.

Page 242: c#basics

Localization is about translating applications for specific cultures. For translations of strings, you can use resources.

.NET supports globalization and localization of Windows and Web applications. To globalize an application you can use classes from the namespace System.GlobalizationSystem.Resources. whereas to localize an application you can use resources that are supported by the namespace

 

System.Globalization

The System.Globalization namespace holds all culture and region classes to support different date formats, different number formats, and even different calendars that are represented in classes such as Gregorian calendar, Hebrew Calendar, Japanese Calendar, and so on. Using these classes you can display different representations depending on the user's locale.

 

Cultures and Regions

The world is divided into multiple cultures and regions, and applications have to be aware of these cultural and regional differences. RFC 1766 defines culture names that are used worldwide depending on a language and a country or region. Some examples are en-AU, en-CA, en-GB, and en-US for the English language in Australia , Canada , United Kingdom , and the United States .

 

Note:- Most Important class in System.Globaliation namespace is CultureInfo [Represents a Culture]

 

Example: Demonstrate CultureInfo

Page 243: c#basics

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.Remoting;

using System.Threading;

using System.Globalization;

 

namespace ConsoleApplication1

{

 class Program1

 {

  static void Main ( string [] args)

   {

        int val = 1234567890;

        string name = "visualbuilder" ;

    //Culture of the Current Thread

    Console .WriteLine(val.ToString( "N" ));

    //use IFormatProvider

    Console .WriteLine(val.ToString( "N" , new CultureInfo ( "fr- FR" )));

Page 244: c#basics

    //Change the culture of the thread

    Thread .CurrentThread.CurrentCulture = new CultureInfo ( "de- DE" );

    Console .WriteLine(val.ToString( "N" ));

    }

 }

}

Windows Registry is a central database for application configuration settings and other information required by the applications. The Windows Registry is a data repository that exists on each computer in Windows Operating systems. Both the system and application programs use this repository to store information needed at runtime. For example, the system stores file associations (the applications or command lines associated with each known file extension) in the Registry. Applications often use the Registry to store information such as users' option settings and data file pathnames.

 

Note:- If you've never open Windows registry, you can see it by running regedit from command line

 

.NET Framework Library provides two classes - Registry and RegistryKey to work with the windows registry. These classes are defined in Microsoft.Win32 namespace. So before using these classes, you need to add reference to this namespace.

 

Registry Class:

Page 245: c#basics

The Registry class contains members to provides access to registry keys. We can define registry keys in the following order.

CurrentUser - Stores information about user preferences.

LocalMachine - Stores configuration information for the local machine.

ClassesRoot - Stores information about types (and classes) and their properties.

Users - Stores information about the default user configuration.

PerformanceData - Stores performance information for software components.

CurrentConfig - Stores non-user-specific hardware information.

DynData - Stores dynamic data.

 

The Registry class members are described in the following table.

Page 246: c#basics

ClassesRoot Returns a RegistryKey type which provides access to HKEY_CLASSES_ROOT key.

LocalMachine Returns a RegistryKey type which provides access to HKEY_LOCAL_MACHINE key.

CurrentConfig Returns a RegistryKey type which provides access to HKEY_CURRENT_CONFIG key.

DynData Returns a RegistryKey type which provides access to HKEY_DYN_DATA key.

CurrentUser Returns a RegistryKey type which provides access to HKEY_CURRENT_USER key

Page 247: c#basics

PerformanceData Returns a RegistryKey type which provides access to HKEY_PERFORMANCE_DATA key.

Users Returns a RegistryKey type which provides access to HKEY_USERS key.

 

RegistryKey Class :

The RegistryKey class contains members to add, remove, replace, and read registry data. Some of its common methods and properties are defined in the following table.

 

Properties:

Name - Represents the name of the key.

SubKeyCount - Represents the count of subkeys at the base level, for theCurrent key.

ValueCount - Represents the count of values in the key.

 

Methods:

Page 248: c#basics

GetValueNames Retrieves an array of strings that contains all the value names associated with this key.

GetValue Returns the specified value.

OpenSubKey Opens a subkey.

Page 249: c#basics

GetSubKeyNames Returns an array of strings that contains all the subkey names.

DeleteSubKeyTree Deletes a subkey and any children.

DeleteSubKey Deletes the specified subkey.

CreateSubKey Creates a new subkey if not exists, otherwise opens an existing subkey.

SetValue Sets the specified value.

DeleteValue Deletes the specified value from a key.

Close Closes the key.

 

 

Example:- Working with Windows Registry.

 

 

Form1.cs

 

Page 250: c#basics

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Win32;

namespace WindowsApplication1

{

  public partial class Form1 : Form

    {

    public Form1()

        {

    InitializeComponent();

        }

 

    private void button1_Click( object sender, EventArgs e)

        { //Adding a Key and Value in Registry

            RegistryKey key = Registry .LocalMachine.OpenSubKey( "Software" , true );

Page 251: c#basics

     //Create Key inside the software folder

            RegistryKey newkey = key.CreateSubKey( "NewTestKeyAdded" );

    //User Can also set the value for this Key

            newkey.SetValue( "NewTestKeyAdded" , "ValueForThisTestKey" );

    MessageBox.Show( "Key/Value is added in the Registry..." );

        }

 

    private void button2_Click( object sender, EventArgs e)

        { //Retrieving Data From Registry

            RegistryKey pRegKey = Registry .LocalMachine;

            pRegKey = pRegKey.OpenSubKey( "HARDWARE\\         DESCRIPTION\\System\\FloatingPointProcessor\\0" );

            Object valueOfKey = pRegKey.GetValue( "Identifier" );

      MessageBox.Show( "Key Value is :: " + valueOfKey);

        }

 

    private void button3_Click( object sender, EventArgs e)

        { //Deleting Key/Value from Registry

 

            RegistryKey delKeyValue = Registry .LocalMachine.OpenSubKey( "Software\\" );

Page 252: c#basics

delKeyValue.DeleteValue( "ValueForThisTestKey" );

     // Delete the key from the registry.

            RegistryKey delSubKey = Registry .LocalMachine.OpenSubKey( "Software" , true );

delSubKey.DeleteSubKey( "NewTestKeyAdded" );

      MessageBox.Show( "Deleting Key/Value in the Registry" );

        }

    }

} The coming section will discuss about some more classes used for Globalization in C#.

 

Resources and ResourceWriter

 

Resources such as pictures or string tables can be put into resource files or satellite assemblies. Such resources can be very helpful when localizing applications, and .NET has built-in support to search for localized resources. A resource file can be a text file or a .resx file or XML file. This file contains the key/value pairs. Where the keys are used in the program and at run time they are replaced with the values that is corresponding to each key. For example:-

 

Name = Jim Tire

Address = USA

Page 253: c#basics

Author = Puppet

Publisher = Jim Toe

 

Note:-ResGen.exe utility is used to create a resource file out of this “test.txt” file. the command Resgen test.txt will create the text.txt resource file and Resgen test.txt test.resx will createtthe XML file from the test.txt file.

 

ResourceWriter

This class under the System.Resources namespace is used to create the resource file through the programming. The below example will create the object of the ResourceWriterAddResource() method. and then we can use the same object to add upto 2GB of resources. We have to just supply the key/value pair to the object's

 

Example: Demonstrate ResourceWriter

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.Remoting;

using System.Threading;

using System.Globalization;

using System.Resources;

Page 254: c#basics

 

namespace ConsoleApplication1

{

  class Program1

    {

    static void Main ( string [] args)

        {

            ResourceWriter rw = new ResourceWriter ( "RWDemo.resources" );

      rw.AddResource( "Name " , "VisualBuilder" );

      rw.AddResource( "Adress" , " UK " );

      rw.AddResource( "Hobby" , "Cricket" );

      rw.AddResource( "Favourite Country" , " Australia " );

      rw.AddResource( "Player" , "Sunny" );

      rw.Close();

        }

    }

}

 

Output:

 

Page 255: c#basics

This will create RWDemo.resources file, which contains the key/value pairs. The Close() method of the ResourceWriter class automatically calls ResourceWriter.Generate() to finally write the resources to the file RWDemo.resources.

 

Using Resource File in an Application

 

We can add resource files to assemblies using the assembly generation tool al.exe, using the /embed option or using the c# compiler with /resource option or directly using the VS.Net. The following are the steps to use the resource files in C# application.

1. Open the application

2. Use the context menu of the solution explorer (Add >> Add Existing Item)

3. Locate the path where the resource file is situated.

4. If you check the Resource after adding it to the projects, its BuildAction is “Embedded Resource”, this means the resource is embedded to the output assembly.

5. You can view the resource file using the ILDasm.exe utility by checking it in the assembly manifest.

6. To access the embedded resources, use the Resource Manager class from the System.Resources namespace.

Page 256: c#basics

7. You can pass the assembly that has the resources as an argument to the constructor of the Resource Manager class

8. Once you include the resource file in the application use the Resource Manager and load the resource file into this.

 

Example: Demonstrate Usage of Resource File

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Reflection;

using System.Resources;

 

namespace cSHARPEXAMPLES

{

  public partial class Form22 : Form

Page 257: c#basics

    {

    public Form22()

        {

        InitializeComponent();

        }

 

    private void button1_Click( object sender, EventArgs e)

        { //Using Resource File

        System.Resources. ResourceManager rm;

                Assembly assembly = Assembly .GetExecutingAssembly();

        rm = new ResourceManager ( "cSHARPEXAMPLES.RWDemo" , assembly);

                txtName.Text = rm.GetString( "Name " );

                txtAddress.Text=rm.GetString( "Adress" );

                txtHobby.Text = rm.GetString( "Hobby" );

                txtFCountry.Text = rm.GetString( "Favourite Country" );

                txtPlayer.Text = rm.GetString( "Player" );

        }

    }

}

Page 258: c#basics

The core function of a Windows Service is to run an application in the background. One of the ways that it differs from an windows application in that a Windows Service starts before any user logs in to the system (if it has been setup to start at boot up), although it can also be setup in such a way that it requires user to start it manually. A Windows Service also has its own process hence it runs very efficiently. Normally a Windows Service will not have a user interface for a simple reason it can be run even if no one is logged on to the system but this is not a rule, you can still have a Windows Service with a user interface.

 

Creating a Windows Service:

 

Step 1:- Open VS 2005, Click on File > Projects.

 

 

Step 2:- This will open up a project and clicking on the hyperlink that is there on the page, you will be able to open the code behind page where you can code for the web service.

 

Step 3:- Add Functionality to the web service that you have created. There are two overridden function i.e. “OnStart” and “OnStop”. The OnStart function executes when you start your service and the OnStop function gets execute when you stop a service.

 

//OnStart

Page 259: c#basics

protected override void OnStart( string [] args)

{}

 

//OnStop

protected override void OnStop()

{}

 

Step 4:- Install and Run the Service: For Installation of the service on the computer, one need to have the administrator rights to install the service on the computer. The installUtil tool is provided by with the .Net framework to install the application.

 

Note:- The use should have administrator rights to install the utility. If the utility is not installed then it will display a popup when you run the program.

 

 

 

Example: Demonstrate Windows Services.

 

 

Page 260: c#basics

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Diagnostics;

using System.ServiceProcess;

using System.Text;

using System.IO;

 

namespace winServiceFirst

{

  public partial class OTestService : ServiceBase

    {

    public OTestService()

        {

    InitializeComponent();

        }

 

    protected override void OnStart( string [] args)

    {    

Page 261: c#basics

    //This will be printed at the start of the service....

        FileStream fs = new FileStream ( @"C:\windowServiceTest\trackerForWebService.txt" ,         FileMode .OpenOrCreate, FileAccess .Write);

        StreamWriter m_streamWriter = new StreamWriter (fs);

    m_streamWriter.BaseStream.Seek(0, SeekOrigin .End);

    m_streamWriter.WriteLine( " ************************** \n" );

    m_streamWriter.WriteLine( " mcWindowsService: Service Started \n" );

    m_streamWriter.WriteLine( " ************************** \n" );

    m_streamWriter.Flush();

    m_streamWriter.Close();

    }

 

  protected override void OnStop()

    { // TODO: Add code here to perform any tear-down necessary to stop your service.

    //This will be printed at the end of the service...

        FileStream fs = new FileStream ( @"C:\windowServiceTest\trackerForWebService.txt" , FileMode .OpenOrCreate, FileAccess .Write);

        StreamWriter m_streamWriter = new StreamWriter (fs);

    m_streamWriter.BaseStream.Seek(0, SeekOrigin .End);

    m_streamWriter.WriteLine( " *************************** \n" );

Page 262: c#basics

    m_streamWriter.WriteLine( " mcWindowsService: Service Stopped \n" );

    m_streamWriter.WriteLine( " *************************** \n" );

    m_streamWriter.Flush();

    m_streamWriter.Close();

    }

  }

}

 

Output:

Note:- Thr program will write the content in the text file that we specified. The following lines gets printed in the text file.

 

**************************

mcWindowsService: Service Started

**************************

***************************

mcWindowsService: Service Stopped

***************************

The term "web service" refers to a form of a component that can be used remotely. Web services are invoked remotely using SOAP or HTTP-GET and HTTP-POST protocols. Web services are based on XML and return an

Page 263: c#basics

"answer" to the client in XML format. Web services have all the advantages of components plus many more.

 

The most significant benefits include:

 

1. Platform and Language Independence : Web services can be built and consumed on any operating system just as long as that operating system supports the SOAP protocol and XML.

2. Automatic Upgrade : Unlike components, if a web service requires an update, that update is propagated to all applications consuming that web service immediately. This is because the actual methods and properties for the web service are invoked from the web server remotely, meaning that each function contained within a web service appears as a "black box" to a client: they aren't concerned with the way the function does its job, just as long as it returns the expected result.

 

Some Important Terms in Web Services:

 

1. UDDI : UDDI (Universal Description, Discovery and Integration) is a registry that provides a place for a company to register its business and the services that it offers. People or businesses that need a service can use this registry to find a business that provides the service. When you search for a web service using UDDI's web service or web browser, UDDI returns a listing of web services that matched your

Page 264: c#basics

criteria. This list is returned in the form of a DISCO or WSDL document.

2. WSDL: WSDL (Web Services Description Language) is a language that describes a web service. It contains information such as where you can find the web service, methods and properties that it supports, its data types, and the protocol used to communicate with the web service. WSDL is based on the XML format and it's used to create proxy objects. Basically, without a WSDL document, developers wouldn't be able to use web services simply because they wouldn't know which methods and properties they support and also which communication method any particular web service supports.

3. DISCO : DISCO (Abbreviated from disco very) is a list of WSDL documents. DISCO is used to group common web services together. DISCO documents are also in XML format.

4. SOAP: SOAP (Simple Object Access Protocol) is a protocol to transport data to and from the web server. It is in XML format and allows you to transport a variety of data types used in .NET. As an alternative to SOAP, we can use HTTP-GET and HTTP-POST, which will be covered later in the article. These protocols return the output in a non-SOAP format; however this output is still in XML format.

Example: Demonstrate Web Service

 

using System;

using System.Web;

using System.Web.Services;

using System.Web.Services.Protocols;

Page 265: c#basics

 

[ WebService (Namespace = "http://tempuri.org/" , Description = "New WEB Service Developed by V.D" )]

[ WebServiceBinding (ConformsTo = WsiProfiles .BasicProfile1_1)]

public class Service : System.Web.Services. WebService

{

    public Service () {

    //Uncomment the following line if using designed components

    //InitializeComponent();

}

[ WebMethod (Description= "GetEmployeeName: This will return the Employee Name." )]

public string getEmployeeName()

{

    return "James Tube" ;

}

[ WebMethod (Description = "GetEmployeeAge: This will return the Employee Age." )]

public string getEmployeeAge()

{

    return "23" ;

Page 266: c#basics

}

}

 

 

Output: Run this Web Service or F5

 

 

 

Note:

1]. There are 2 methods that are associated with this web service.

2]. The web service us under the default namespace that is http://tempuri.org. .

3]. Each XML Web service needs a unique namespace in order for client applications to distinguish it from other services on the Web.http://tempuri.org/ is available for XML Web services that are under development, but published XML Web services should use a more permanent namespace .

 

Output: If user clicks on the getEmployeeAge link

A Web Service is an external interface provided by a Web site that can be called from other Web sites. For example, a financial company may make up

Page 267: c#basics

to the minute stock quotes available via Web Service for those who do their trading with that company. This information could be read from a Web page and displayed, or read from a stand-alone application on a customer's desktop computer.

 

Client Communicate through web service:

 

SOAP over HTTP SOAP over HTTP

XML XML

 

Location 1 Location 2

 

Soap calls are remote function calls that invoke methods executions on Web Service components at Location 2. The output is render as XML and pass back to the Location 1 where the user wants to access the Web Service.

At Location 1, the user need to consume some of the functions of the web service that is available on the internet, to make the remote function calls (RFC). All the processing can't be done on the remote machine, therefore, we have to create the proxy of the web service from where we can process our data. This whole process is also called as marshalling of data.

Due to security threats, we create the proxy of the server object here it is web service. That means we are creating a " proxy object " to act on behalf of the original Web service. The proxy object will have all the public available data interfaces as the original Web service.

Page 268: c#basics

 

Consuming a Web Service

The following are the steps to call/consume a webservice.

 

Step 1: Create a Web Service project and run it so that no compilation error exists.

Step 2: Create new Web Site that will consume this web site that is there in your system using the VS.Net. Create New Web Site with the name: Web Site Name that will consume web service: WebService_Consume.

Step 3: Once you are done with the creation of the new site that will consume the web Service. Let example the web service run as this URL: http://localhost:1508/WebService_New/MyWebService.asmx

 

 

 

Step 4: Right click on the solution, Click on “Add Web Reference”. This will open up a new pop-up window where you can specify the URL name of your web service .

 

 

Page 269: c#basics

Here we specify the web service URL and if you look at the right panel there is Web Reference Name: localhost [This the default name that is there].

 

Step5: We specify “localhost_myWebService” name for the web reference. This will include 3 files under this folder.

MyWebService.disco

MyWebService.discomap

MyWebService.wsdl

 

Step6: Look Inside the contents of the “disco” file

 

<?xml version="1.0" encoding="utf-8" ?>

<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/">

<contractRef ref="http://localhost:1508/WebService_New/MyWebService.asmx?wsdl" docRef="http://localhost:1508/WebService_New/MyWebService.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" />

<soap address="http://localhost:1508/WebService_New/MyWebService.asmx" xmlns:q1="http://tempuri.org/" binding="q1:ServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />

Page 270: c#basics

<soap address="http://localhost:1508/WebService_New/MyWebService.asmx" xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />

</discovery>

 

Step7: Look Inside the contents of the “discomap” file

 

<?xml version="1.0" encoding="utf-8" ?>

<DiscoveryClientResultsFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<Results>

<DiscoveryClientResult referenceType="System.Web.Services.Discovery.DiscoveryDocumentReference" url="http://localhost:1508/WebService_New/MyWebService.asmx?disco" filename="MyWebService.disco" />

<DiscoveryClientResult referenceType="System.Web.Services.Discovery.ContractReference" url="http://localhost:1508/WebService_New/MyWebService.asmx?wsdl" filename="MyWebService.wsdl" />

</Results>

</DiscoveryClientResultsFile>

 

 

Page 271: c#basics

Example: Demonstrate the Consumption of the Web Service in the Web Site

 

 

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

 

public partial class _Default : System.Web.UI. Page

{

  protected void Page_Load( object sender, EventArgs e)

    {

    }

  protected void Button1_Click( object sender, EventArgs e)

    { //Consuming the WebServices through Add Web Reference

Page 272: c#basics

    //Fetching the Value from the Web Services

        localhost_myWebService. Service objServiceConsume = new localhost_myWebService. Service ();

        txtName.Text = objServiceConsume.getEmployeeName();

        txtAge.Text = objServiceConsume.getEmployeeAge();

    }

}

 

Output:

 

 

Click on the Fetcher button: This will fetch the value from the Web Service.

There are many ways to consume Web Services.

1. The first way is to use a SOAP Proxy Client Object generated by the WSDL utility, and it provides programmers with their familiar object model that they can use to call methods provided by the generated Proxy Interface.

2. The second way is to use HTTP-POST and HTTP-GET protocols.

Page 273: c#basics

3. The third way is to use a SOAP standard Request message that parses SOAP response messages with the help of the XMLHTTP COM object that is installed by the Microsoft XML Parser.

 

WSDL: Web Services Description Language (WSDL) is an XML based protocol for information exchange in decentralized and distributed environments. A WSDL document defines services as collections of network endpoints, or ports. A WSDL document uses the following elements in the definition of network services:

Types – a container for data type definitions using some type system (such as XSD).

Message – an abstract, typed definition of the data being communicated.

Operation – an abstract description of an action supported by the service.

Port Type –an abstract set of operations supported by one or more endpoints.

Binding – a concrete protocol and data format specification for a particular port type.

Port – a single endpoint defined as a combination of a binding and a network address.

Service – a collection of related endpoints.

Page 274: c#basics

 

Proxy Class: This proxy class serves as an intermediate between the ASP.NET Web page and the Web service

 

 

Consuming Web Service object:

 

1. The Asp.Net page instantiates an instance of the proxy class. For e.g. ProxyClassName objproxy = new ProxyClassName();

2. Once the object is instantiated, then with the help of proxy object, this will make a call to the web service method. For e.g. objproxy.WebMethodName(any Parameter that has to send);

3. The proxy class marshals the parameter list and makes an HTTP request to the Web service sitting on Web Server 2.

Page 275: c#basics

4. The Web service unmarshals the incoming parameters, runs the method, and marshals the output parameters. These are sent back in an HTTP response.

5. The proxy class unmarshals the return parameters and passes back the result to the ASP.NET Web page.

Creating a Proxy Class:

 

Creating a Proxy class involves three steps:

 

Step 1:- First create the proxy class of the web service using the WSDL tool.

wsdl.exe:-Utility to generate code for xml web service clients and xml web services using ASP.NET from WSDL contract files, XSD schemas and discomap discovery documents. This tool can be used in conjunction with disco.exe.

 

Run this from the Command Prompt:

C:\Program Files\Microsoft Visual Studio 8\VC> wsdl http://localhost:1508/WebService_New/MyWebService.asmx

Microsoft (R) Web Services Description Language Utility

[Microsoft (R) .NET Framework, Version 2.0.50727.42]

Copyright (C) Microsoft Corporation. All rights reserved.

Writing file 'C:\Program Files\Microsoft Visual Studio

Page 276: c#basics

8\VC\Service.cs'.

 

Step 2:- This will create the “Service.cs” file on the specified location. After this compile this Proxy Class to generate the compiled proxy

Class i.e. “Service.dll” Run this from the command Prompt:

C:\Program Files\Microsoft Visual Studio 8\VC> csc /t:library Service.cs

Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42

for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727

Copyright (C) Microsoft Corporation 2001-2005. All rights Reserved.

 

Step 3:-Place this compiled proxy class in the dll of the Web Site from where you want to access the Web Service.

 

 

WSDL.EXE:

•  Wsdl.exe contains only one required parameter, a URL or path to the WSDL for the Web service. The following optional parameters can be specified:

•  /language: language – specifies what language the Proxy class should be created in (vb/cs/js).

•  /protocol: protocol – specifies the payload protocol to be used (SOAP, HttpGet, HttpPost)

•  /namespace: namespace – the namespace of the generated Proxy class.

Page 277: c#basics

•  /out: filename – the filename of the Proxy class.

 

Proxy Class inclusion

 

 

1. Add the proxy class to the newly created Web Site

2. Go to Solution Explorer; right click on that solution à click on “Add Reference”. Below pop-up window appears

 

1. Clicking “Ok” will include the proxy class to the solution under “Bin folder”.

Page 278: c#basics

2. Now we can use this proxy class and the methods that are there in the web services.

Note: A proxy class is a class containing all of the methods and objects exposed by the Web service. These methods handle the marshalling of the parameters into SOAP, sending the SOAP request over HTTP, receiving the response from the Web service, and unmarshalling the return value. The proxy class allows the client program to call a Web service as if the Web service was a local component.

Once you create a proxy class using the .NET command-line tool wsdl.exe , a Web service client may invoke proxy class methods, which communicate with a Web service over the network by processing the SOAP messages sent to and from the Web service.

 

 

Page 279: c#basics

 

Example: Demonstrate the Creation of Proxy Class and its Usage

 

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

 

public partial class _Default : System.Web.UI. Page

{

  protected void Page_Load( object sender, EventArgs e)

    {

 

    }

  protected void btnCustomer_Click( object sender, EventArgs e)

Page 280: c#basics

    { //Fetching the Customer Data from the Proxy Class.

    try

        {

            Service objService = new Service ();

            txtCustomerAge.Text = objService.getEmployeeAge();

            txtCustomerName.Text = objService.getEmployeeName();

        }

    catch ( Exception ex) {

        Response.Write(ex.Source);

        }

    }

 }

 

 

Output:

 

Click On the “Customer Data” Button:

Page 281: c#basics

Creating an XML document

The .NET gives us flexibility to work with the XML files easily. .NET provides following five namespaces for XML manipulation.

1. System.Xml:- Contains major XML classes.This namespace contains many classes to read and write XML documents.Some classes under this namespace are XmlReader, XmlTextReader, XmlValidatingReader, XmlNodeReader, XmlWriter, and XmlTextWriter.

2. System.Xml.Schema:- Contains classes which work with XML schemas. XmlSchema, XmlSchemaAll, XmlSchemaXPath, and XmlSchemaType are the classes comes under this namespace.. 

  << Prev: Creating Proxy Object of Web Service

Next: Reading XML document in C sharp >>

Page 282: c#basics

3. System.Xml.Serialization:- Contains classes that are used to serialize objects into XML format documents or streams.

4. System.Xml.XPath:- Contains XPath related classes to use XPath specifications. XPathDocument, XPathExression, XPathNavigator, and XPathNodeIterator classes comes under this namespace..

5. System.Xml.Xsl :- Contains classes to work with XSLT transformations.

 

Example: Demonstrate Creation of XML Document

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Xml;

 

 

Page 283: c#basics

namespace _CSharpApplication

{

  public partial class Form10 : Form

    {

    public Form10()

        {

    InitializeComponent();

        }

 

    private void button1_Click( object sender, EventArgs e)

        {

        XmlDocument xmldoc;

        XmlNode xmlnode;

        XmlElement xmlelem;

        XmlElement xmlelem2;

        XmlElement xmlelem3;

        XmlText xmltext;

 

        xmldoc= new XmlDocument ();

    //XML DECLARATION SECTION

Page 284: c#basics

        xmlnode=xmldoc.CreateNode( XmlNodeType .XmlDeclaration, "" , "" );

        xmldoc.AppendChild(xmlnode);

    //STARTING NODE

        xmlelem=xmldoc.CreateElement( "" ,txtRoot.Text, "" );

        xmltext=xmldoc.CreateTextNode(txtRootDesc.Text);

        xmlelem.AppendChild(xmltext);

        xmldoc.AppendChild(xmlelem);

    //ADD CHILD ELEMENT TO THIS NODE

        xmlelem2=xmldoc.CreateElement( "" ,txtFirstChild.Text, "" );

        xmltext=xmldoc.CreateTextNode(txtFirstChildDesc.Text);

        xmlelem2.AppendChild(xmltext);

        xmldoc.ChildNodes.Item(1).AppendChild(xmlelem2);

    //ADD CHILD ELEMENT TO THIS NODE

        xmlelem3 = xmldoc.CreateElement( "" ,txtSecondChild.Text, "" );

        xmltext = xmldoc.CreateTextNode(txtSecondChildDesc.Text);

        xmlelem3.AppendChild(xmltext);

        xmldoc.ChildNodes.Item(1).AppendChild(xmlelem3);

        //SAVE THE XML DOCUMENT IN A FILE "C:\CREATEXML.XML"

Page 285: c#basics

    try {

            xmldoc.Save( "c:\\CREATEXMLDocument.xml" );

        } catch ( Exception ex) {

        Console.WriteLine(ex.Source);

        }

    MessageBox.Show( "***********XML DOCUMENT CREATED************" );

    }

 }

}

 

 

Output:

 

 

 

Clicking on the “Create XML Document” after filling all the fields.

 

Page 286: c#basics

 

 

 

Generated XML files looks like:

 

<?xml version="1.0" ?>

<RootName>

  <FirstChildName> FirstChildDesc </FirstChildName>

  <SecondChildName> SecondChildDesc </SecondChildName>

</RootName>

Reading XML document in C sharp

The XmlReader and XmlTextReader classes are defined in the System.XML namespace.The XmlTextReader class is derived from XmlReader class. The XmlTextReader class can be used to read the XML documents. The read function of this document reads the document until end of its nodes.

 

 

  << Prev: Creating an XML document

Next: Using XMLWriter class to Write XML document in C sharp

>>

Page 287: c#basics

Example: The following example will show how the C# program will read the xml file.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Xml;

 

namespace _CSharpApplication

{

  public partial class Form11 : Form

    {

    public Form11()

        {

    InitializeComponent();

        }

Page 288: c#basics

    private void button1_Click( object sender, EventArgs e)

        { //Read XML Document

      try

            {

        // Open an XML file : Read Any XML that you have

                XmlTextReader reader = new XmlTextReader ( "C:\\CREATEXMLDocument.xml" );

        while (reader.Read())

                { // Move to first element

            reader.MoveToElement();

            lstReadXML.Items.Add( "XmlTextReader Properties Test" );

            lstReadXML.Items.Add( "===================" );

            // Read Element's Properties

            lstReadXML.Items.Add( "Name:" + reader.Name);

            lstReadXML.Items.Add( "Base URI:" + reader.BaseURI);

            lstReadXML.Items.Add( "Local Name:" + reader.LocalName);

            lstReadXML.Items.Add( "Attribute Count:" + reader.AttributeCount.ToString());

            lstReadXML.Items.Add( "Depth:" +reader.Depth.ToString());

            lstReadXML.Items.Add( "Line Number:" + reader.LineNumber.ToString());

Page 289: c#basics

            lstReadXML.Items.Add( "Node Type:" + reader.NodeType.ToString());

            lstReadXML.Items.Add( "Attribute Count:" + reader.Value.ToString());

                }

            }

        catch ( Exception ex)

            {

        MessageBox .Show ( "Exception: {0}" , ex.ToString());

            }

 

        }

    }

}

 

Output: The following screen will be displayed when run the above program.

 

 

Clicking On the ‘ Read XML “ button the following screen will be displayed.

Page 290: c#basics

Using XMLWriter class to Write XML document in C sharp

The XmlWriter class contains the functionality to write to XML documents. XmlWriter is an abstract base class and is a super class of XmlTextWriter and XmlNodeWriter classes which are used to write the XML documents. This class has many WriteXXX methods to write paired, unpaired and empty XML elements. Some of these methods are used in a start and end pair. For example, to write an element, you need to call WriteStartElement then write a string followed by WriteEndElement.

 

Example: Demonstrate Writing to XML file

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Xml;

  << Prev: Reading XML document in C sharp

Next: Assembly Information : Getting Permission set of the

assembly >>

Page 291: c#basics

 

namespace _CSharpApplication

{

   public partial class Form12 : Form

    {

    public Form12()

        {

    InitializeComponent();

        }

 

    private void button1_Click( object sender, EventArgs e)

        { //Writing XML DOCUMENT

 

      try

            {

        //CREATE NEW FILE

                XmlTextWriter xmlWRITER = new XmlTextWriter ( "C:\\writeEmployeeRecordInXML1.xml" , null );

        //OPEN DOCUMENT FOR WRITING

                xmlWRITER.WriteStartDocument();

Page 292: c#basics

        //WRITE COMMENTS

                xmlWRITER.WriteComment( "Commentss: START DATE : 21-OCT-07" );

                xmlWRITER.WriteComment( "Commentss: WRITE XML DOCUMENT" );

        //WRITE FIRST ELEMENT

                xmlWRITER.WriteStartElement( "EMPLOYEE" );

                xmlWRITER.WriteStartElement( "r" , "RECORD" , "urn:record" );

        //WRITE NEXT ELEMENT

                xmlWRITER.WriteStartElement( "EMPLOYEE NAME" , "" );

                xmlWRITER.WriteString(txtName.Text);

                xmlWRITER.WriteEndElement();

        //WRITE ANOTHER ELEMENT

                xmlWRITER.WriteStartElement( "EMPLOYEE ADDRESS" , "" );

                xmlWRITER.WriteString(txtAddress.Text);

                xmlWRITER.WriteEndElement();

                //WRITE ANOTHER ELEMENT

                xmlWRITER.WriteStartElement( "EMPLOYEE Date Of Birth" , "" );

                xmlWRITER.WriteString(txtDOB.Text);

Page 293: c#basics

                xmlWRITER.WriteEndElement();

                //WRITE ANOTHER ELEMENT

                xmlWRITER.WriteStartElement( "EMPLOYEE Qualification" ,"" );

                xmlWRITER.WriteString(txtQual.Text);

                xmlWRITER.WriteEndElement();

        //WRITE CHARACTERS

                char [] ch = new char [3];

                ch[0] = 'X' ;

                ch[1] = 'M' ;

                ch[2] = 'L' ;

                xmlWRITER.WriteStartElement( "WRITING CHARACTER IN XML DOCUMENT" );

                xmlWRITER.WriteChars(ch, 0, ch.Length);

                xmlWRITER.WriteEndElement();

        // END OF DOCUMENT

                xmlWRITER.WriteEndDocument();

        // CLOSE WRITER

                xmlWRITER.Close();

        MessageBox.Show( "*********DONE***********" );

Page 294: c#basics

            }

      catch ( Exception ex) {

        MessageBox .Show(ex.Source);

        }

 

    }

    }}

 

 

Clicking on the “Writing XML Document”

 

 

This will generate a Xml file that contains the contents as given below:

 

“writeEmployeeRecordInXML.xml”

<?xml version="1.0"?>

<!--Commentss: START DATE : 21-OCT-07-->

Page 295: c#basics

<!--Commentss: WRITE XML DOCUMENT-->

<EMPLOYEE>

<r:RECORD xmlns:r="urn:record">

<EMPLOYEE NAME>Joseph</EMPLOYEE NAME>

<EMPLOYEE ADDRESS>Terry</EMPLOYEE ADDRESS>

<EMPLOYEE Date Of Birth>17-7-1981</EMPLOYEE Date Of Birth>

<EMPLOYEE Qualification>MBA</EMPLOYEE Qualification>

<WRITING CHARACTER IN XML DOCUMENT>XML</WRITING CHARACTER IN XML DOCUMENT>

</r:RECORD>

</EMPLOYEE>

Assembly Information : Getting Permission set of the assembly

The basics of CAS is whenever any code is being executed in managed world the .NET runtime verifies whether that code is allowed or not based on evidence and set of permissions. Two important things that are very much importance to the framework is:

Evidence:- From where the code comes? Is the code managed or unmanaged.

  << Prev: Using XMLWriter class to Write XML document in C sharp

Next: Creating your own Permission Set >>

Page 296: c#basics

Permissions:- The permission set on which the code executes.

 

 

Permissions and Permission Sets

Permission is what a code can do with particular resource like File, Registry etc., and Permission Set is collection of permission.

 

Policy Levels

NET System comes up with 4 Policies that are Enterprise , Machine User, and AppDomain (which can be done through programmatically). Each policy has multiple code groups and multiple permission sets.They have the hierarchy given below.

 

Enterprise : All managed code in an enterprise setting.

Machine: All managed code on the computer.

Page 297: c#basics

User: Code in all processes associated with the current user.

Application Domain: Managed code in the host's application domain.

 

Example:- To get the permission set of Current Assembly.

 

Form13.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Threading;

using System.Diagnostics;

using System.Reflection;

using System.Security;

using System.Security.Policy;

Page 298: c#basics

using System.Security.Permissions;

using System.Collections;

 

namespace _CSharpApplication

{

  public partial class Form13 : Form

    {

    //NAME OF THE BUILD_IN NAMED PERMISSION SET FOR FULLTRUST.

    const string sFullTrust = "FullTrust" ;

    static PermissionSet finalSet = new NamedPermissionSet ( "FinalAssemblySet" );

    static PermissionSet permSet = null ;

    //FIND OUT WHETHER THIS ASSEMBLY IS FULLTRUST PERMISSIONS.

    static bool fullTrust = true ;

    public Form13()

        {

    InitializeComponent();

        }

    private void Form13_Load( object sender, EventArgs e)

Page 299: c#basics

        {

        }

    //FIGURE OUT THE CODEGROUP AND THE POLICY LEVEL OF THE ASSEMBLY.

    static bool isResGroups( CodeGroup _codeGroupparent, PolicyLevel _policyLevel)

        {

            NamedPermissionSet _namedPermissionSet = _policyLevel.GetNamedPermissionSet(     _codeGroupparent.PermissionSetName);

      if (isFullTrust(_namedPermissionSet)) return true ;

      if (permSet == null ) permSet = ( PermissionSet )_namedPermissionSet;

      else permSet = permSet.Union(_namedPermissionSet);

      if (_codeGroupparent.Children.Count > 0)

            {

        foreach ( CodeGroup cp in _codeGroupparent.Children)

                {

            if (cp.Children.Count > 0)

                            isResGroups(cp, _policyLevel);

            else

                        {

Page 300: c#basics

                            NamedPermissionSet nps2 = _policyLevel.GetNamedPermissionSet( cp.PermissionSetName);

               if (isFullTrust(nps2))

                return true ;

                              permSet = permSet.Union(nps2);

                        }

                }

            }

    //FULL TRUST CODE NOT FOUND

    return false ;

    }

    //CHECK WHETHER THE PERMISSION SET IF FULLTRUST OR NOT FOR THE CURRENT ASSEMBLY.

    static bool isFullTrust( NamedPermissionSet _namedPermissionSet)

        {

        if (_namedPermissionSet.Name.Equals( "FullTrust" ))

            return true ;

        return false ;

        }

    //PASS THE PERMISSION SET AND LISTBOX AS ARGUMENT TO THE FUNCTION.

Page 301: c#basics

    static void getOutput( PermissionSet _permissionSet, ListBox _listBox)

        {

            IEnumerator psEnumerator = _permissionSet.GetEnumerator();

      while (psEnumerator.MoveNext())

                _listBox.Items.Add(psEnumerator.Current);

        }

    private void button1_Click( object sender, EventArgs e)

        { //Fetching the Permission Set of the Assembly

        lstPermission.Items.Add( "List of permissions assign to current assembly" );

        IEnumerator policy = SecurityManager .PolicyHierarchy();

    while (policy.MoveNext())

        {

            PolicyLevel currentLevel = ( PolicyLevel )policy.Current;

            CodeGroup group = currentLevel.ResolveMatchingCodeGroups ( Assembly .GetExecutingAssembly().Evidence);

            fullTrust &= isResGroups(group, currentLevel);

      if (!fullTrust)

            {

        if (finalSet == null ) finalSet = permSet;

        else finalSet = finalSet.Intersect(permSet);

Page 302: c#basics

                permSet = null ;

            }

        else

            {

                lstPermission.Items.Add( "Current Level-" + currentLevel.Label + " || " + "Group--" +     group.Name + " || " + "Group Policy--" + group.PermissionSetName);

            }

        }

    if (fullTrust)

            lblMode.Text = "Assembly is running in full-trust mode." ;

    else

            getOutput(finalSet, lstPermission);

        }

    }

}

 

 

Output:

 

Page 303: c#basics

 

Clicking on the “Assembly Information” button.

Creating your own Permission Set

User can also create their own permission sets and code groups in the C#. The following are the steps needs to follow to create your own permission sets and code groups:-

 

Steps to create your own permission set and Code group

 

1. Go to Control Panel --> Administrative Tools --> Microsoft .NET Framework 2.0 Configuration à Double click on this a popup windows appear

 

 

2. Creating a new Permission Set à Expand “Runtime Security Policy”.

  << Prev: Assembly Information : Getting Permission set of the assembly

Next: Using C sharp Socket >>

Page 304: c#basics

There are 3 security policy levels i.e. Enterprise , Machine and User. We are creating the permission set for the machine security level.

 

 

3. Assign the permission to the permission set: Each permission set is a collection of much different permission to various resources on the computer. Select the permission that you need in the permission set.

 

 

4. Here I am selecting the “File IO” permission from the pool of permission set. And then change the settings for this permission. Here specify the “C:\” in the file path and assign only reading permission to this.

 

 

5. Here we assign 3 permission to the newly create permission set i.e. File IO, Security and User Interface.

 

 

Page 305: c#basics

Create New Code Group

Create new code group and assign the permission that you create to this code group so that your assembly will work under the specified permission set. Right click on the All_Code node and this will open a pop-up window i.e. Create Code Group wizard. Specify the name for your code group.

 

 

1. Choose a condition type for the code group:

The membership condition determines whether or not an assembly meets specific requirements to get the permission associated with a code group.

Condition type in the specified context: Strong Name. You have to just click on the Import button à Select the assembly from the pop-up and this will extract the information that we needed.

 

 

 

 

2. Assign a Permission Set to the code group:

Here through this window we can assign the permission set to this code group that we are going to create. Select the permission set that we created earlier. Though this window either we can create new permission set or

Page 306: c#basics

reuse the existing one.

 

 

3. Go through the properties of the newly created Code Group

Right click on the code group that you just created and you can view the “Code Group ” properties like the Code Group Name, its membership conditions and permission set that is associated to it.

 

 

 

Create an Application: That will perform read and write operations on file.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

Page 307: c#basics

using System.Windows.Forms;

using System.IO;

 

namespace winCreatingPSET

{

  public partial class Form1 : Form

    {

    public Form1()

        {

    InitializeComponent();

        }

    private void button2_Click( object sender, EventArgs e)

        { //Writing to the Document

            StreamWriter _streamWriter = new StreamWriter ( "c:\\TestPermission.txt" );

      _streamWriter.WriteLine( " Security is Important" );

      _streamWriter.WriteLine( " Security can provide Authentication " );

      _streamWriter.Close();

        }

    private void button1_Click( object sender, EventArgs e)

Page 308: c#basics

        { //Reading from the Document

            StreamReader _streamWriter = new StreamReader ( "c:\\TestPermission.txt" );

            lstPSET.Items.Add(_streamWriter.ReadLine());

            lstPSET.Items.Add(_streamWriter.ReadLine());

      _streamWriter.Close();

         }

    }

}

 

Output:

Now run the application and try to click on the “write” button the screen, this will give you following exception.:-

Using C sharp Socket

The System.Net.Sockets namespace contains the classes that provide the actual .NET interface to the low-level Winsock APIs. This section gives a brief overview of the C# Socket class. The core of the System.Net.Sockets namespace is the Socket class. It provides the C# managed code implementation of the Winsock API. The Socket class constructor is as follows:

  << Prev: Creating your own Permission Set

Page 309: c#basics

Socket(AddressFamily af , SocketType st , ProtocolType pt )

As you can see, the basic format of the Socket constructor mimics the original Unix socket() function. It uses three parameters to define the type of socket to create:

An AddressFamily to define the network type

A SocketType to define the type of data connection

A ProtocolType to define a specific network protocol

Each of these parameters is represented by a separate enumeration within the System.Net_.Sockets namespace. Each enumeration contains the values that can be used. For normal IP communications on networks, the AddressFamily.InterNetwork value should always be used for the AddressFamily. With the InterNetwork AddressFamily, the SocketType parameter must match a particular ProtocolType parameter. You are not allowed to mix and match SocketTypes and ProtocolTypes.

 

Socket Properties: Several properties of the Socket class can be used to retrieve information from a created Socket object

Page 310: c#basics

Property Description

Page 311: c#basics

AddressFamily Gets the address family of the Socket

Blocking Gets or sets whether the Socket is in blocking mode

LocalEndPoint Gets the local EndPoint object for the Socket

Connected Gets a value that indicates if the Socket is connected to a remote device

RemoteEndPoint Gets the remote EndPoint information for the Socket

SocketType Gets the type of the Socket

Handle Gets the operating system handle for the Socket

ProtocolType Gets the protocol type of the Socket

Available Gets the amount of data that is ready to be read

Introduction to Socket Exceptions:

One feature of socket programming included in .NET Framework is neither used by Unix nor the Winsock API is socket exceptions. All of the Socket

Page 312: c#basics

class methods use the SocketException exception. Any socket programming you do should always check for SocketException exceptions and then attempt to recover from the error, or at least warn the user of the problem.

Example: Demonstrate Socket Properties and Socket Exception Handling

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Net;

using System.Net.Sockets;

 

 

namespace _CSharpApplication

{

  public partial class Form5 : Form

    {

Page 313: c#basics

    public Form5()

        {

    InitializeComponent();

        }

 

    private void button1_Click( object sender, EventArgs e)

        { // Demonstrate Socket Properties

            IPAddress _ipAddress = IPAddress .Parse( "127.0.0.1" );

            IPEndPoint _ipEndPoint = new IPEndPoint (_ipAddress, 8000);

            Socket _socketTest = new Socket ( AddressFamily .InterNetwork, SocketType .Stream, ProtocolType .Tcp);

            lstSocketProperties.Items.Add( "AddressFamily :: " + _socketTest.AddressFamily);

            lstSocketProperties.Items.Add( "SocketType :: " + _socketTest.SocketType);

            lstSocketProperties.Items.Add( "ProtocolType :: " + _socketTest.ProtocolType);

            lstSocketProperties.Items.Add( "Blocking :: " +_socketTest.Blocking);

            _socketTest.Blocking = false ;

            lstSocketProperties.Items.Add( "new Blocking :: " + _socketTest.Blocking);

Page 314: c#basics

            lstSocketProperties.Items.Add( "Connected :: " + _socketTest.Connected);

            _socketTest.Bind(_ipEndPoint);

            IPEndPoint _newIpEndPoint = ( IPEndPoint )_socketTest.LocalEndPoint;

            lstSocketProperties.Items.Add( "Local EndPoint :: " + _newIpEndPoint.ToString());

            _socketTest.Close();

        }

 

    private void button2_Click( object sender, EventArgs e)

        { //Socket Exceptions

            IPAddress _hostIPAddress = IPAddress .Parse( "192.168.1.1" );

            IPEndPoint _hostIPEndPoint = new IPEndPoint (_hostIPAddress, 8000);

            Socket _socket = new Socket ( AddressFamily .InterNetwork, SocketType .Stream, ProtocolType .Tcp);

      try

            {

                _socket.Connect(_hostIPEndPoint);

            }

      catch ( SocketException e1)

Page 315: c#basics

            {

                lstSocketExceptions.Items.Add( "Problem Connecting To Host ........" );

                lstSocketExceptions.Items.Add(e1.ToString());

                _socket.Close();

        return ;

            }

      try

            {

                _socket.Send( Encoding .ASCII.GetBytes( "testing" ));

            }

      catch ( SocketException ex)

            {

                lstSocketExceptions.Items.Add( "Problem Sending Data" );

                lstSocketExceptions.Items.Add(ex.ToString());

                _socket.Close();

        return ;

            }

            _socket.Close();

        }

Page 316: c#basics

    }

 }


Recommended