Pages
    Calender
    <<  March 2010  >>
    MoTuWeThFrSaSu
    22232425262728
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234
    Ajander Singh , Created On 7. March 2009, 05:29

    As you know, a variable of a value type can never be null; it always contains the value type's value itself. In fact, this is why they call value types value types. Unfortunately, there are some scenarios in which this is a problem.

    Examples:

    Case 1: When designing a database, it's possible to define a column's data type to be a 32-bit integer that would map to the FCL's Int32 data type. But a column in a database can indicate that the value is nullable. That is, it is OK to have no value in the row's column. Working with database data by using the Microsoft .NET Framework can be quite difficult because in the common language runtime (CLR), thereis no way to represent an Int32 value as null.

    Case 2:  In Java, the java.util.Date class is a reference type, and therefore, a variable of this type can be set to null. However, in the CLR, a System.DateTime is a value type, and a DateTime variable can never be null. If an application written in Java wants  to communicate a date/time to a Web service running the CLR, there is a problem if the Java application sends null because the CLR has no way to represent this and operate on it.

    To improve this situation, Microsoft added the concept of nullable value types to the CLR. To understand how they work, we first need to look at the System.Nullable<T> class, which is defined in the FCL. Here is the logical representation of how the System.Nullable<T> type is defined:

     using System;
    namespace System
    {
        using System.Globalization;
        using System.Reflection;
        using System.Collections.Generic;
        using System.Runtime.CompilerServices;
        using System.Security;

        // Warning, don't put System.Runtime.Serialization.On*Serializ*Attribute
        // on this class without first fixing ObjectClone::InvokeVtsCallbacks
        // Also, because we have special type system support that says a a boxed Nullable<T>
        // can be used where a boxed<T> is use, Nullable<T> can not implement any intefaces
        // at all (since T may not). Do NOT add any interfaces to Nullable!
        //
        [TypeDependencyAttribute("System.Collections.Generic.NullableComparer`1")]
        [TypeDependencyAttribute("System.Collections.Generic.NullableEqualityComparer`1")]
        [Serializable()]
        public struct Nullable<T> where T : struct
        {
            private bool hasValue;
            internal T value;

            public Nullable(T value)
            {
                this.value = value;
                this.hasValue = true;
            }

            public bool HasValue
            {
                get { return hasValue; }
            }

            public T Value
            {
                get
                {
                    if (!HasValue)
                    {
                        ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
                    }
                    return value;
                }
            }

            public T GetValueOrDefault()
            {
                return value;
            }

            public T GetValueOrDefault(T defaultValue)
            {
                return HasValue ? value : defaultValue;
            }

            public override bool Equals(object other)
            {
                if (!HasValue)
                    return other == null;
                if (other == null)
                    return false;
                return value.Equals(other);
            }

            public override int GetHashCode()
            {
                return HasValue ? value.GetHashCode() : 0;
            }

            public override string ToString()
            {
                return HasValue ? value.ToString() : "";
            }

            public static implicit operator Nullable<T>(T value)
            {
                return new Nullable<T>(value);
            }

            public static explicit operator T(Nullable<T> value)
            {
                return value.Value;
            }

            // The following already obsoleted methods were removed:
            // public int CompareTo(object other)
            // public int CompareTo(Nullable<T> other)
            // public bool Equals(Nullable<T> other)
            // public static Nullable<T> FromObject(object value)
            // public object ToObject()
            // public string ToString(string format)
            // public string ToString(IFormatProvider provider)
            // public string ToString(string format, IFormatProvider provider)

            // The following newly obsoleted methods were removed:
            // string IFormattable.ToString(string format, IFormatProvider provider)
            // int IComparable.CompareTo(object other)
            // int IComparable<Nullable<T>>.CompareTo(Nullable<T> other)
            // bool IEquatable<Nullable<T>>.Equals(Nullable<T> other)
        }
    }

    As you can see, this class encapsulates the notion of a value type than can also be null. Since Nullable<T>  is itself a value type, instances of it are still fairly lightweight. That is, instances can still be on the stack, and an instance is the same size as the original value type plus the size of a Boolean field. Notice that Nullable's type parameter, T, is constrained to struct. This was done because reference type variables can already be null.

    So now, if you want to use a nullable Int32 in your code, you can write something like this:

    Nullable<Int32> x = 5;
    Nullable<Int32> y = null;
    Console.WriteLine("x: HasValue={0}, Value={1}",
    x.HasValue, x.Value);
    Console.WriteLine("y: HasValue={0} , Value={1}",
    y.HasValue, y.GetValueOrDefault());


    When I compile and run this code, I get the following output:

    x: HasValue=True, Value=5
    y: HasValue=False, Value=0

     

    C#'s Null-Coalescing Operator

    C# has an operator called the null-coalescing operator (??), which takes two operands. If the operand on the left is not null,  the operand's value is returned. If the operand on the left is null,  the value of the right operand is returned. The null-coalescing operator offers a very convenient way to set a variable's default value.

    A cool feature of the null-coalescing operator is that it can be used with reference types as well as nullable value types. Here is some code that demonstrates the use of the null-coalescing operator:

    private static void NullCoalescingOperator() {
        Int32? b = null;
        // The line below is equivalent to:
        // x = (b.HasValue) ? b.Value : 123
        Int32 x = b ?? 123;
        Console.WriteLine(x); // "123"
    }

     



    Be the first to rate this post

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

    The CLR has built-in support for nullable value types. This special support is provided for boxing, unboxing, calling GetType, and calling interface methods, and it is given to nullable types to make them fit more seamlessly into the CLR. This also makes them behave more naturally and as most developers would expect. Let's take a closer look at the CLR's special support for nullable types.

    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
    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
    Admin , Created On 29. September 2008, 17:07

    When you compile a program developed in language that target CLR, instead of compiling the source code into machine level code the compiler translate it into intermediate language. No matter which language is used to develop the application, it always gets translated in IL (Intermediate Language). This ensures language interoperability.

    •  In addition to translating the code into IL the compiler also produce the metadata during the process of compilation.
    • The IL and metadata are link an assembly.
    • The compiler creates the .EXE or .DLL file.
    • When you execute the .EXE or.DLL file, the converted into IL and all other relevant information from the base class library is sent to class loader. The class loader loads the code into the memory.
    • Before the code can be executed, the .NET Framework needs to convert IL into native or CPU specific code. The JUST IN TIME (JIT) Compiler translates the code from IL into managed native code. During the process of compilation the JIT compiler compiles only the code that is the required during execution instead of compiling the complete IL code when an uncompelled method is invoked the JIT compiler converts the IL for that method into native code. The process saves time and memory required to convert the complete IL into native code.
    • During JIT compilation the code is also check for type safety. Type safety ensure that objects are always are accessed in a compatible way.
    • After translating the IL into native code, the converted code is sent to the .NET runtime manager.
    • The .NET runtime manager executes the code. While executing the code the security check is performed to ensure the code has appropriate permission for accessing the available resources.


    Be the first to rate this post

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