参数数组

C#允许为函数指定一个(只能指定一个)特定的参数,这个参数必须是函数定义中的最后一个参数,称为参数数组。参数数组可以使用个数不定的参数调用函数,可以使用params关键字定义它们。

参数数组可以简化代码,因为不必从调用代码中传递数组,而是传递同类型的几个参数,这些参数放在可在函数中使用的一个数组中。

参数的数量不受限制,可以为0个。

引用参数

用作ref参数的变量有两个限制。首先,函数可能会改变引用参数的值,所以必须在函数调用中使用“非常量”变量。

其次,必须使用初始化过的变量。C#不允许假定ref参数在使用它的函数中初始化。

输出参数

除了按引用传递值之外,还可以使用out关键字,指定所给的参数是一个输出参数。out关键字的使用方式与ref关键字相同。实际上,它的执行方式与引用参数完全一样,因为在函数执行完毕后,该参数的值将返回给函数调用中使用的变量。但是,存在一些重要区别。

l  把未赋值的变量用作ref参数是非法的,但可以把未赋值的变量用作out参数。

l 在函数使用out参数时,out参数必须看做是还未赋值。

即调用代码可以把已赋值的变量用作out参数,存储在该变量中的值会再函数执行时丢失。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
//parameter array - params
static int SumVals(params int[] vals)
{
int sum = ;
foreach (int val in vals)
{
sum += val;
}
return sum;
} //reference parameter - ref
static void ShowDouble(ref int val)
{
val *= ;
Console.WriteLine("val doubled = {0}",val);
} //out parameter - out
static int MaxValue(int[] intArray, out int maxIndex)
{
int maxVal = intArray[];
maxIndex = ;
for (int i = ; i < intArray.Length; i++)
{
if (intArray[i] > maxVal)
{
maxVal = intArray[i];
maxIndex = i;
}
}
return maxVal;
} static void Main(string[] args)
{
int sum = SumVals(, , , , );
Console.WriteLine("Summed Values = {0}",sum); int myNum = ;
Console.WriteLine("myNum = {0}",myNum);
ShowDouble(ref myNum);
Console.WriteLine("myNum = {0}", myNum); int[] myArray = { ,,,,,};
int maxIndex;
Console.WriteLine("The maximum value in myArray is {0}", MaxValue(myArray,out maxIndex));
Console.WriteLine("The first occurence of this value is at element {0}",maxIndex+); Console.ReadLine(); }
}
}

Main()函数

这个函数可以返回void或int,又一个可选参数string[] args。Main()函数可以使用如下4种版本:

static void Main()

static void Main(string[] args)

static int Main()

static int Main(string[] args)

上面的第三、四个版本返回一个int值,它们可以用于表示应用程序如何终止,通常用作一种错误提示(但这不是强制的),一般情况下,返回0反映了“正常”的终止(即应用程序执行完毕,并安全地终止)。

Main()的可选参数args是从应用程序的外部接受信息的方法,这些信息在运行期间指定,其形式是命令行参数。

指定Main()参数:

1)打开项目的属性页面(在Solution Explorer窗口中右击项目名称,选择Properties选项)。

2)选择Debug页面,在Command Line Arguments设置中天街所希望的命令行参数。

结构函数

结构可以包含函数和数据。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
struct customername
{
public string firstName, lastName;
public string Name()
{
return firstName + " " + lastName;
}
} static void Main(string[] args)
{
customername myCustomer;
myCustomer.firstName = "Steven";
myCustomer.lastName = "Wang";
Console.WriteLine(myCustomer.Name()); Console.ReadLine(); }
}
}

委托(delegate)是一种可以把引用存储为函数的类型。委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。委托的声明制定了一个返回类型和一个参数列表。

在定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
delegate double ProcessDelegate(double param1, double param2); static double Multiple(double param1, double param2)
{
return param1 * param2;
} static double Divide(double param1, double param2)
{
return param1 / param2;
} static void ExecuteFunction(ProcessDelegate process)
{
Console.WriteLine(process(, ));
} static void Main(string[] args)
{
ProcessDelegate process;
Console.WriteLine("Enter 2 numbers separated with a comma:");
string input = Console.ReadLine();
int commaPos = input.IndexOf(',');
double param1 = Convert.ToDouble(input.Substring(,commaPos));
double param2 = Convert.ToDouble(input.Substring(commaPos+,input.Length-commaPos-));
Console.WriteLine("Enter M to multiple or D to divide:");
input=Console.ReadLine();
if(input.ToUpper()=="M")
{
process=new ProcessDelegate(Multiple);
// process = Multiple; // or you can write this
}
else
{
process=new ProcessDelegate(Divide);
// process = Divide; // or you can write this
}
Console.WriteLine("Result: {0}",process(param1,param2)); ExecuteFunction(process); Console.ReadLine(); }
}
}

要把一个函数引用赋给委托变量,必须使用new关键字创建一个新委托。在这个关键字的后面,指定委托类型,提供一个引用所需函数的参数。参数是要使用的函数名,且不带括号。

C#代码示例_函数的更多相关文章

  1. C#代码示例_定义类

    默认情况下,类声明为内部的,即只有当前项目中的代码才能访问它.可以使用internal访问修饰符关键字显示指定. 除了两个访问修饰符关键字(public, internal)外,还可以指定类是抽象的( ...

  2. C#代码示例_调试

    调试信息 可使用如下两个命令输出调试信息: l Debug.WriteLine() l Trace.WriteLine() 这两个命令函数的用法几乎完全相同,但有一个重要区别.第一个命令仅在调试模式下 ...

  3. C#代码示例_集合

    C#中数组实现为System.Array类得实例,它们只是集合类(Collection Classes)中的一种类型. 索引符(indexer)是一种特殊类型的属性,可以把它添加到一个类中,以提供类似 ...

  4. C# 代码示例_结构/数组/枚举...

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好

    HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...

  6. spark自定义函数之——UDF使用详解及代码示例

    前言 本文介绍如何在Spark Sql和DataFrame中使用UDF,如何利用UDF给一个表或者一个DataFrame根据需求添加几列,并给出了旧版(Spark1.x)和新版(Spark2.x)完整 ...

  7. Java8函数接口实现回调及Groovy闭包的代码示例

    本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场景: 主体流程是不变的,变的只是其中要调用的具体方法. 其特征是:   Begi ...

  8. Python基础篇(三)_函数及代码复用

    Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...

  9. 2018-11-27 中文代码示例之Programming in Scala笔记第七八章

    续前文: 中文代码示例之Programming in Scala学习笔记第二三章 中文代码示例之Programming in Scala笔记第四五六章. 同样仅节选有意思的例程部分作演示之用. 源文档 ...

随机推荐

  1. bootstrap-table 加载不了数据问题总结

    1.Without server-side pagination data-side-pagination="client"(bs-table的设置) 服务器端代码: @Reque ...

  2. 各种浏览器(IE,Firefox,Chrome,Opera)COOKIE修改方法[转]

    各种浏览器(IE,Firefox,Chrome,Opera)COOKIE修改方法[转] 网站通过 Cookie 保存了我们访问网站的信息,在不同的浏览器中修改 Cookie 可以如下操作: Firef ...

  3. CentOS 7数据库mysql和mariadb手动安装冲突的问题解决

    由于确定使用mysql,那只有卸载mariadb了. 一.首先查看当前安装的mariadb包 rpm -qa|grep mariadb 本人得到结果是:mariadb-libs-5.5.44-2.el ...

  4. linux passwd文件解析

    #cat/etc/passwd root:x:::Superuser:/: daemon:x:::Systemdaemons:/etc: bin:x:::Ownerofsystemcommands:/ ...

  5. jquery总结05-常用事件01-鼠标事件

    鼠标事件 .click()单机事件  包括.mousedown()(鼠标按下).mouseup()(放松鼠标)两个事件 .dbclick()双击事件 两个click事件,中间的间隔由系统而定 .mou ...

  6. C# 使用lock关键字lock不同的对象

    c# lock关键字的本质 是调用Monitor.Enter(object obj)并且在finally的时候调用Monitor.Exit(obj) 在obj是不同数据类型的时候会出现不同的情况 1. ...

  7. iOS - Mac OS X 终端设置

    Mac OS X 终端设置 1)Finder 中显示资源库 方法一: 在 "终端" 中输入下面的命令: 显示: chflags nohidden ~/Library/ 隐藏: ch ...

  8. Unicode 与(UTF-8,UTF-16,UTF-32,UCS-2)

    Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了. U+597D = 好 597D 是1 ...

  9. hdu4511小明系列故事——女友的考验(ac自动机+最短路)

    链接 预处理出来任意两点的距离,然后可以顺着trie树中的节点走,不能走到不合法的地方,另开一维表示走到了哪里,依次来更新. 注意判断一下起点是不是合法. #include <iostream& ...

  10. Linux跨用户copy文件

    foo用户home目录下有一文件file.txt,要将其copy至bar用户的home目录.Linux对用户home目录有严格的权限限制,非owner用户或者同group用户无权限读写,除非是root ...