类和结构

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

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

例如 ,如 果 一 个类表示 一 个顾客 ,就可以定义字段 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:支持可变参数,但是一定要放在最后.

C#编程(十二)----------函数的更多相关文章

  1. 面向对象编程(十二)——final关键字

    final关键字 Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和 ...

  2. 深入理解PHP内核(十二)函数-函数的定义、传参及返回值

    原文链接:http://www.orlion.ga/344/ 一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) {    echo $var; ...

  3. Win32 Windows编程 十二

    一.对话框 1.对话框的分类 2.对话框的基本使用方式 3.对话框资源 4.有模式对话框的使用 5. 无模式对话框的使用 5.1 加入对话框资源 5.2 定义窗体处理函数 BOOL CALLBACK ...

  4. linux网络编程之socket编程(十二)

    今天继续学习socket编程,期待的APEC会议终于在京召开了,听说昨晚鸟巢那灯火通明,遍地礼花,有点08年奥运会的架势,有种冲动想去瞅见一下习大大的真容,"伟大的祖国,我爱你~~~&quo ...

  5. C和C指针小记(十二)-函数的可变参数表

    1.可变参数表是通过宏实现的 宏定义于stdarg.h头文件,它是标准库的一部分.这个头文件声明了一个类型var_list和三个宏--va_start.va_arg.va_end. 我们可以声明一个类 ...

  6. Unix环境高级编程(十二)线程控制

    本章介绍了一个进程中多个线程之间如何保持数据的似有性及进程的系统调用如何与线程进行交互. 1.线程限制: Single Unix定义了一线线程操作的限制,和其他的限制一样,可以通过sysconf来查询 ...

  7. Python并行编程(十二):进程同步

    1.基本概念 多个进程可以协同工作来完成一项任务,通常需要共享数据.所以在多进程之间保持数据的一致性就很重要,需要共享数据协同的进程必须以适当的策略来读写数据.同步原语和线程的库类似. - Lock: ...

  8. (二十二)函数fseek() 用法

    fseek 函数名: fseek功 能: 重定位流上的文件指针用 法: int fseek(FILE *stream, long offset, int fromwhere);描 述: 函数设置文件指 ...

  9. C语言库函数大全及应用实例十二

    原文:C语言库函数大全及应用实例十二                                          [编程资料]C语言库函数大全及应用实例十二 函数名: setrgbpalette ...

  10. (十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. Linux:安装mysql

    #install mysql$ rpm -ivh MySQL-client-5.5.28-1.rhel5.x86_64.rpm --nodeps$ rpm -ivh MySQL-server-5.5. ...

  2. 证书(Certificate)与描述文件(Provisioning Profiles)

    在使用脚本xcodebuild自动打包的时候,会用到签名证书和描述文件,我在编译的时候搞了好长时间才搞明白,下面介绍如何得到正确配置. 证书:证书是用来给应用程序签名的,只有经过签名的应用程序才能保证 ...

  3. 【mysql】source导入多个文件

    在mysql中,可以将表导出为sql文件,比如1.sql, 2.sql等等. 导入一个文件: source /home/somepath/.sql 那么问题来了,如果我想一次导入100个文件呢?总不能 ...

  4. java 内部类使用 .this 和 .new

    如果需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this,这样产生的引用自动地具有正确的类型,这一点在编译器就被知晓并受到检查,因此并没有运行时开销 //: innerclasses ...

  5. Java @Override 注解

    @Override注解,不是关键字,但可以当关键字使用,可以选择添加这个注解,在你不留心重载而并非复写了该方法时,编译器就会产生一条错误:The method doh(Milhouse) of typ ...

  6. 启动DELPHI2010出现 EditorLineEnds.ttr 错误的解决方法

      在网上找到了很多方法.其实解决这个问题的方法, 最简单的就是把  EditorLineEnds.ttr  改名为  EditorLineEnds.ttf 然后,安装它, 安装完成后就OK了.

  7. 【Java】 大话数据结构(18) 排序算法(5) (直接插入排序)

    本文根据<大话数据结构>一书,实现了Java版的直接插入排序. 更多:数据结构与算法合集 基本概念 直接插入排序思路:类似扑克牌的排序过程,从左到右依次遍历,如果遇到一个数小于前一个数,则 ...

  8. 公钥,密钥,HTTPS详解

    公钥与私钥,HTTPS详解 1.公钥与私钥原理1)鲍勃有两把钥匙,一把是公钥,另一把是私钥2)鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把.3)苏珊要给鲍勃写一封保密的信.她写完后 ...

  9. python集合相关操作

    集合相关操作 集合是一个无序的,不重复的数据组合,它有着两个主要作用:去重以及关系测试. 去重指的是当把一个列表变成了集合,其中重复的内容就自动的被去掉了 关系测试指的是,测试两组数据之间的交集.差集 ...

  10. python中关于if-else使用性能的一点感悟

    今天做leetcode第7题关于数字倒序的问题,分别使用如下程序:(72ms) class Solution: def reverse(self, x): """ :ty ...