方法与函数

第一个概念,将方法和事件(event)区分开,事件是特殊的委托(delegate),将方法作为参数传递,

而方法(函数)则是:包含一系列语句的代码块。 程序通过“调用”方法并指定所需的参数来执行语句。 在 C# 中,每个执行指令都是在方法的上下文中执行的。

第二个概念,方法是面向过程(结构)的编程思想,主要用于实现代码的复用,消除冗余代码。

方法的声明:关注访问修饰符、返回类型和参数列表

访问修饰符有:public、internal、protected、privat

方法的返回类型可以是:void(没有返回值)、基本类型(预定义类型)、自定义类型

void Main()
{
    Print();
    Show("rammderek");
    Console.WriteLine (GetMessage());
    Console.WriteLine (GetMessage("rammderek"));
    Console.WriteLine (Add(Add(Add("这是一个","有多个参数,"),"也有返回类型"),"的方法"));
    GetBook("C#","Microsoft",10.99M,DateTime.Now).Dump();
}
//没有返回值,无参数
public void Print(){
    Console.WriteLine ("这是一个没有返回值,没有参数的方法");
}
//没有返回值,有参数
public void Show(string name){
    Console.WriteLine ("你好,{0}!这是一个没有返回值,但是有参数的方法", name);
}
//有返回值,无参数
public string GetMessage(){
    return "这是一个有返回值,但是没有参数的方法";
}
//有返回值,有参数
public string GetMessage(string name){
    return string.Format("你好,{0}!这是一个有返回值,也有参数的方法", name);
}
//有返回值,有多个参数
public string Add(string prefix,string suffix){
    return prefix + suffix;
}
//返回自定义类型
public Book GetBook(string title,string author,decimal price,DateTime pubdate){
    return new Book{ Title=title,Author=author, Price=price, PubDate=pubdate};
}
//自定义图书类型
public class Book{
    public string Title { get; set; }
    public string Author { get; set; }
    public decimal Price { get; set; }
    public DateTime PubDate { get; set; }
}

方法的参数有以下几种:

  值类型参数:不会影响方法外部的值类型对象,但是会印象引用类型对象(字符串除外)

void Main()
{
    var m = 3;
    Add(m);    //该方法不会影响变量m的值
    Console.WriteLine ("方法执行完毕后,变量的值是:{0}",m);

    var s = "Hello World";
    ToUpper(s);  //该方法不会影响变量m的值
    Console.WriteLine ("方法执行完毕后,变量的值是:{0}",s);

    var book = new Book{ Title="HTML" };
    ChangeBook(book);  //该方法会影响变量m的值
    Console.WriteLine ("方法执行完毕后,变量的值是:{0}",book.Title);
}
public void Add(int n){
    n++;
    Console.WriteLine ("在方法中,变量的值是:{0}",n);
}
public void ToUpper(string message){
    message = message.ToUpper();
    Console.WriteLine ("在方法中,变量的值是:{0}",message);
}
public void ChangeBook(Book book){
    book.Title = "C#";
    Console.WriteLine ("在方法中,变量的值是:{0}",book.Title);
}

//自定义图书类型
public class Book{
    public string Title { get; set; }
    public string Author { get; set; }
    public decimal Price { get; set; }
    public DateTime PubDate { get; set; }
}

  引用类型参数:会影响方法外部变量的值

void Main()
{
    var m = 3;
    Add(ref m);
    Console.WriteLine ("方法执行完毕后,变量的值是:{0}",m);
}
public void Add(ref int m){
    m++;
    Console.WriteLine ("在方法中变量的值是:{0}", m);
}

  输出参数:会影响方法外部变量的值,通常在需要返回多值时使用

void Main()
{
    string firstName;
    string lastName;
    Console.WriteLine ("请输入完整姓名,姓氏和名称用空格拆分:");
    var fullName = Console.ReadLine();
    ConvertName(fullName,out firstName, out lastName);
    Console.WriteLine ("{0},您的姓氏是:{1},名字是{1}",fullName, firstName, lastName);
}
public void ConvertName(string fullName,out string firstName,out string lastName){
    firstName = fullName.Split(new[]{‘ ‘})[0];
    lastName = fullName.Split(new[]{‘ ‘})[1];
    Console.WriteLine ("在方法中通过空格拆分,获取姓氏和名字");
}

在C#中,也有很多类似使用输出参数的方法,比如TryPase()类型转换时的代码(主要用于防御式编码):

void Main()
{
    Console.WriteLine ("请输入一个整数");
    var input = Console.ReadLine();
    int num;
    if (int.TryParse(input,out num))
    {
        Console.WriteLine ("你输入的数字是:{0}",num);
    }else
    {
        Console.WriteLine ("输入格式不正确,请重新输入!");
    }
}

  参数数组:可以输入数组类型,也可以直接忽略该参数,参数数组必须放置在方法最后一个参数,如

void Main()
{
    var nums = Enumerable.Range(1,100).ToArray();
    FilterNums(20,50).Dump();
    FilterNums(20,24,nums).Dump();
}
//返回介于最小和最大数字之间的 数字个数
public int[] FilterNums(int min,int max,params int[] array){
    return array.Where (a => a>=min && a<=max).ToArray();
}

在.NET中,参数数组出现在ADO.NET中,如

void Main()
{
    GetDataSet(@"data source=.;initial catalog=BookStoreDB;integrated security=true",
        "select * from Book where Title like @Title",
        new SqlParameter[]{new SqlParameter("@Title","%s%")}).Dump();
}
public DataSet GetDataSet(string conStr,string cmdText,params SqlParameter[] values){
    var cmd = new SqlCommand(cmdText,new SqlConnection(conStr));
    cmd.Parameters.AddRange(values);
    var da = new SqlDataAdapter(cmd);
    var ds = new DataSet();
    da.Fill(ds);
    return ds;
}

  新特性:可选参数、命名参数、可空类型参数等

  可选参数(有默认值)必须在必选参数后面,如

void Main()
{
    Show("@","!").Dump();
}
public string Show(string prefix,string suffix,string message="Hello World"){
    return prefix + message + suffix;
}

  命名参数(源自VB)允许调用时通过命名调整参数顺序,如

void Main()
{
    Sub(numA:12,numB:3).Dump();
    Sub(numB:3,numA:12).Dump();
}
public int Sub(int numA,int numB){
    return numA - numB;
}

  可空类型参数(主要应对与数据库中的可空字段)

void Main()
{
    Sub(null,0).Dump();
    Sub(12,3).Dump();
}
public int Sub(int? numA,int? numB){
    return numA??int.MaxValue - numB??0;
}

方法重载(overload):根据参数列表(个数,类型,顺序)判断调用哪个同名方法

void Main()
{
    Show();
    Show(3,12);
    Show("ramm","derek");
}
public void Show(){
    Console.WriteLine ("没有参数的方法");
}
public void Show(int m, int n){
    Console.WriteLine ("两个参数中比较大的数字是:",m>n?m:n);
}
public void Show(string m, string n){
    Console.WriteLine ("你好,{0} {1}",m,n);
}

递归(自己调用自己):一种算法思想,注意结束条件,否则很容易形成死循环

void Main()
{
    Show("通过递归,依次执行方法自身,直到满足条件时,退出方法");
}
public void Show(string message){
    if (message.Length>1)
    {
        Console.WriteLine (message);
        Show(message.Substring(1));
    }else
    {
        Console.WriteLine (message);
    }
}

执行效果如下

再比如,斐波那契额数列

void Main()
{
    Foo(10).Dump();
}
//斐波那契额数列:1,1,2,3,5,8,......
public long Foo(long index){
    if (index==1 || index ==2)
    {
        return index;
    }
    return Foo(index-1) + Foo(index-2);
}

或者控制台循环输入判断:

void Main()
{
    Show();
}

public void Show(){
    var n = Convert.ToInt32(Console.ReadLine());
    if (n!=0)
    {
        Console.WriteLine ("你输入的不是0,请再次输入");
        Show();
    }else{
        Console.WriteLine ("好吧,程序可以退出了");
    }
}

最后,考虑阶乘累加如何通过递归实现?  //   1! + 2! + 3! + ..... + n!

时间: 2024-10-07 12:52:01

方法与函数的相关文章

黑马程序员 10-OC方法与函数的区别

———Java培训.Android培训.iOS培训..Net培训.期待与您交流! ——— 方法与函数的区别 1.方法: 1.对象方法都是以减号 - 开头  2.对象方法的声明必须写在@interface @end之间   3.对象方法的实现必须写在@implementation @end 之间 4.对象方法只能由对象调用  5.对象方法归类\对象所有 6.类方法都是以加号 + 开头,其他规则和对象方法相同 7.类方法既可以被类(类名)调用,也可以被对象调用 2.函数: 1.函数归文件所有,跟对象

Entity Framework SqlFunctions 教你如何在EF调用sqlserver方法的函数存根

今天算是研究了一天的SqlFunctions,请教了几个群的牛人,居然发现大伙对这个都比较陌生, 有的甚至直指EF中是不能调用sqlserver里的方法的. 因为之前搞过linq to sql 里面的SqlMethod ,所以觉得EF里面必须是可以的. 首先需要简短介绍一下EF6和EF5,当你NuGet一个EF5的包的时候,只有EntityFramework,而EF6确有EntityFramework和EntityFramework.SqlServer, 这2者是有很大区别的. 在EF5环境下,

eclipse中查看某个方法(函数)被谁调用

用了好久一直不知道eclipse中如何实现vs中查找所有引用的功能,今天终于发现了哈哈 选中要查找的方法名,右键->References->Workspace 可以定位到具体的调用位置,快捷键Ctrl+Shift+G,在Search中就会出现调用方法 或者是 右键->References->Project/Hierarchy,Workspace搜索的范围>Project>Hierarchy. eclipse中查看某个方法(函数)被谁调用,布布扣,bubuko.com

【原】Java学习笔记008 - 方法(函数)

1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 // 方法/函数 Method/Function 6 7 // 为什么会出现方法? 8 // 原因1.在程序中多处出现相同的语句内容 9 // 原因2.会发生变化 10 11 // [只有变化是不变的] 12 // 回顾一下变量,为了应对变化,提出的新的机制 13 // 需要对变化进行封装处理,在这里就

学习IOS--description方法\NSLog函数

1.description方法是NSObject自带的方法,包括类方法和对象方法 + (NSString *)description; // 默认返回 类名 - (NSString *)description; // 默认返回 <类名:内存地址> 2.默认情况下利用NSLog和%@输出对象的时返回的就是类名和内存地址 3.修改NSLog和%@的默认输出:重写类对象或者实例对象的description方法即可.因为NSLog函数进行打印的时候会自动调用description方法 /*******

HP叫魔术方法的函数

PHP5.0后,php面向对象提成更多方法,使得php更加的强大!! 一些在PHP叫魔术方法的函数,在这里介绍一下:其实在一般的应用中,我们都需要用到他们!! 1.__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用. Java代码 class Test { function __construct() { echo "before"; } } $t = new Test(); class Test { function __construct() { ec

[Effective JavaScript 笔记]第26条:使用bind方法实现函数的柯里化

bind方法的作用,除了有绑定函数到对象外,我们来看看bind方法的一些其它应用. 简单示例 例子:假设有一个装配URL字符串的简单函数.代码如下 function simpleURL(protocol,domain,path){ return protocol+'://'+domain+'/'+path; } 要将特定站点的路径字符串构建为绝对路径URL.可以使用ES5中数组的map方法来实现.如下 var paths=['wengxuesong/','wengxuesong/p/556048

转 PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)

PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据) 通过curl_setopt()函数可以方便快捷的抓取网页(采集很方便),curl_setopt 是php的一个扩展库 使用条件:需要在php.ini 中配置开启.(PHP 4 >= 4.0.2)       //取消下面的注释 extension=php_curl.dll 在Linux下面,需要重新编译PHP了,编译时,你需要打开编译参数——在configure命令上加上“–with-curl” 参数. 1.

[译]Scala方法和函数的区别

Scala中既有函数也有方法,大多数情况下我们都可以不去理会他们之间的区别.但是有时候我们必须要了解他们之间的不同. Scala中的方法跟Java的方法一样,方法是组成类的一部分.方法有名字.类型签名,有时方法上还有注解,以及方法的功能 实现代码(字节码). Scala中的函数是一个完整的对象.Scala中用22个特质(trait)抽象出了函数的概念.这22特质从Function1到Function22 如上图中的Function10代表的是:有10个形参,返回值为R(协变)的函数. Scala