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:支持可变参数,但是一定要放在最后.
C#编程(十二)----------函数的更多相关文章
- 面向对象编程(十二)——final关键字
final关键字 Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和 ...
- 深入理解PHP内核(十二)函数-函数的定义、传参及返回值
原文链接:http://www.orlion.ga/344/ 一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) { echo $var; ...
- Win32 Windows编程 十二
一.对话框 1.对话框的分类 2.对话框的基本使用方式 3.对话框资源 4.有模式对话框的使用 5. 无模式对话框的使用 5.1 加入对话框资源 5.2 定义窗体处理函数 BOOL CALLBACK ...
- linux网络编程之socket编程(十二)
今天继续学习socket编程,期待的APEC会议终于在京召开了,听说昨晚鸟巢那灯火通明,遍地礼花,有点08年奥运会的架势,有种冲动想去瞅见一下习大大的真容,"伟大的祖国,我爱你~~~&quo ...
- C和C指针小记(十二)-函数的可变参数表
1.可变参数表是通过宏实现的 宏定义于stdarg.h头文件,它是标准库的一部分.这个头文件声明了一个类型var_list和三个宏--va_start.va_arg.va_end. 我们可以声明一个类 ...
- Unix环境高级编程(十二)线程控制
本章介绍了一个进程中多个线程之间如何保持数据的似有性及进程的系统调用如何与线程进行交互. 1.线程限制: Single Unix定义了一线线程操作的限制,和其他的限制一样,可以通过sysconf来查询 ...
- Python并行编程(十二):进程同步
1.基本概念 多个进程可以协同工作来完成一项任务,通常需要共享数据.所以在多进程之间保持数据的一致性就很重要,需要共享数据协同的进程必须以适当的策略来读写数据.同步原语和线程的库类似. - Lock: ...
- (二十二)函数fseek() 用法
fseek 函数名: fseek功 能: 重定位流上的文件指针用 法: int fseek(FILE *stream, long offset, int fromwhere);描 述: 函数设置文件指 ...
- C语言库函数大全及应用实例十二
原文:C语言库函数大全及应用实例十二 [编程资料]C语言库函数大全及应用实例十二 函数名: setrgbpalette ...
- (十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- 内存溢出(Memory Overflow)和内存泄露(Memory Leak)的区别
内存泄漏指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态 内存溢出指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数 ...
- 测试开发之前端——No2.HTML5中的标签
HTML5中的标签. 标签 描述 <!--...--> 定义注释. <!DOCTYPE> 定义文档类型. <a> 定义超链接. <abbr> 定义缩写 ...
- (一)Dubbo简介
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成.具体可以看 百度百科 https://baike.ba ...
- 2、Centos6 安装tomcat8.5.31
1.下载 安装包 wget http://mirrors.aliyun.com/apache/tomcat/tomcat-8/v8.5.31/bin/apache-tomcat-8.5.31.tar. ...
- Luogu P3957 跳房子
题面 跳房子,也叫跳飞机,是一种世界性儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条直线上.每个格子内有一 ...
- 使用 JavaScript 编写优化算法 (1)
之前一直用Python来写优化算法,为了增强 JS 的熟练程度,开始将原有的代码改写成 JS.采用的工具包括 node.js + Grunt + nodeunit + github + npm + t ...
- 【推荐】关于JS中的constructor与prototype【转】
最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...
- 数学之美——HMM模型(一)介绍
一直想写点关于数学方面的blog,这对于数据挖掘分析,NLP处理等都有着比较重要的作用,之前在CSDN上想写点HMM方面的文章,一直没写成,最近几天终于抽点时间完成了HMM的文章,加以整理,遂有这个系 ...
- 022.Zabbix自定义(邮箱)脚本告警01
待补充 有需要,请留言!
- 利用Windows7自带的截图工具获取菜单截图的步骤
打开截图工具后,按 Esc,然后打开要捕获的菜单. 按 Ctrl+PrtScn. 单击“新建”按钮旁边的箭头,从列表中选择“任意格式截图”.“矩形截图”.“窗口截图”或“全屏幕截图”,然后选择要捕获的 ...