zoukankan      html  css  js  c++  java
  • C#编程(十二)----------函数

    类和结构

    类和结构实际上都是创建对象的模板 ,每 个对象都包含数据 ,并 提供了处理和访问数据的方法。

    类定义了类的每个对象 (称 为实例 )可 以包含什么数据和功能 。 

    例如 ,如 果 一 个类表示 一 个顾客 ,就可以定义字段 CustomerID、 FirstName、 LastNane和 Address,以 包含该顾客的信息 。还可以定义处理在这些字段中存储的数据的功能 。 接着 ,就 可以实例化表示某个顾客的类的对象 ,为 这个实例设置相关字段的值 ,并 使用其功能 。

    例如有一个PgoneCustomer类

    class PgoneCustomer

    {

    public const string DayOfSendingBill=”Monday”;

    public int CustomerID;

    public string FirstName;

    public string LastName;

    }

    结构

    struct PgoneCustomerStruct

    {

    public const string DayOfSendingBill=”Monday”;

    public int CustomerID;

    public string FirstName;

    public string LastName;

    }

    结构与类的区别使他们在内存中的存储方式,访问方式(类是存储在堆(heap)上的引用类型,而结构的存储在栈上的值类型)和他们的一些特征(如结构不支持继承).较小的数据类型使用结构可提高性能.但在语法上,结果和类很相似.主要区别是使用关键字struct代替class来声明结构.结构的实例都分布在栈上,类的实例分布在托管堆上.

    类的结构都使用关键字ner来声明实例:这个关键字穿件对象并对对象进行初始化.

    PhoneCustomer myCustomer=new PhoneCustomer();

    PhoneCustomerStruct myCustomer2=new PhoneCustomerStruct();

    多数情况下,类的使用较多,类中的数据和函数叫做成员.类还可以包含嵌套的类型.成员的可访问性可以是:public,private,intermal,protected.

    数据成员是包含类的数据----字段,常量和事件的成员.数据成员可以是静态数据.类成员总是实例成员,除非用static进行显示的声明.一旦实例化PhoneCustomer对象,就可以实用语法Object.ieldName来访问这些字段,如:

    PhoneCustomer Customer1=new PhoneCustomer();

    Customer1.FirstName=”syx”;

    使用const关键字来声明常量.如果声明为public,就可以在类的外部访问它.

    class PhoneCustomer

    {

    public const string DaySendingBill = “Monday”;

    public int CustomerID;

    public string FirstName;

    public string lastName;

    }

    事件是类的成员,在发生某些行为(如改变类的字段火属性,或者进行了某种形式的用户交互操作)时,他可以让对象通知调用方.客户可以包含所谓的”事件处理程序”的代码来响应该事件.

    函数成员

    函数成员提供了操作类中数据的某些功能 ,包括方法、属性、构造函数和终结器,运算符以及索引器.

    方法

    注意,正式的C#术语区分函数和方法.在C#术语中,”函数成员”不仅包含方法,而且也包含类或结构的一些费数据成员,如索引器,运算符,构造函数和析构函数等.

    1.方法的声明

    [修饰符] 返回值类型 函数名 (参数列表)

    {

    函数代码

    }

    2.调用方法

    例如有一个方法:

    public void ShowHello(string name)

    {

    Console.WriteLine(name+”say : hello”);

    }

    调用的时候

    static void Main()

    {

    ShowHello(“zhangsan”);

    }

    3.给方法传递参数

    就是参数列表里需要什么类型,需要几个就传递几个

    4.ref,     out,     params的使用

    ref的特点是有进有出,即在传递参数之前就已经对它进行赋值,在传入方法体时,是将该数的地址传了进来,如果对其进行相应的赋值操作,直接改的是地址里的值,所以,当该方法执行完,该数的值也就跟着改变了。

    代码如下:

            static void Main(string[] args)
            {
                int i = 10;
                FF( ref i);
                Console.WriteLine(i);
            }

            static void FF(ref int i)
            {
                i = i + 1;
            }

    如果没有ref

    static void Main(string[] args)

            {

                int i = 10;

                FF(i);

                Console.WriteLine(i);

                Console.ReadKey();

            }

            static void FF(int i)

            {

                i = i + 1;

            }

    ref的作用这样一比较是不是很清楚了.ref和C中的指针相似.

    而out与ref的唯一区别是,在方法接收参数后,对它进行初始化(如果没有初始化,将会报错的),其余的用法都和ref一样。

    static void Main(string[] args)
            {
                int i ;
                FF( out i);
                Console.WriteLine(i);
            }

            static void FF(out int i)
            {

                i=10; //如果没有这个赋值,系统将会报错的
                i = i + 1;
            }

    out的使用案例

      public static void outfun(out string str)
      {
       str = "test";     //必须在函数体内初始, 如无此句,则下句无 法执行,报错
       str += " fun";
      }

    static void Main(string[] args)
      {
       string test1 = "syx";
       string test2;                  //没有初始
        outfun( out test1 );    //正确,但值syx无法传进去
       outfun( out test2 );    //正确

       Console.Read();
      }

    在调用含有out和ref函数的参数的时候,调用的时候需要显式的指明out或者ref.out存在的意义,个人认为是返回多个值.

    声明一个函数,在函数结束的时候,我想得到i改变后的值,也想得到j改变后的值,就可以使用out关键字.但是在调用的时候,需要实参前面加上关键字out.

    public static int outfun(ref int i,out int j)

            {

                i = 10;

                j = i+10;

                return i;

            }        

            static void Main(string[] args)

            {

                int a = 1;

                int b;            

                Console.WriteLine(a + "    " + b);            

                Console.ReadKey();

            }

    ref是有进有出,而out是只出不进。

    为了将方法声明为可以接受可变数量参数的方法,我们可以使用params关键字来声明数组,如下所示:

    public static Int32Add(params Int32[] values)

    {

         Int  sum = 0;

         for (Int32 x = 0; x < values.Length; x++)

         {

         sum += values[x];

         }

         return sum;

    }

         只有方法的最后一个参数才可以标记params,该参数必须标识一个一维数组,但类型不限。对方法的最后一个参数传递null或者0个数目的数组的引用都是合法的.

    在调用的时候,即可以传递一个数组,也可以传递一组数.例如:

     static void Main(string[] args)

            {

                int sum = GetSum(1, 2, 3, 4, 5, 6, 7, 8);

                Console.WriteLine(sum);

                int[] arrs = { 1, 2, 3, 4, 5, 6 };

                int sum2 = GetSum(arrs);

                Console.WriteLine(sum2);

                Console.ReadKey();

            }

    最后总结一下ref,out,param存在的意义.

    ref:相当于C中的指针,让参数传址引用.

    out:返回多个数.

    param:支持可变参数,但是一定要放在最后.

  • 相关阅读:
    USB耳机声卡-音频输入/输出控制器:DP108替代兼容CM108
    关于lora标配SPDT大功率射频开关
    关于2.4G芯片中 CC2500的相关资料
    关于ESP8266EX的一些资料
    【1801日語写作】第11回:5月21日
    【日本語新聞選読】第11回:5月19日
    【1801日語听解4】第11回:5月19日
    【1801日語視聴説2】第11回:5月18日
    【1901日語听解2】第11回:5月18日
    【1701日本語新聞編集】第10回:5月15日
  • 原文地址:https://www.cnblogs.com/android-blogs/p/6483147.html
Copyright © 2011-2022 走看看