方法是一种组合一系列语句以执行一个特定操作或计算一个特殊结果的方式。
它能够为构成程序的语句提供更好的结构和组织。
 
在面向对象的语言中,方法总是和类关联在一起的,我们用类将相关的方法分为一组。
方法通过参数来用于从调用者向目标方法传递数据的变量。
方法也通过一个返回值将数据返回给调用者
 
一个方法调用由以下元素构成:命名空间、类型名称、方法名称、参数以及返回数据类型。
 
1、命名空间
命名空间是一种特殊的分类机制,它将与一个特定功能有关的所有类型都分组到一起。
编译器认为所有命名空间都在同一个级别上。所以需要分别引用。
不会因为两个命名空间的包含关系,而将其认为是一个命名空间,而是两个完全独立、完全不同的命名空间。
 
用方法进行重构
将一组相关的语句转移到一个方法中,而不是随意将它们嵌入一个较大的方法中,
中重构的一种形式。重构有助于减少重复代码。
 
return语句意味着跳到方法的末尾。
 
using指令(导入命名空间,或者命名空间中的类型)
可以将来自一个命名空间的类型导入父命名空间代码块中。
虽然命名空间是嵌套的,但是using不会导入任何嵌套的命名空间,嵌套的命名空间需要单独的
显式地导入。
 
注:
使用using System后,可以使用不同的大小写形式来表示字符串数据类型:String  string
前一个版本依赖using System指令,后一个重酬使用string关键字。
两者在C#中都合法地引用了System.String数据类型,最终生成 的CIL代码毫无区别。
using 可以出现在任何一个地方,但是其作用域与其放置的的地方的作用域相同。
 
使用别名
using a1=System.Threading;
 
 
2、调用者和调用栈
 
代码执行时,方法可能调用其他方法,其他方法可能调用更多的方法。
调用嵌套调用的情况会形成调用栈,随着程序复杂程序的提高,每个方法调用另一个方法时
,这个调用栈都会变大。然后当调用结束时,调用栈会发生收缩,直到调用另一系列的方法。
栈展开:用来描述从调用栈中删除调用的过程。
栈展开的顺序通常与方法调用的顺序相反。
一个方法调用完毕之后,会将控制权返回给调用点,也就是最初发出方法调用的那个位置。
 
 
 
3、参数
 
值参数
 
参数默认是传值的。变量的栈数据会完整地复制到目标参数中。
 
无论传递的实际参数是值类型还是引用类型。
都不能修改原来的实际参数的值。(值类型不会改变原来的实际数据值,引用类型不能修改实际
参数的指向,但是可以改变指向的实际数据的值)

   class Program
{
static void Main(string[] args)
{
int x = ;
Program p = new Program();
p.ChangeValue(x, p);
Console.WriteLine("x=" + x + ",p.count=" + p.count);
Console.ReadLine(); }
public void ChangeValue(int pValue,Program p)
{
int temp = pValue;
pValue = ;
p.number = ;
p.count = ;
p = new Program();
p.count = ; }
public int number = ;
public int count = ;
}
输出:
x=0,p.count=10
 
引用参数
使用ref修饰
无论传递的实际参数是值类型还是引用类型。
都可以修改原来的实际参数的值。(值类型会改变原来的实际数据值,引用类型不仅能修改实际
参数的指向,还可以改变指向的实际数据的值)

 class Program
{
static void Main(string[] args)
{
int x = ;
Program p = new Program();
p.ChangeValue(ref x, ref p);
Console.WriteLine("x=" + x + ",p.count=" + p.count);
Console.ReadLine(); }
public void ChangeValue(ref int pValue,ref Program p)
{
int temp = pValue;
pValue = ;
p.number = ;
p.count = ;
p = new Program();
p.count = ; }
public int number = ;
public int count = ;
}
输出:
x=10,p.count=20
 
输出参数
使用out修饰
如果一个参数被标记为out,编译器就会核实在方法的所有正常返回代码路径中,是否
都对该参数进行了赋值。
 
 
参数数组
 
它允许在调用一个方法提供数量可变的参数,而不是由方法事先固定好参数的数量
1、在方法声明的最后一个参数之前,添加一个params关键字
2、将最后一个参数声明为一个数组
参数数组注意事项:
1、参数数组不一事实上是方法声明中的唯一参数。但是,参数数组必须是方法慢用中的最后一个参数
2、调用者可以为参数数组指定0个参数,也可以指定多个参数
3、类型必须匹配于数组指定的类型
4、调用者可以显式地使用一个数组,而不是以逗号分隔的参数列表。
 
使用参数数组,我们可以将相同类型的、数量可变的多个参数付给一个方法。

 class Program
{
static void Main(string[] args)
{
string fullName;
fullName = Combine(Directory.GetCurrentDirectory(), "bin", "config", "index.html");
Console.WriteLine(fullName);
fullName = Combine(new string[] { Directory.GetCurrentDirectory(), "bin", "config", "index.html" });
Console.WriteLine(fullName);
Console.ReadLine();
}
static string Combine(params string[] paths)
{
string result = string.Empty;
foreach (string path in paths)
{
result = System.IO.Path.Combine(result, path);
}
return result;
} }
 
 
4.7方法重载
方法重载是一种操作性多态(编译时多态)
C#依据方法名、参数数据类型或者参数数量的不同来定义唯一性。
所以方法重载:方法名相同,参数数据类型或者参数数量不同。
 
4.8可选参数
通过在声明方法时,将常量赋值给参数,以后调用方法时就不必为此参数指定值。
必须从右向左实现可选参数。
 
C#4.0新增了另一个方法调用功能是命名参数,利用命名参数,调用者可显式指定参数名,并为该参数赋值
,而不是像以前那样只能依据参数顺序来决定哪个值赋值给哪个参数。
 

   class Program
{
static void Main(string[] args)
{
string firstName = "aaaaa", middleName = "bbbbbbbbb", lastName = "cccccccc";
string fullName;
fullName = Combine(firstName);
Console.WriteLine(fullName); fullName = Combine(pfirstName: firstName,plastName:lastName);
Console.WriteLine(fullName); fullName = Combine(pfirstName: firstName, pmiddleName: middleName);
Console.WriteLine(fullName); Console.ReadLine(); }
static string Combine(string pfirstName, string pmiddleName = ".", string plastName = "")
{
string result = pfirstName + pmiddleName + plastName; return result;
} }
 
4.9异常处理
try
throw
catch(多个
finally
一旦引发异常或者throw一个异常,后面的代码不会执行,会跳转到某个catch执行(可以有多个catch,有多个catch时,处理异常的类型从具体到到抽象依次顺序声明),
并且finally会永远执行,无论引发异常与否。

四、C#方法和参数的更多相关文章

  1. C# 本质论 第四章 方法和参数

    要为方法名使用动词或动词短语 递归:递归调用方法 方法重载: try catch

  2. C#中方法的参数的四种类型

    C#中方法的参数有四种类型:       1. 值参数类型  (不加任何修饰符,是默认的类型)       2. 引用型参数  (以ref 修饰符声明)       3. 输出型参数  (以out 修 ...

  3. JUC之线程池-三大方法-七大参数-四种拒绝策略

    线程池:重点 三大方法 七大参数 四种拒绝策略 使用池化技术的理由: 我们的程序伴随着创建销毁线程十分浪费资源, 所以使用线程池,先创建线程,随用随取,用完归还 简单来说就是节约了资源. 使用线程池的 ...

  4. CLR via C#深解笔记四 - 方法、参数、属性

    实例构造器和类(引用类型) 构造器(constructor)是允许将类型的实例初始化为良好状态的一种特殊方法.构造器方法在“方法定义元数据表”中始终叫.ctor. 创建一个引用类型的实例时: #1, ...

  5. 运行jar应用程序引用其他jar包的四种方法

    转载地址:http://www.iteye.com/topic/332580 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个ja ...

  6. Angular--页面间切换及传值的四种方法

    1. 基于ui-router的页面跳转传参(1) 在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个produce ...

  7. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  8. PHP面向对象.__set(),__get(),__isset(),__unset()四个方法的

    一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...

  9. 【AS3】Flash与后台数据交换四种方法整理

    随着Flash Player 9的普及,AS3编程也越来越多了,所以这次重新整理AS3下几种与后台数据交换方法.1.URLLoader(URLStream)2.FlashRemoting3.XMLSo ...

随机推荐

  1. C#验证码使用

    1.C#创建验证码 1.1 创建获取验证码页面(ValidateCode.aspx) <html xmlns="http://www.w3.org/1999/xhtml"&g ...

  2. bzoj3280

    bzoj1221的变形版本,弄懂1221,这题还是很简单的 ; type node=record        point,next,flow,cost:longint;      end; ..] ...

  3. 「Poetize9」礼物运送

    3055: 礼物运送 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 18  Solved: 12[Submit][Status] Description ...

  4. (转载)Mysql使用Describe命令判断字段是否存在

    (转载)http://www.jz123.cn/plus/view.php?aid=39200 工作时需要取得MySQL中一个表的字段是否存在 于是就使用Describe命令来判断 mysql_con ...

  5. Merge into(oracle)

    作用:使用一条sql语句进行insert或者update操作,如果存在就update,如果不存在就insert 语法: MERGE INTO table_name t1 USING (table|vi ...

  6. HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题

    第一年参加现场赛,比赛的时候就A了这一道,基本全场都A的签到题竟然A不出来,结果题目重现的时候1A,好受打击 ORZ..... 题目链接:http://acm.hdu.edu.cn/showprobl ...

  7. 武汉Uber优步司机奖励政策(1月18日~1月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. [置顶] 【Git入门之十五】Github操作指南

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12374633 最终篇,介绍一下Github网站的使用,主要是翻译为主,简化了 ...

  9. Linux下报 java.net.SocketException权限不够 异常解决

    转载自:http://wangchongan.com/articles/java-net-socket-exception-permission-denied.html 今天在Linux下用Jetty ...

  10. 布隆过滤器的java实现

    package com.kaikeba.data.jobspider.util; import java.util.BitSet; public class Bloomfilter { private ...