Csharp/C Sharp/Data Types/Boxing Unboxing

Материал из .Net Framework эксперт
Версия от 11:45, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

A simple boxing/unboxing example

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/

// A simple boxing/unboxing example. 
using System; 
 
public class BoxingDemo { 
  public static void Main() { 
    int x; 
    object obj; 
 
    x = 10; 
    obj = x; // box x into an object 
 
    int y = (int)obj; // unbox obj into an int 
    Console.WriteLine(y); 
  } 
}


Automatic boxing and unboxing to pass an undetermined data type to a function

/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa
Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/
//  Obj.cs - Demonstrates automatic boxing and unboxing to pass an
//           undetermined data type to a function.
//           Compile this program with the following command line:
//               C:>csc Obj.cs
//
namespace nsObject
{
    using System;
    public class Obj
    {
        static public void Main ()
        {
            double d = 3.14159;
//  Pass a double to Square ()
            object o = Square (d);
            ShowSquare (o);
//  Pass an int to Square ()
            o = Square (42);
            ShowSquare (o);
//  Pass a float to Square ()
            o = Square (2.71828F);
            ShowSquare (o);
        }
//  Square () returns the boxed square of a value if the data type is
//  int or double. Otherwise, Square() returns a null reference
        static object Square (object o)
        {
            if (o is double)
                return ((double) o * (double) o);
            if (o is int)
                return ((int) o * (int) o);
            return (null);
        }
        static public void ShowSquare (object o)
        {
            if (Object.Equals (o, null))
                Console.WriteLine ("The object is null");
            else
                Console.WriteLine ("The square is " + o);
        }
    }
}


Boxing also occurs when passing values

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/

// Boxing also occurs when passing values. 
using System; 
 
public class BoxingDemo11 { 
  public static void Main() { 
    int x; 
    
    x = 10; 
    Console.WriteLine("Here is x: " + x); 
 
    // x is automatically boxed when passed to sqr() 
    x = BoxingDemo11.sqr(x); 
    Console.WriteLine("Here is x squared: " + x); 
  } 
 
  static int sqr(object o) { 
    return (int)o * (int)o; 
  } 
}


Boxing makes it possible to call methods on a value

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/

// Boxing makes it possible to call methods on a value! 
using System; 
 
public class MethOnValue { 
  public static void Main() { 
 
    Console.WriteLine(10.ToString()); 
 
  } 
}


Boxing struct object

 
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
struct MyPoint {
    public int x, y;
}
class Program {
    public static void UseThisObject(object o) {
        Console.WriteLine("Type of param: {0}", o.GetType());
        Console.WriteLine("Value of o is: {0}", o);
    }
    public static void BoxAndUnboxInts() {
        
        ArrayList myInts = new ArrayList();
        myInts.Add(88);
        myInts.Add(3);
        myInts.Add(9764);
        int firstItem = (int)myInts[0];
        Console.WriteLine("First item is {0}", firstItem);
    }
    public static void UseBoxedMyPoint(object o) {
        if (o is MyPoint) {
            MyPoint p = (MyPoint)o;
            Console.WriteLine("{0}, {1}", p.x, p.y);
        } else
            Console.WriteLine("You did not send a MyPoint.");
    }

    static void Main(string[] args) {
        int myInt = 99;
        UseThisObject(myInt);
        BoxAndUnboxInts();
        MyPoint p;
        p.x = 10;
        p.y = 20;
        UseBoxedMyPoint(p);
        UseBoxedMyPoint(1);
    }
}


explicit boxing of an int to an object

 
using System;
class MainClass {
    public static void Main() {
        int myInt2 = 10;
        object myObject = myInt2;  // myInt2 is boxed
        Console.WriteLine("myInt2 = " + myInt2);
        Console.WriteLine("myObject = " + myObject);

    }
}


explicit unboxing of an object to an int

 
using System;
class MainClass {
    public static void Main() {
        object myObject = 3;
        int myInt3 = (int)myObject;  // myObject is unboxed
        Console.WriteLine("myInt3 = " + myInt3);

    }
}


Illustrates boxing and unboxing

/*
Mastering Visual C# .NET
by Jason Price, Mike Gunderloy
Publisher: Sybex;
ISBN: 0782129110
*/
/*
  Example7_8.cs illustrates boxing and unboxing
*/
using System;
public class Example7_8
{
  public static void Main()
  {
    // implicit boxing of an int
    int myInt1 = 10;
    Console.WriteLine("myInt1.ToString() = " + myInt1.ToString());
    Console.WriteLine("myInt1.GetType() = " + myInt1.GetType());
    // explicit boxing of an int to an object
    int myInt2 = 10;
    object myObject = myInt2;  // myInt2 is boxed
    Console.WriteLine("myInt2 = " + myInt2);
    Console.WriteLine("myObject = " + myObject);
    // explicit unboxing of an object to an int
    int myInt3 = (int) myObject;  // myObject is unboxed
    Console.WriteLine("myInt3 = " + myInt3);
  }
}


implicit boxing of an int

 
using System;
class MainClass {
    public static void Main() {
        int myInt1 = 10;
        Console.WriteLine("myInt1.ToString() = " + myInt1.ToString());
        Console.WriteLine("myInt1.GetType() = " + myInt1.GetType());
    }
}


is and Box UnBox

/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa
Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/
namespace nsBox
{
    using System;
    struct Point
    {
        public Point (int x, int y)
        {
            cx = x;
            cy = y;
        }
        public override string ToString ()
        {
            return ("(" + cx + ", " + cy + ")");
        }
        public int cx;
        public int cy;
    }
    public class BoxUnBox
    {
        static public void Main ()
        {
            long LongVal = 9600;
            object o = LongVal;
            ShowObject (o);
            o = 4096;
            ShowObject (o);
            Point point = new Point (42, 96);
            ShowObject (point);
            clsBox test = new clsBox();
            ShowObject (test); 
        }
        static public void ShowObject (object o)
        {
            if (o is int)
                Console.WriteLine ("The object is an integer");
            if (o is long)
                Console.WriteLine ("The object is a long");
            else if (o is Point)
                Console.WriteLine ("The object is a Point structure");
            else if (o is clsBox)
                Console.WriteLine ("The object is a clsBox class object");
            Console.WriteLine ("The value of object is " + o + "\r\n");
        }
    }
    class clsBox
    {
        public override string ToString()
        {
            return ("\"-- clsBox --\"");
        }
    }       
}