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 环境高级编 ...
随机推荐
- 008_MAC 终端使用技巧
一.常用终端命令. <1>reset 的作用很简单——将目前「终端」屏幕上的内容清空,就好像刚刚打开终端一样. <2>如果你在一条终端命令中发现有输入错误的话,那么用 cont ...
- linux系统下安装nginx
1.第一步:获取nginx的安装包 wget http://nginx.org/download/nginx-1.7.8.tar.gz 2.解压安装包tar -xvf nginx-1.7.8.tar. ...
- liunx jdk安装
打开https://www.oracle.com/technetwork/java/javase/downloads/index.html 选择Development版本(server为服务器版本), ...
- linux(CentOS) 下mysql自动备份
1.创建并编辑文件 /usr/sbin/bakmysql.sh,命令: vi /usr/sbin/bakmysql.sh 内容如下: db_user="root" db_passw ...
- SqlServer中查看索引的使用情况
--查看数据库索引的使用情况 select db_name(database_id) as N'TOPK_TO_DEV', --库名 object_name(a.object_id) as N'Top ...
- Android多开/分身检测
原文:https://blog.darkness463.top/2018/05/04/Android-Virtual-Check/ 多开/分身原本用于方便有多个微信/QQ解决同时登录的问题,但近来年被 ...
- winform解析json
在使用C#开发爬虫程序时,会遇到需要解析json字符串的情况.对于json字符串可以使用正则表达式的形式进行解析,更为方便的方法是使用Newtonsoft.Json来实现. Nuget添加应用包 在工 ...
- Codeforces Round #380 Div.2 F - Financiers Game
F - Financiers Game 这种两人博弈一般都可以用两个dp写, 一个dp描述第一个人的最优态, 第二个dp描述第二个人的最优态,难点在于优化空间... 我感觉这个空间开得有点玄学.. d ...
- 基于SOA的银行系统架构
Part-1 [简述] 1.通过引入面向服务架构(SOA),企业服务总线(ESB),适配器(Adapter)及面向构件等技术,尝试打造一个统一业务流程服务平台,实现面向流程的服务集成. 2.传统银行 ...
- react的非DOM操作
非dom属性?dangerouslySetInnerHTML,ref,key非dom标准属性,也就是说dom标准里面没有规定的属性,react引入了三个非dom属性,如上. dangerouslySe ...