日期:<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2008-6-13
学习内容:C#中各种数据类型的使用
遗留问题:
学习总结:
值类型和引用类型:
值类型:整型,布尔型,字符型,实型,结构型,枚举行
引用类型:类,对象,字符串,数组,接口,委托
1.  值类型
示例程序:
using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

namespace ConsoleApplication1

{

    class Program

    {

        public struct Student

        {

            public int Class;// 班级

            public String Specialy;// 专业

        }

        enum WeekDay

        {

            Mon=1,

            Tue,

            Wen,

            Thu,

            Fri,

            Sat,

            sun

        }

        static void Main(string[] args)

        {

            // 整型

            int Num = 9;

          

            // 布尔型

            bool b = true;

            // 字符型

            String str = " 我四" ;

            Char s = '1';

            // 实数类型

            float a = 99.9f;

            // 结构类型

            Student June;

            Student Mike=new Student();

            Mike.Class = 1;

            Mike.Specialy = "MBA";

            June = Mike;

            // 枚举类型

            WeekDay tody=WeekDay.Fri;

          

            Console.WriteLine("{0}",Num);

            Console.WriteLine("{0}",b);

            Console.WriteLine("{0}",str);

            Console.WriteLine("{0}",s);

            Console.WriteLine("{0}",a);

            Console.WriteLine("June 的班级是{0},专业是{1}" ,June.Class,June.Specialy);

            Console.WriteLine(" 今天是星期{0}" ,(int)tody);

        }

    }

}

需要注意到的知识点:
例如:99.9默认的是double型,要想把它声明为float型,需在99.9结尾+”f””F”
在结构类型中,他的引用方法和类的使用方法很相近,必须先new一个结构体的实例,然后再用这个事例调用结构体的方法并为其赋值,一个结构体的对象能给另外一个结构体的对象赋值
枚举类型不用new直接使用,注意类型中的第一个数据是从0号单元开始的

 

2.引用类型:
事例代码:
using System;

namespace ConsoleApplication2

{

    //class Main

    //{

    //    public void GetString()

    //    {

    //        Console.WriteLine(" 欢迎来到c#的世界!");

    //    }

    //}

    //class A:Main

    //{ }

    //class B:Main

    //{ }

    interface IGetString

    {

         String GetString();

    }

    class A : IGetString

    {

        public string GetString()

        {

            return" A" ;

        }

    }

    public class B : IGetString

    {

        public string GetString()

        {

            return " B" ;

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            // 字符串

            string src = @"D:\ 我的文挡\program.cs" ;

            char aaa=src[1];

            Console.WriteLine("{0}",src);

            Console.WriteLine("{0}",aaa);

            // 数组

            String[] name ={ " 张三" , " 王五" };

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

            {

                Console.WriteLine("{0}",name[i]);

            }

            // 声明类的实例

            A a = new A();

            B b = new B();

            // 声明接口的示例ia,ib

            IGetString ia = (IGetString)a;

            IGetString ib = (IGetString)b;

            Console.WriteLine("{0}",ia.GetString());

            Console.WriteLine("{0}", ib.GetString());

           //a.GetString();

           //b.GetString();

        }

    }

}

注意接口的继承和类的继承的方法,及他们的优缺点,接口一般在扩充系统的功能和开发组件的时候使用
值类型和引用类型的区别:
类型区分为这两大类的主要原因是在于执行性能与内存资源管理的不同。由于值类型变量直接在堆栈中存储该类型的值,此类类型在内存的使用上以及访问的效能上比引用类型更好。因为引用类型变量存放的是指向实际对象的指针,因此访问对象时必须多进行一次内存引用的操作方可获得数据。且引用类型的对象必须分配多余的内存来存放虚函数指针及线程同步块,对于内存的需求较大。而使用引用类型的优点是回收站会自动替您管理分配在托管堆当中的内存。

委托实力:

using System;

namespace ConsoleApplication3

{

    class Program

    {      // 委托    

         delegate string GetSting(string nameOne,string nameTwo);

         static string mainName(string nameOne,string nameTwo)

         {

           return nameOne+" " +nameTwo;

         }

        static void Main(string[] args)

        {

            string a = " 张三" ;

            string b = " 王五" ;

            GetSting getName = new GetSting(mainName);

            Console.WriteLine(" 今天的同学是:{0}," ,getName(a,b));

        }

    }

}

委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示:

C#

public delegate int PerformCalculation(int x, int y);

与委托的签名(由返回类型和参数组成)匹配的任何方法都可以分配给该委托。

委托具有以下特点:

  • 委托类似于 C++ 函数指针,但它是类型安全的。

  • 委托允许将方法作为参数进行传递。

  • 委托可用于定义回调方法。

  • 委托可以链接在一起;例如,可以对一个事件调用多个方法。

  • 方法不需要与委托签名精确匹配。

 

使用委托

委托是一种安全地封装方法的类型,它与 C C++ 中的函数指针类似。与 C 中的函数指针不同,委托是面向对象的、类型安全的和保险的。委托的类型由委托的名称定义。下面的示例声明了一个名为 Del 的委托,该委托可以封装一个采用字符串作为参数并返回 void的方法。

C#

public delegate void Del(string message);

构造委托对象时,通常提供委托将包装的方法的名称或使用匿名方法。实例化委托后,委托将把对它进行的方法调用传递给方法。调用方传递给委托的参数被传递给方法,来自方法的返回值(如果有)由委托返回给调用方。这被称为调用委托。可以将一个实例化的委托视为被包装的方法本身来调用该委托。例如:

C#

// Create a method for a delegate.
public static void DelegateMethod(string message)
{
    System.Console.WriteLine(message);
}

C#

// Instantiate the delegate.
Del handler = DelegateMethod;

// Call the delegate.
handler("Hello World");

由于实例化委托是一个对象,所以可以将其作为参数进行传递,也可以将其赋值给属性。这样,方法便可以将一个委托作为参数来接受,并且以后可以调用该委托。

何时使用委托而不使用接口

委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?

在以下情况中使用委托:

  • 当使用事件设计模式时。

  • 当封装静态方法可取时。

  • 当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。

  • 需要方便的组合。

  • 当类可能需要该方法的多个实现时。

在以下情况中使用接口:

  • 当存在一组可能被调用的相关方法时。

  • 当类只需要方法的单个实现时。

  • 当使用接口的类想要将该接口强制转换为其他接口或类类型时。

  • 当正在实现的方法链接到类的类型或标识时:例如比较方法。

 

如何:合并委托(多路广播委托)

本示例演示如何组合多路广播委托。委托对象的一个用途在于,可以使用 + 运算符将它们分配给一个要成为多路广播委托的委托实例。组合的委托可调用组成它的那两个委托。只有相同类型的委托才可以组合。

- 运算符可用来从组合的委托移除组件委托。

示例

C#

delegate void Del(string s);

class TestClass
{
    static void Hello(string s)
    {
        System.Console.WriteLine("  Hello, {0}!", s);
    }

    static void Goodbye(string s)
    {
        System.Console.WriteLine("  Goodbye, {0}!", s);
    }

    static void Main()
    {
        Del a, b, c, d;

        // Create the delegate object a that references
        // the method Hello:
        a = Hello;

        // Create the delegate object b that references
        // the method Goodbye:
        b = Goodbye;

        // The two delegates, a and b, are composed to form c:
        c = a + b;

        // Remove a from the composed delegate, leaving d,
        // which calls only the method Goodbye:
        d = c - a;

        System.Console.WriteLine("Invoking delegate a:");
        a("A");
        System.Console.WriteLine("Invoking delegate b:");
        b("B");
        System.Console.WriteLine("Invoking delegate c:");
        c("C");
        System.Console.WriteLine("Invoking delegate d:");
        d("D");
    }