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 环境高级编 ...
随机推荐
- hdu 2065(泰勒展式)
比赛的时候遇到这种题,只能怪自己高数学得不好,看着别人秒.... 由4种字母组成,A和C只能出现偶数次. 构造指数级生成函数:(1+x/1!+x^2/2!+x^3/3!……)^2*(1+x^2/2!+ ...
- RSS新手必读
当谷歌停止Google Reader后,我开始玩RSS Reader了.网上大抵说Google Reader的退出很可惜,不过替代品还是存在的. 作为一个newbie我的视野或许很局限不过还是说几 ...
- react 15
react 15 最近项目由react0.14.X升级到react 15版本,因为react15还是做了一些相对大一点的更新的(详情可以参考一下我的另一篇文章关于react15的一点总结),相对:来说 ...
- Codeforces Round #480 (Div. 2) E - The Number Games
题目大意:给你n个点的一棵树, 每个点的权值为2^i ,让你删掉k个点使得剩下的权值和最大. 思路:这题还是比较好想的, 我们反过来考虑, 剩下一个的情况肯定是选第n个点,剩下两个 我们肯定优先考虑第 ...
- form的智能表单
1.智能表单的介绍 其中,(1)中的使用格式使得form不会太臃肿. 2.使用规范 3.新属性 4.举例 二.程序 1.关于邮件的问题 <!DOCTYPE html> <head&g ...
- POJ 3017 Cut the Sequence
[题目链接] $O(n^2)$ 效率的 dp 递推式:${ dp }_{ i }=min\left( dp_{ j }+\overset { i }{ \underset { x=j+1 }{ max ...
- 用scrapy爬取京东的数据
本文目的是使用scrapy爬取京东上所有的手机数据,并将数据保存到MongoDB中. 一.项目介绍 主要目标 1.使用scrapy爬取京东上所有的手机数据 2.将爬取的数据存储到MongoDB 环境 ...
- JAVA 画图板实现(基本画图功能+界面UI)二、功能实现及重绘实现
上篇博客中介绍了界面的实现方法,在这篇博客中将对每个按钮的功能的实现进行讲解并介绍重绘 首先肯定要添加事件监听机制了,那么问题来了,事件源对象是谁?需要添加什么方法?事件接口是什么? 1.我们需要点击 ...
- Python3 决策树ID3算法实现
# -*- coding: utf-8 -*- """ Created on Wed Jan 24 19:01:40 2018 @author: markli 采用信息增 ...
- Android Intent Service
Android Intent Service 学习自 Android 官方文档 https://blog.csdn.net/iromkoear/article/details/63252665 Ove ...