Pages
    Ajander Singh , Created On 12. November 2008, 20:07

    The tradition of using Constants haven't changed much through the times of C++ and now C#, the implication is also the same. Looking deep into the working of Constatnts in C#, we can summarize that A constant is a symbol that has a never-changing value and when declaring a constant symbol. The value of constant as known as compile time and do not change, the compiler then saves the constant's value in the assembly's metadata. This means that you can define a constant only for t primitive types. In C#, the following types are primitives and can be used to define constants: Boolean, Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, and String.

    Constants are declared  as a field, using the const keyword before the type of the field. Constant must be initilized as they are declared because a constant are always considered to be part of defining type. Constant can be marked as public, private, protected, internal or protected internal. these access modifiers defines how users of the class can access constant.

    Note: Constant are always considerd to be static memberes not instance members. Definig a constant causes the creation of metadata. 

    Example:

    class Calendar

    {

        const int months = 12;

        const int weeks = 52;

        const int days = 365;

     

        const double daysPerWeek = days / weeks;

        const double daysPerMonth = days / months;

    Constants are accessed as if they were static fields, although they cannot use the static keyword. Expressions that are not contained within the class defining the constant must use the class name, a period, and the name of the constant to access the constant. For example:

    int birthstones = Calendar.months; 

    When code refer to const keyword or constant sysmbol, compiler loop up the sysmbol in the metadata of the assembly that defines the constant, extract the constant's value, and ambed value in the emitted IL code. Because a constant's value is embedded directly in code, constants don't require any memory to be allocated for them at run time. In addition, you can't get the address of a constant and you can't pass a constant by reference. These constraints also mean that constants don't have a good cross-assembly versioning story, so you should use them only when you know that the value of a symbol will never change.



    Be the first to rate this post

    • Currently 0/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5
    Admin , Created On 10. November 2008, 20:48

    The readonly keyword is a modifier that you can use on fields. When a field declaration includes a readonly modifier, assignments to the fields introduced by the declaration can only occur as part of the declaration or in a constructor in the same class. Compilers and verification ensure that readonly fields are not written to by any method other than a constructor. Note that reflection can be used to modify a readonly field

    In this example, the value of the field year cannot be changed in the method ChangeYear, even though it is assigned a value in the class constructor:

    class Age

    {

        readonly int _year;

        Age(int year)

        {

            _year = year;

        }

        void ChangeYear()

        {

            _year = 1967; // Will not compile.

        }

    }

    You can assign a value to a readonly field only in the following contexts:

    • When the variable is initialized in the declaration, for example:
      public readonly int y = 5;
    • For an instance field, in the instance constructors of the class that contains the field declaration, or for a static field, in the static constructor of the class that contains the field declaration. These are also the only contexts in which it is valid to pass a readonly field as an out or ref parameter.

    The readonly keyword is different from the const keyword. A const field can only be initialized at the declaration of the field. A readonly field can be initialized either at the declaration or in a constructor. Therefore, readonly fields can have different values depending on the constructor used. Also, while a const field is a compile-time constant, the readonly field can be used for runtime constants as in the following example:

    public static readonly uint l1 = (uint)DateTime.Now.Ticks;

    Also, in C#, there are some performance issues to consider when initializing fields by using inline syntax versus assignment syntax in a constructor. 



    Be the first to rate this post

    • Currently 0/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5

    As developers knows that many arithmetic operations on primitives types could result in an overflow:

    Byte b=100;
    b=(Byte) (b+200);       //b now contains 44 (2c in hex)

    In some cases silent overflow can give undesirable results, and if not detected causes the application to behave in strange and unusual ways. Many languages handles overflows in different ways. Like C and C++ allows overflow and is not considered as an error and allow the value to wrap; allows to application continues running. Microsoft visual basic always considers overflows to be an errors and throws an exception when it detects.

    The common language runtime (CLR) offers IL (Intermediate language) instructions that allow the compiler to choose the desired behavior. as you know the C# compiler generated IL has an add instruction as it the default behavior for C# to generate silent overflow. C# compiler use the /checked+ compiler switch to control the overflow, which tell the C# compiler to uses the safe version of the add with overflow check , add.ovf which will prevent this kind of silent overflow and throw OverflowException if overflow occur.

    C# allows the programmer to decide how overflow should be handled. as you know, By default overflow checking is turned off. this means that the compiler generates IL code by using the versions of the add, subtract, multiply, and conversion instructions that don't include overflow checking. as a result, the code runs faster but developers must be assured that overflows won't occur or that their code is designed to anticipate these overflows.

    If overflow occur, the CLR throws an OverflowException. You should design your application's code to handle this exception. Rather than have overflow checking turned off on or off globally, C# allows this flexibility by offering checked and unchecked operators. Simply checked operator tells the C# compiler to use the safe IL instruction for this operation , and the unchecked use the normal IL instructions (which is the normal behavior in C#).

    Here is an example that use checked operator:

    Byte b=100;
    b=checked((Byte)(b+200));                  //OverflowException is thrown

    If the Byte cast outside the checked operator, the exception wouldn't be occurred.

    b=(Byte)checked((b+200));                 //no OverflowException

    In addition to the checked and unchecked operators, C# also offers checked and unchecked statements. the statements cause all expressions within a block to be checked or unchecked:

    checked{
     Byte b=100;
     b=(Byte((b=200);
    }

    Now, try to turn on the compiler's switch /checked+ switch for debug build. Your application will run slowly because the system will be checking for overflow on any code that you didn't explicitly mark as checked and unchecked. If an exception occurs, you will be able to easily detect and be able to fix the bug in you application.



    Be the first to rate this post

    • Currently 0/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5
    Ajander Singh , Created On 5. October 2008, 20:17

    A String represents an immutable ordered set of characters. The String type is derived from Object, making it a reference type, and therefore, String objects (its array of characters) always live in the heap, never on a thread's stack. The String  type also implements several interface (IComparable/ IComparable<String>, ICloneable, IConvertible, IEnumerable/ IEnumerable<Char>, and IEquatable<String>). The String class is sealed no inheritance allowed and string is an alias for System.String in the .NET Framework.

    Once created, a string can never get longer, get shorter, or have any of its characters changed. It allows you  to perform operations on a string without actually changing the string. If you perform a lot of string manipulations, you end up creating a lot of String objects on the heap, which causes more frequent garbage collections, thus hurting your application's performance. To perform a lot of string manipulations efficiently, use the StringBuilder class.


    You can concatenate several strings to form a single string by using the C# + (plus) operator: 

    String  sObj=”Hi” + “  “ + “Gentleman”; 

    In this example all strings are literal strings so C# compiler concatenates them at compile time and end up just one string “Hi Gentleman” in the module's metadata. Using the + (plus)  operator on nonliteral strings causes the concatenation to be performed at run time. To concatenate several strings together at run time, avoid using the + operator as it creates multiple string objects on the garbage-collected heap. Instead, use the System.Text.StringBuilder type.


    Verbatim Strings (“@”)

    C# also offers a special way to declare a string in which all characters between quotes are considered part of the string. These special declarations are called verbatim strings and are typically used when specifying the path of a file or directory or when working with regular expressions. 

    // Specifying the pathname of an application 
    String file = "C:\\Windows\\System32\\pbrush.exe"; 

    // Specifying the pathname of an application by using a verbatim string 
    String file = @"C:\Windows\System32\pbrush.exe";

    The @ symbol before the string tells the compiler that the string is a verbatim string. In effect, this  tells the compiler to treat backslash characters as backslash characters instead of escape characters.



    Currently rated 4.0 by 1 people

    • Currently 4/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5
    Ajander Singh , Created On 9. June 2008, 01:08

    Using LINQ, we are able to create directly within the C# programming language entities called query expressions. These query expressions are based on numerous query operators that have been intentionally designed to look and feel very similar (but not quite identical) to a SQL expression. 

    Core LINQ assemblies:

     System.Core.dll

    Defines the types that represent the core LINQ API. This is the one assembly you must have access to. 

    System.Data.Linq.dll 

    Provides functionality for using LINQ with relational databases (LINQ to SQL). 

    System.Xml.Linq.dll 

    Defines a handful of types to integrate ADO.NET types into the LINQ programming paradigm (LINQ to DataSet). 

    System.Data.DataSetExtensions.dll 

    Provides functionality for using LINQ with XML document data (LINQ to XML). 


    First, A Taste of LINQ

        static void QueryOverStrings()
        {
            // Assume we have an array of strings.
            string[] currentVideoGames = {"Morrowind", "BioShock",
            "Half Life 2: Episode 1", "The Darkness",
            "Daxter", "System Shock 2"};
            // Build a query expression to represent the items in the array that have more than 6 letters.
            IEnumerable<string> subset = from g in currentVideoGames
            where g.Length > 6 orderby g select g;
            // Print out the results.
            foreach (string s in subset)
            Console.WriteLine("Item: {0}", s);
        }

     Query Expressions

            from itemName in srcExpr
            join itemName in srcExpr on keyExpr equals keyExpr
            (into itemName)?
            let itemName = selExpr
            where predExpr
            orderby (keyExpr (ascending | descending)?)*
            select selExpr
            group selExpr by keyExpr
            into itemName query-body




    Currently rated 4.0 by 2 people

    • Currently 4/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5