轻松学习C#的方法

在类中自定义的“函数”称为“方法”,由于C#是完全面向对象的语言,同时为了便于解释后面要学的C#类,这里的“方法”来称呼“函数”。
       方法是一种用于实现可以有对象或类执行的计算机或操作的成员,是一个已命名的语句集。每个方法都有一个名称和主体。方法名应该是一个有意义的标识符,应描述出方法的用途。方法主体包含了调用方法时实际执行的语句。用户可以为大多数方法提供一些数据来进行处理,并让其返回一些信息(通常是处理结果)。方法是一种基本的,功能强大的编程机制。
       方法的声明格式为:
       修饰符  返回值类型  方法名称(参数列表)
        {
                 方法体
        }
       其中的修饰符和参数列表都是可选的,修饰符如下:new,public,protected,internal,private,static,virtual,sealed,override,abstract,extern,partial
       如果以下所有条件都为真,则所述的声明就具有一个有效的修饰符组合
       (1)该声明包含一个由访问修饰符组成的有效组合
       (2)该声明中所含的修饰符没有彼此相同的
       (3)该声明最多包含下列修饰符中的一个:static,virtual和override
       (4)该声明最多包含下列修饰符中的一个:new和override
       (5)如果声明中包含abstract修饰符,则该声明不包含下列任何修饰符:static,virtual,sealed或extern
       (6)如果声明中包含private修饰符,则该声明不包含下列任何修饰符:virtual,override或abstract
       (7)如果声明包含sealed修饰符,则该声明还包含override修饰符
       (8)如果声明中包含partial修饰符,则该声明不包含下列任一修饰符:new,public,protected,internal,private,static,virtual,sealed,override,abstract,extern
        返回值类型是一个类型名,它指定了返回的信息是什么类型。这可以是任何类型,如果要返回值,则在方法体运行后必须由return语句返回一个和“返回值类型”相同类型的值,如果要写一个不返回值的方法,那么必须用关键字void来取代返回类型。如果声明包含partial修饰符,则返回类型必须为void。
        一个方法的名称必须不同于在一个类中声明的所有其他非方法的名称。此外,必须不同于在同一类中声明的所有其他方法的签名。在写参数列表时,所有形参和类型形参都不能同名。
        下面编写一个简单的返回两个整型数的和的方法:

 public int add(int a, int b)
     {
         return a+b;
     }

下面就具体介绍C#语言中的一些重要的基础的方法:
一、静态方法和实例方法
      静态方法是一个特殊的成员方法,不属于类的某一个具体的实例或对象,而属于类本身。静态方法不对特定实例进行操作,只能访问类中的静态成员。访问静态方法只能使用类名,而不需要创建对象,也不能使用对象名类引用,声明静态方法修饰符中必须有static关键字。
       实例方法可以使用类的任何成员。调用实例方法时,必须使用类的实例或对象来引用。实例方法对类的某个给定的实例进行操作,在实例方法类中可以使用this来访问实例。调用实例方法时,必须先创建一个对象。
       简单的说,静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许静态方法使用实例成员变量,这是错误的。基于同样的道理,静态方法中不能使用关键字this。
例一、编程使用静态方法和实例方法

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; 

namespace Text
{
  class A
  {
    int exaVar;//创建的一个为实例成员变量
    static int stVar;//创建的一个静态成员变量
    void tM()//实例方法
    {
      exaVar = 1;//等价于this.exVar=1
      stVar = 1;//等价于A.stVar=1
    }
     static void sM()//静态方法
    {
      //exaVar = 1;//错误,静态方法不可以调用实例成员变量
      stVar = 1;//等价于A.stVar=1
    }
    static void Main(string[] args)
    {
      A text = new A();//创建类A的对象为text
      text.exaVar = 1;//对象text访问实例成员变量
      A.stVar = 1;//只能使用类访问静态成员变量
      //text.stVar = 1;//不能使用对象text访问静态成员变量
      text.tM();//使用对象text访问实例成员方法
      //text.sM();//不能使用对象text访问静态成员方法
      A.sM();//使用类访问静态成员方法
      Console.WriteLine(text.exaVar + A.stVar);
      Console.ReadLine();
    }
  }
}</span>

输出的结果为:2
二、虚方法和非虚方法
       若一个实例方法的声明中含有virtual修饰符,则称该方法为虚方法。若其中没有virtual修饰符,则称该方法为非虚方法。
       非虚方法的实现是一成不变的,无论该方法是在声明它的类的实例上调用还是在派生类的实例上调用,实现均相同。与此相反,虚方法的实现可以由派生类取代。取代所继承的虚方法的实现的过程称为重写该方法。在虚方法调用中,该调用所涉及的那个实例运行时类型确定了要被调用的究竟是该方法的哪一种实现。在非虚方法调用中,相关的实例的编译时类型是决定性因素。
例二、使用虚方法和非虚方法在派生类中调用

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; 

namespace Text
{
  public class A
  {
    public virtual void ab()//定义的类A的虚方法    </span>
[csharp] view plaincopyprint?
<span style="font-size:18px;">    {
      Console.WriteLine("这是虚方法");
    }
    public void ac()//定义的类A的非虚方法
    {
      Console.WriteLine("这是非虚方法");
    }
  }
  public class B:A//类B私有继承类A
  {
    public override void ab()//重写继承的ab方法
</span>    <span style="font-size:18px;"> {
      Console.WriteLine("这是新的方法");
    }
    public new void ac()//创建一个新的方法覆盖原来的ac方法
    {
      Console.WriteLine("这是另一个新的方法");
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      B b = new B();//创建类B的对象b
      A a = b;//将对象b赋值给类A的对象a
      a.ab();//调用原ab虚方法
      b.ab();//调用ab方法
      a.ac();//调用原ac非虚方法
      b.ac();//调用ac方法
      Console.ReadLine();
    }
  }
}</span>

输出的结果为:

从输出的结果中可以看出虚方法的实现是由派生类取代并且由它的方法实现,而非虚方法的实现是定义的类和派生类的各自由它们的方法实现。
三、虚方法和重写方法
       重写方法用相同的签名重写所继承的虚方法。虚方法声明用于引入新方法,而重写方法声明则用于使现有的继承虚方法专用化。用override声明所重写的那个方法称为已重写了的基方法。
        重写声明和已重写了的基方法具有相同的声明可访问性。换句话说,重写声明不能更改所对应的 虚方法的可访问性。但是,如果已重写的基方法是protected,并且声明它的程序集不是包含重写方法的程序集,则重写方法声明的可访问性必须是protected。
        重写override一般用于接口的实现和继承类的方法改写时应注意:
        (1)覆盖的方法的标志要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果
        (2)覆盖的方法的返回值必须和被覆盖的方法的返回值一致
        (3)覆盖的方法所抛出的异常必须和被覆盖的方法所抛出的异常一致,或者是其子类
        (4)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖
例三、创建一个虚方法并重写这个虚方法,通过调用两个方法比较结果

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; 

namespace Text
{
  class A
  {
    public virtual void a()//创建的虚方法
    {
      Console.WriteLine("这是虚方法");
    }
  }
  class B : A
  {
    public override void a()
    {
      Console.WriteLine("这是重写后的方法");
</span>    }
  }
  <span style="font-size:18px;">class Program
  {
    static void Main(string[] args)
    {
      B b1 = new B();//创建类B的对象b1
      b1.a();//调用重写后的a方法
      A a1 = new A();//创建类A的对象a1
      a1.a();//调用虚方法a
      A a2 = b1;//将类B的对象b1赋值给类A的对象a2
      a2.a();//调用虚方法a
      Console.ReadLine();
    }
  }
}
</span>

输出的结果为:这是重写后的方法
                       这是虚方法
                       这是重写后的方法
四、外部方法(这个方法很新奇,联想到很多)
        当方法声明包含extern修饰符时,称该方法为外部方法。外部方法是在外部实现的,编程语言通常是使用C#以外的语言。外部方法不可以是泛型。
        extern修饰符通常与DllImport属性一起使用,从而使外部方法可以由DLL(动态链接库)实现。执行环境可以支持其他用来提供外部方法实现的机制。当外部方法包含DllImport属性时,该方法声明必须同时包含一个static修饰符。
        在使用DLLImport属性时,一定要引入System.Runtime.InteropServices命名空间,此命名空间是提供各种各样支持COM interop及平台调用服务的成员。
例四、通过外部方法和Dlllmport属性调用“User32.dll”实例自定义信息提示框的功能

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;//必须引入的命名空间
namespace Text
{
  class Program
  {
    [DllImport("User32.dll")]//调用User32.dll
    public static extern int MessageBox(int H, string m, string c, int type);//定义的外部方法
    static int Main(string[] args)
    {
      Console.Write("请输入信息:");
      string str = Console.ReadLine();//接受输入的信息
      return MessageBox(0,str,"我的信息提示框",0);//以信息提示框输出
    }
  }
}</span>

输出的结果为:

五、分部方法
        若一个方法声明中含有partial修饰符,则称该方法为分部方法。只能讲分部方法声明为分部类型的成员,而且要遵守约束数目。分部方法有着严格的限制。分部方法必须在分部类或分部机构内声明。它们必须是私有的,不能返回值,不能有输出参数。因为任何针对没有被实现的分部方法的调用都会简单地被忽略,所以说这些限制是非常有必要的。
        分部方法不能作为一个明确分配的变量,仅被代码生成器在处理轻量级事件的时候使用。假设用户解析一个数据库或者一个XML文件,然后生成了数据类,结果会发现有数十个类,几百个属性以及一大堆泛型和模板文件等。分部方法另外一个经常被用到的地方是验证,或者让属性的setter去更新另一个属性。所以如果用户要使用产生的代码,或者在运行时有几百个事件和千个方法调用的话(其实大多数情况下只用到了其中的一点点),就可以选择分部方法。分部方法在声明和使用时要比事件容易得多,如果没有用到它们,它们就会消失。从分部方法必须是私有的限制中,
Alexander发现了该方法的不足之处,即如果用户喜欢原数据驱动的应用,并且已经被ASP.NET的数据绑定所困扰时(因为没有其他的方法可以附上原数据),那么,将来会出现丢失信息的可能。
例五、创建一个类的分部方法并且在另一个部分中引用

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; 

namespace Text
{
  public partial class Program//定义的分部类
  {
    private int _setup;//定义的字段
    public int setup//定义的方法
    {
      set
      {
        _setup=value;
      }
      get
      {
        return _setup;
      }
    }
    partial void text(int t);//声明分部方法
    partial void text(int t)//实现声明
    {
      t += _setup;
      Console.Write(t);
    } 

  }
  partial class Program
  {
    static void Main(string[] args)
    {
      Program pg = new Program();//创建类对象
      pg._setup = 100;//设置属性
      pg.text(50);//调用方法
      Console.ReadLine();
    }
  }
}</span>

输出的结果为:150

以上就是关于C#的方法五个例题分析,希望对大家的学习有所帮助。

(0)

相关推荐

  • 轻松学习C#的密封类

    密封类概述        并不是所有的类都可以被继承,C#语言中就是密封类.在C#语言中我们可以把类声明为sealed.这表示不能继承该类,如果想要继承那么编译器肯定会报错.在把类或方法标记为sealed时,最可能出现的情形时:如果要对库,类或自己编写的其他类进行操作,则重写某些功能会导致编译错误.也可以因商业原因把类或方法标记为sealed,以防第三方违反注册协议的方式扩展该类.但是在一般情况下,在把类或方法标记为sealed时要小心,因为这么做会限制它的使用.即使不希望它能继承一个类或重写类

  • 轻松学习C#的装箱与拆箱

    首先看一看什么是装箱和拆箱?        简单的来说:        装箱就是值类型转换为引用类型:        拆箱就是引用类型转换为值类型.        值类型,包括原类型(Sbyte.Byte.Short.Ushort.Int.Uint.Long.Ulong.Char.Float.Double.Bool.Decimal).枚举 (enum) .结构 (struct).        引用类型包括类.数组.接口.委托.字符串等. 装箱:值类型到引用类型或到此值类型所实现的任何接口类型的

  • 轻松学习C#的预定义数据类型

    C#的预定义数据类型包括两种,一种是值类型,一种是引用类型.值类型的变量在内存中是存储在堆栈中的,字面上理解就是直接保存其值,如声明一个属于值类型的整型变量,并给它赋予另一个整型变量的值,则在内存中事先复制一个整型变量的值,然后将其赋予刚刚声明的整型变量,这时内存中就会有两个整型值.引用类型的变量在内存中是直接保存其值的引用.C#语言中大多数复杂数据类型都是引用类型.        先来一个值类型的常量的例子        根据用户输入圆的半径,求圆的面积的代码: <span style="

  • 轻松学习C#的属性

    属性是提供对对象或类的特性进行访问的成员.属性提供功能强大的方法将声明信息与C#代码(类型,方法,属性等)相关联.属性的设置包括字符串的长度,字体的大小,窗口的焦点,用户的名字等.         使程序员可以创造新的声明信息的种类,称为属性.属性是对现实世界中实体特征的抽象,是为访问自定义类型的注释信息提供通用的访问方式.属性使类能够以一种公开的思路方法获取和设置值,同时隐藏实现或验证代码.C#的属性具有保护功能,可以让用户像访问域一样访问属性.         属性包括字符串各种信息和字符串

  • 轻松学习C#的基础入门

    C#是一种简单的,安全的,稳定的,由C和C++衍生出来的面向对象的编程语言,它在继承C和C++强大功能的同时,去掉了它们的一些复杂性,综合了Visual Studio简单的可视化操作和C++高效的运行效率,以其强大的操作能力,独特的语法风格,创新的语言特性,便捷的面向组件编程的支持,使其成为.NET开发的首选语言,并成为ECMA和ISO的标准规范.        C#和Java有着惊人的相似,主要包括诸如单一继承,接口,与Java几乎同样的语法和编译成中间代码在运行的过程.但是C#和Java有着

  • 轻松学习C#的结构和类

    类和结构是.NET Framework中的同样类型系统的两种基本构造.两者在本质上都属于数据结构,封装这一组整体作为一个逻辑单位的数据和行为.数据和行为是该类或结构的"成员",它们包含着各自的方法,属性和事件等.        结构        结构是C#程序员用来定义自己的值类型的最普遍的机制.结构比枚举更强大,因为它提供方法,字段,操作符和访问控制等.        结构与类很相似,都表示可以包含数据成员和函数成员的数据结构.但是,与类不同,结构是一种值类型,并且不需要堆分配.结

  • 轻松学习C#的正则表达式

    在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.正则表达式拥有一套自己的语法规则,常见语法包括字符匹配,重复匹配,字符定位,转义匹配和其他高级语法(字符分组,字符替换和字符决策),使用正则表达式时,首先构造正则表达式,这就用到了Regex类.其构造方式有两种:         基本形式Regex(正则表达式)         基本形式Regex(正则表达式,匹配选项) 其中匹配选项是提供一些特殊的帮助,是一个枚举值,包括下面六个值: (

  • 轻松学习C#的读写操作

    在看到C#流程控制结构的这一章节,看到了一个很好的关于C#读写操作的一个例子.这个例子就是典型的for迭代语句编写"小九九表". 第一种输出格式的代码: <span style="font-size:18px;"> for (int i = 1; i <=9; i++) { for (int j = 1; j <= i; j++) { Console.Write("{0}*{1}={2}", i, j, i * j); }

  • 轻松学习C#的方法

    在类中自定义的"函数"称为"方法",由于C#是完全面向对象的语言,同时为了便于解释后面要学的C#类,这里的"方法"来称呼"函数".        方法是一种用于实现可以有对象或类执行的计算机或操作的成员,是一个已命名的语句集.每个方法都有一个名称和主体.方法名应该是一个有意义的标识符,应描述出方法的用途.方法主体包含了调用方法时实际执行的语句.用户可以为大多数方法提供一些数据来进行处理,并让其返回一些信息(通常是处理结果).方

  • XML 轻松学习手册(比较不错)第1/3页

    我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章.首先有两点是需要肯定的: 第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会: 第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高.不要害怕和逃避,毕竟我们还年轻. 提纲 本文共分五大部分.分别是XML快速入门,XML的概念,XML的术语,XML的实现,XML的实例分析.最后附录介绍了XML的相关资源.作者站在普通网页设计人员的角度,用平实生动的语言,向您讲述XML的方

  • XML轻松学习手册(三):XML的术语

    提纲: 导言 一.XML文档的有关术语 二.DTD的有关术语 导言 初学XML最令人头疼的就是有一大堆新的术语概念要理解.由于XML本身也是一个崭新的技术,正在不断发展和变化,各组织和各大网络公司(微软,IBM,SUN等)都在不断推出自己的见解和标准,因此新概念漫天飞就不足为奇了.而国内又缺乏权威的机构或组织来对这些术语正式定名,你所看见的有关XML的中文教材大部分是靠作者本身的理解翻译过来的,有些是正确的,有些是错误的,更加妨碍了我们对这些概念的理解和学习. 你下面将要看到的关于XML术语的解

  • XML轻松学习手册(3)XML的术语

    第三章 XML的术语提纲: 导言 一.XML文档的有关术语 二.DTD的有关术语 导言 初学XML最令人头疼的就是有一大堆新的术语概念要理解.由于XML本身也是一个崭新的技术,正在不断发展和变化,各组织和各大网络公司(微软,IBM,SUN等)都在不断推出自己的见解和标准,因此新概念漫天飞就不足为奇了.而国内又缺乏权威的机构或组织来对这些术语正式定名,你所看见的有关XML的中文教材大部分是靠作者本身的理解翻译过来的,有些是正确的,有些是错误的,更加妨碍了我们对这些概念的理解和学习. 你下面将要看到

  • 轻松学习XML教程

    传统上,我们浏览网页,如果加入最新的数据.只能是等我们重新向服务器端请求时才能显示出来. 但是,对于一些时效性很强的网站.传统的这种做法是不能满足的. XML越来越热,关于XML的基础教程网络上也随处可见.可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章.首先有两点是需要肯定的: 第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会: 第

  • XML轻松学习手册(2)XML概念

    第二章 XML概念 导言 经过第一章的快速入门学习,你已经知道了XML是一种能够让你自己创造标识的语言,它可以将数据与格式从网页中分开,它可以储存数据和共享数据的特性使得XML无所不能.如果你希望深入学习XML,系统掌握XML的来龙去脉,那么我们首先还是要回到XML概念的问题上来.XML(Extensible Markup Language),一种扩展性标识语言."扩展性"标识"语言".每一个词都明确的点明了XML的重要特点和功能.我们来仔细分析: 一. 扩展性 二

  • 轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)

    一.EasyUI创建基础树形网格 树形网格(TreeGrid)组件从数据网格(DataGrid)继承,但是允许在行之间存在父/子节点关系.许多属性继承至数据网格(DataGrid),可以用在树形网格(TreeGrid)中.为了使用树形网格(TreeGrid),用户必须定义 'treeField' 属性,指明哪个字段作为树节点. 本文将向您展示如何使用树形网格(TreeGrid)组件设置一个文件夹浏览. 创建树形网格(TreeGrid) <table id="test" title

  • JavaScript该如何学习 怎样轻松学习JavaScript

    js给初学者的印象总是那么的"杂而乱",相信很多初学者都在找轻松学习js的途径.我试着总结自己学习多年js的经验,希望能给后来的学习者探索出一条"轻松学习js之路".js给人那种感觉的原因多半是因为它如下的特点: A:本身知识很抽象.晦涩难懂,如:闭包.内置对象.DOM. B:本身内容很多,如函数库.对象库就一大堆. C:混合多种编程思想.它里面不但牵涉面向过程编程思想,又有面向对象编程思想,同时,它的面向对象还和别的编程语言(如:C++,JAVA,PHP)不大一样

  • XML轻松学习手册(二):XML概念

    导言 经过第一章的快速入门学习,你已经知道了XML是一种能够让你自己创造标识的语言,它可以将数据与格式从网页中分开,它可以储存数据和共享数据的特性使得XML无所不能.如果你希望深入学习XML,系统掌握XML的来龙去脉,那么我们首先还是要回到XML概念的问题上来.XML(Extensible Markup Language),一种扩展性标识语言."扩展性""标识""语言".每一个词都明确的点明了XML的重要特点和功能.我们来仔细分析: 一. 扩展性

  • XML轻松学习手册(一):XML快速入门

    前言 XML越来越热,关于XML的基础教程网络上也随处可见.可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章.首先有两点是需要肯定的: 第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会: 第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高.不要害怕和逃避,毕竟我们还年轻. 提纲 本文共分五大部分.分别是XML快速入门,XML

随机推荐