Professional Documents
Culture Documents
1.
2.
3.
4.
5.
6.
7.
Static variables.
Variable of instance.
Array's elements.
Parameters given by reference.
Parameters given by value.
Returned values.
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
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;
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:
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;
}
}
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;
}
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: onedimensional, 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.
// 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.
You can get the strings of Microsoft Intermediate Language code using
ILDasm:
.maxstack 2
.locals init ([0] float64 volume,
[1] float64 CS$00000003$00000000)
IL_0000: ldarg.0
IL_0001: ldfld float64 OOP.Aperture::height
IL_0006: ldarg.0
IL_0007: ldfld float64 OOP.Aperture::width
IL_000c: mul
IL_000d: ldarg.0
IL_000e: ldfld float64 OOP.Aperture::thickness
IL_0013: mul
IL_0014: stloc.0
IL_0015: ldloc.0
IL_0016: ldc.r8 0.0
IL_001f: bge.un.s IL_002d
IL_0021: ldc.r8 0.0
IL_002a: stloc.1
IL_002b: br.s IL_0031
IL_002d: ldloc.0
IL_002e: stloc.1
IL_002f: br.s IL_0031
IL_0031: ldloc.1
IL_0032: ret
} // end of method Aperture::GetVolume
OOP & C#
The skeleton of object - oriented programming is of course the concepts of
1. Encapsulation
2. Inheritance
3. 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.
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
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:
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.
using System;
namespace OutNamespace
{
namespace WorkNamespace
{ /// can be placed some classes, structures etc.
}
}
class WorkItem
{
public WorkItem()
{
}
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 ?
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
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 prebuilt 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 .NETcompliant language to execute its code. At the time of writing, these languages
included VB .Net, C# and C++ .NET, but any language can become .NETcompliant, if they follow CLS rules. The following sections will address each of
the parts of the architecture.
.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 .NETcompliant 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 higherlevel languages, such as C#, that one can use. Before the code is executed, the
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.
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.
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;
}
Now, the function CalculateBirthYear can even modify the value of year as it is
passed by reference.
Property in C#:
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.
class Hello
{
public static void main(String args[])
{
System.out.println("Hello");
}
}
class Hello
{
Hello()
{
// 0 0:aload_0
// 1 1:invokespecial #1 <Method void Object()>
// 2 4:return
}
using System;
class Hello
{
public static void Main(string[] args)
{
Console.WriteLine("Hello");
}
}
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
[AttributeUsage(AttributeTargets.All)]
public class ProductInfo : System.Attribute
{
public ProductInfo(double version,string name)
{
m_version = version;
m_authorName = name;
}
public double Version
{
get { return m_version; }
}
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);
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.
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.
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#.
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:
if(mailAddress.IndexOf(symbol)==-1)
{
Console.WriteLine("The string entered is not a valid email address");<br>
throw(new TextException());
}
}
}
try
{
MailValidator.TestEnteredMail(Console.ReadLine());
}
catch(TextException)
{
Console.WriteLine("Exception was passed");
}
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.
}
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))
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
}
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.
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:
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
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:
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 Interop
The 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.
.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;
}
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();
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 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:
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_Value
HR = Home_Tax_Rate
GS = Gross_Sales
GR = Gross_Sales_Tax_Rate
PI = 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 value
ELSE
If YOU_DO_NOT_OWN_YOUR_OWN_HOME and OWN_A_BUSINESS
THEN
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
ENDIF
ENDIF
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 rates
public static double TaxCalc(double pamt1, double prate1, double pamt2,
double prate2)
{
double taxamt;
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 rate
public 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 amount
public 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 compiletime 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 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;
Conclusion
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.
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.
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.
public SampleConstructor()
{
ns=100;
s=200;
}
}
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.
Syntax:
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
{
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 ());
}
}
}
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
{
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);
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 ;
}
}
Output
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.
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
{
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
{
// 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 " );
}
}
}
}
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" );
}
}
}
}
Example Explanation:
Syntax:
Class classname {
//Variable declaration
// Method declaration
}
Constructors
Destructors
Fields
Methods
Properties
Indexers
Delegates
Events
Nested Classes.
Default Constructor
Parameterized Constructor
Copy Constructor
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.
TestDemo.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace cSHARPEXAMPLES
{
public class TestDemo
{
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.
}
}
}
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();
}
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:
Here, we can add and modify the methods of the existing class.
Types of Inheritance:
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:
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.
DerivedClass7.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace cSHARPEXAMPLES
{
public class parentClass7
{
String str = "Parent:::" ;
public parentClass7() {
str = "Parent Constructor" ;
}
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();
}
}
}
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()
{
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:
Types of polymorphism
1. Compile Time Polymorphism
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.
E.g.
If we need to add two matrix of 3X3
Matrix result = Matrix.Add(mat1, mat2); // this doesn't give any relevant
information
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}
}
BaseClass8.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace cSHARPEXAMPLES
{
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
{
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;
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();
}
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
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.
return name;
name = value;
2.
Another way to declare:
class PropertyDemo {
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:
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.
ClsProperty9.cs
using System;
usingusing System.Collections.Generic;
using System.Text;
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)
{
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
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
Output:
ClsIndexers10.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace cSHARPEXAMPLES
{
class ClsIndexers10
{
private String [] arrString;
private int arrSize;
}
}
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()
{
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++)
{
Output:
Structs is value-type user defined data type same as int, float, bool etc.
Structs features:
ClsStruct11.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace cSHARPEXAMPLES
{
interface ITest
{
string Test();
}
class ClsStruct11
{
public String display()
{
Form11.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 Form11 : Form
{
public Form11()
{
InitializeComponent();
}
Output:
Clicking On Both the Buttons: The concept behind the structs will be
executed and displayed.
Syntax:
Interface InterfaceName {
// method signature
}
ClsInterface12.cs
using System;
using System.Collections.Generic;
using System.Text;
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;
}
Form12.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 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 = "" ;
label2.Text = "" ;
label3.Text = "" ;
}
}
}
Output:
Delegates features:
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.
ClsDelegate13.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace cSHARPEXAMPLES
{
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);
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
Output:
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 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.
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();
}
Output:
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.
Examples of Attributes:-
[ 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
The following is the screen appeared when run the form 15 program in the
source.
ClsAttribute15.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace cSHARPEXAMPLES
{
class ClsAttribute15
{
[ Obsolete ]
public String firstDeprecatedFX()
{
[ ObsoleteAttribute ]
public String secondDeprecatedFX()
{
return "Call secondDeprecatedFX" ;
}
}
}
Form15.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 Form15 : Form
{
public Form15()
{
InitializeComponent();
}
private void button1_Click( object sender, EventArgs e)
{ //Attribute : use to create method deprecated
ClsAttribute15 obj = new ClsAttribute15 ();
obj.firstDeprecatedFX();
//Deprecated Methods
obj.secondDeprecatedFX();
MessageBox .Show(obj.thirdDeprecatedFX());
}
}
}
Output:
Advantages of Enums:-
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.
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,
Tuesday,
Wednesday,
Thursday=10,
Friday,
Saturday,
Sunday
}
Note:-
For any other literal, if the value is unassigned then the value set is
greater than the value of the preceding literal.
ClsEnum16.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace cSHARPEXAMPLES
{
enum DayOfWeek {
Monday,
Tuesday,
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;
}
}
}
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();
}
private void button1_Click( object sender, EventArgs e)
{ //Create and use Enums
ClsEnum16 obj = new ClsEnum16 ();
MessageBox .Show(obj.CreateAndUseEnumType());
}
Output
Click On: Enter Enum value from user Button
Advantages of Encapsulation
The following table will give the description of the Access modifiers
available in C#.
Access Modifier
Private
Protected
Internal
Protected Internal
Public
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.
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.
2] Abstract Members
public abstract string displayname();
Note:- The abstract methods can only include the signature of the method.
ClsEncapsulation17.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace cSHARPEXAMPLES
{
class Customer
{
public void CustomerRecord()
{
AddNewRecord();
UpdateExistingRecord();
DeleteRecord();
}
protected virtual string AddNewRecord()
{ return "Base: AddNewRecord" ; } //ADD NEW RECORD
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;
}
}
//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 = "" ;
Output
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.
Passing by Value
Passing by Reference
Output' Parameter.
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; }
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)
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
{
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 " +
_initialValue.ToString());
passValueByReferenceType( ref _initialValue);
textBox2.Text = _initialValue.ToString();
MessageBox .Show( "After Calling " +
_initialValue.ToString());
}
r, EventArgs e)
{ //Out
bool _bValue;
int _initialValue = Int16 .Parse(textBox3.Text);
bValue = true ;
else
bValue = false ;
iV = iV * 20;
}
}
}
OutPut:
Introducing ADO.NET
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.
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;
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
{
SqlConnection con = null ;
string conStr = "" ;
int _ExistFlag = 0;
conStr = "Data Source=localhost;initial
catalog=TestDB;uid=sa;pwd=sa" ;
}
}
/*
* 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;
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;
}
}
}
Output:
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.
using System;
using System.Collections.Generic;
using System.Text;
namespace _CSharpApplication
{
class ClsOverLoadUnaryPlus
{
public int X;
public int Y;
NewObj.Y = RValue.Y;
return NewObj;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace _CSharpApplication
{
class ClsOverLoadingUnaryMinus
{
public int X;
public int Y;
public static ClsOverLoadingUnaryMinus operator (
ClsOverLoadingUnaryMinus RValue)
{
using System;
using System.Collections.Generic;
using System.Text;
namespace _CSharpApplication
{
class ClsOverloadingIncrement
{
public int X;
public int Y;
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)
{
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
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
MessageBox.Show((objUnaryMinus.X).ToString());
MessageBox.Show((objUnaryMinus.Y).ToString());
objUnaryMinus = -objUnaryMinus;
MessageBox.Show((objUnaryMinus.X).ToString());
MessageBox.Show((objUnaryMinus.Y).ToString());
}
Output:
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:
ClsOverloadingBooleanOpertors.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace _CSharpApplication
{
class ClsOverloadingBooleanOpertors
{
public int X;
public int Y;
}
}
ClsOverloadingConversion.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace _CSharpApplication
{
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);
ClsOverloadingEqualityInequality.cs
using System;
using System.Collections.Generic;
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 ;
}
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;
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();
}
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." );
}
}
}
Output:
ClsOverloadingBooleanOpertors.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace _CSharpApplication
{
class ClsOverloadingBooleanOpertors
{
public int X;
public int Y;
{
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;
public int Y;
ClsOverloadingEqualityInequality.cs
using System;
using System.Collections.Generic;
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 ;
}
public override int GetHashCode()
{
return 0;
}
Form3.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
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
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." );
}
}
}
IPAddress Methods:-
Method
Description
Compares two IP addresses.
Equals
Returns a hash value for an IPAddress object.
GetHashCode
Returns the type of the IP address instance.
GetType
Converts an IP address from host byte order to
HostToNetworkOrder network byte order.
IsLoopBack
ToString
PEndPoint Methods:
Method
Description
Creates an EndPoint object from a SocketAddress object
Create
Returns the type of the IPEndPoint instance
GetType
Compares two IPEndPoint objects
Equals
Serialize
ToString
GetHashCode
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
namespace _CSharpApplication
{
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
}
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());
}
Output:
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.
Domain
Description
U.S. military sites
.mil
Commercial organizations
.com
Educational institutions
.edu
U.S. government organizations
.gov
Internet Service Providers (ISPs)
.net
Other U.S. organizations (such as local governments)
.us
Nonprofit organizations
.org
Canadian organizations
.ca
German organizations
.de
Organizations from other countries
[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
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
Data Value
DatabasePath
Domain
NameServer
Description
Hostname
SearchList
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.
using System.Collections.Generic;
using System.ComponentModel;
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();
}
{ //Demonstrate DNS..
string _hostName = Dns .GetHostName();
lstDNS.Items.Add( "Local hostname :: " + _hostName);
IPHostEntry _ipHostEntry = Dns .GetHostByName(_hostName);
foreach ( IPAddress _address in _ipHostEntry.AddressList)
{
lstDNS.Items.Add( "IP Address ::" + _address.ToString());
}
}
}
string serverlist = ( string )
DNSserverKey.GetValue( "NameServer" );
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
and fulfill your own unique character encoding requirements. The following
table will summarize the properties of the class:-
Name
Type
Purpose
Close
Flush
Seek
Write
BinaryReader
The BinaryReader class, much like the BinaryWriter class, relies on a
FileStream object to read files .
Method
Close
PeekChar
ReadBoolean
Description
Reads the next available byte from the stream but does not
advance the byte or character position within the file.
ReadByte
ReadChar
ReadInt16
ReadInt32
ReadInt64
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 _CSharpApplication
{
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
.OpenOrCreate,
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();
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)
{
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.
Use the /doc option of the C# compiler to specify the name of the file
that should contain the generated XML documentation.
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
/// </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 .
ProgramHelpFile.xml
<?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>
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>
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
security configuration of machine does not allow the program to delete a
file.
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.
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.
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 pointthe 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.
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.
States:
Threads have several operational states, which are enumerated using the
.NET Thread State enumeration, found in the System.Threading namespace.
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.
Join (): Blocks the calling thread until the thread terminates.
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
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()
{
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);
}
}
void SecondMethod()
{
int i;
for (i = 0; i < 10; i++)
{
Console.WriteLine( " Second thread2: {0}" , i);
Thread .Sleep(3000);
}
}
}
}
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.
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 .
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)
{
Note:- If you've never open Windows registry, you can see it by running
regedit from command line
Registry Class:
The Registry class contains members to provides access to registry keys. We
can define registry keys in the following order.
ClassesRoot
DynData
CurrentUser
Users
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.
Methods:
GetValue
OpenSubKey
Opens a subkey.
DeleteSubKey
CreateSubKey
SetValue
DeleteValue
Close
Form1.cs
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();
}
}
The coming section will discuss about some more classes used for
Globalization in C#.
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:-
ResourceWriter
This class under the System.Resources namespace is used to create the
resource file through the programming. The below example will create the
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Threading;
using System.Globalization;
using System.Resources;
namespace ConsoleApplication1
{
class Program1
{
static void Main ( string [] args)
{
ResourceWriter rw = new ResourceWriter ( "RWDemo.resources" );
Output:
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.
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.
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
{
public Form22()
{
InitializeComponent();
}
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
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.
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();
}
FileMode
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
"answer" to the client in XML format. Web services have all the advantages
of components plus many more.
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
//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" ;
}
}
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 .
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.
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 .
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].
MyWebService.disco
MyWebService.discomap
MyWebService.wsdl
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;
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.
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.
Types a container for data type definitions using some type system
(such as XSD).
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.
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.
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.
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:
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.
/out: filename the filename of the Proxy class.
1. Clicking Ok will include the proxy class to the solution under Bin
folder.
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.
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;
}
protected void btnCustomer_Click( object sender, EventArgs e)
{ //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:
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 Form10 : Form
{
public Form10()
{
InitializeComponent();
}
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.
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();
}
}
}
}
Output: The following screen will be displayed when run the above
program.
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 Form12 : Form
{
public Form12()
{
InitializeComponent();
}
try
{
//CREATE NEW FILE
XmlTextWriter xmlWRITER = new XmlTextWriter
( "C:\\writeEmployeeRecordInXML1.xml" , null );
//OPEN DOCUMENT FOR WRITING
xmlWRITER.WriteStartDocument();
//WRITE COMMENTS
xmlWRITER.WriteComment( "Commentss: START DATE : 21OCT-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);
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***********" );
}
catch ( Exception ex) {
MessageBox .Show(ex.Source);
}
}
}}
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-->
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:
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.
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;
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)
{
}
//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
{
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.
static void getOutput( PermissionSet _permissionSet, ListBox _listBox)
{
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:
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:-
5. Here we assign 3 permission to the newly create permission set i.e. File
IO, Security and User Interface.
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.
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 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)
{ //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.:-
Socket Properties:
Several properties of the Socket class can be used to retrieve information
from a created Socket object
Property
AddressFamily
Description
Blocking
LocalEndPoint
Connected
RemoteEndPoint
SocketType
Handle
ProtocolType
Available
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
{
public Form5()
{
InitializeComponent();
}
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();
}
}
}