前面定义的Person的类,里面的成员包括:字段、属性、方法、事件等,此外,前面说的嵌套类也是类的成员。

a.类的成员为分:静态成员(static)和非静态成员

b.静态成员用static标识,不标识则默认为非静态成员

c.静态成员属于类所有,动态成员则属于实例所有,即对象

d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域。非静态成员则在类的每个实例,都创建一个内存域。

下面主要说明一下类的主要成员:字段、属性、方法

1.类的成员——字段(field)

 字段声明:(static/readonly) <Type> <变量名称>   

a.可以理解为类的一个私有变量,通常都是私有的(private)。

b.字段的定义通常以小写字母开头或 “_” 开头。

c.字段声明修饰符有static(静态)和readonly(只读)两种。

d字段通常为私有,因此一般不需要使用访问修饰符.

示例:

1    static int eyesCount=2;
2 readonly int earsCount=2;

2.类的成员——属性(property)

a.可以理解为类的一个公有变量,通常都是公有的(public)

b.属性有get 和 set 两个方法。

c.get 访问器返回与属性声明类型相同的数据, 表示的意思是调用时可以得到内部的字段的值或引用。

d.set 访问器没有显示设置的参数,它有一个隐式参数value    它的作用是调用时,可以给属性内部字段或引用赋值。

e.由于类的成员默认为私有,因为根据属性为公有的特征,在面向对象开发过程中,要使用修饰符public来声明一个属性为公有。

f.属性可以忽略get或set访问器,但是不能两个都忽略.

示例:

 1 string _country;
2 //读写属性
3 public string Country
4 {
5 set { _country = value; }
6 get { return _country; }
7 }
8 //只读属性
9 public string CountryOnleread
10 {
11 get { return _country; }
12 }
13 //只写属性
14 public string Countryonlywrite
15 {
16 set { _country = value; }
17 }

6.类的成员——方法 (Method )

      声明:(访问修饰符) <类型> <方法名>{方法体}

     调用:[<类名.>]|[<实例对象名.>]<方法名>([<实参列表>])

     定义:是类中用于执行计算或其它行为的成员

静态方法:
     方法分为实例方法和静态方法(同前面讲的类的成员)

静态方法中只能调用静态字段,不允许调用非静态字段

方法参数:

值参数:不含任何修饰符。方法中的形参是实参的一份拷贝,形参的改变不会影响到内存中实参的的值,实参是安全的。

引用参数:以ref修饰符声明。

ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
    若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
    传递到 ref 参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。
    属性不是变量,因此不能作为 ref 参数传递。
    尽管 ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的。如果尝试这么做,将导致不能编译该代码。
    如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载。

代码示例:

//调用
double[] numbers = new double[] { 1, 2, 3, 5.5 };
double i = 0;
MyAddOperation(numbers, ref i);
Console.WriteLine("计算结果的2倍是:{0}",i*2);
Console.ReadLine(); //引用参数方法声明
public static void MyAddOperation(double[] numbers, ref double result)
{
result = 0;
foreach (double num in numbers)
result += num;
Console.WriteLine("计算结果是:{0}", result);
}

输出参数:以out修饰符声明。和ref类似,它也是直接对实参进行操作。在方法声明和方法调用时都必须明确地指定out关键字。out参数声明方式不要求变量传递给方法前进行初始化,因为它的含义只是用作输出目的。但是,在方法返回前,必须对out参数进行赋值。 
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似。

与 ref 的不同之处: 
ref 要求变量必须在传递之前进行初始化。 
尽管作为 out 参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。

示例:

 1 //调用
2 double[] numbers = new double[] { 1, 2, 3, 5.5 };
3 double i = 0;
4 MyAddOperation(numbers, out i);
5 Console.WriteLine("计算结果的2倍是:{0}",i*2);
6 Console.ReadLine();
7
8 //输出参数方法声明
9 public static void MyAddOperation(double[] numbers, out double result)
10 {
11 result = 0;
12 foreach (double num in numbers)
13 result += num;
14 Console.WriteLine("计算结果是:{0}", result);
15 }

 数组型参数:以params修饰符声明。params关键字用来声明可变长度的参数列表。方法声明中只能包含一个params参数。params 参数在参数数目可变的情况下,非常有用,看下面的示例:

 1 //调用方法
2 double[] numbers = new double[] { 1, 2, 3, 5.5 };
3 Console.WriteLine("计算结果是:{0}", MyAddOperation(numbers));
4
5 //数组型参数声明
6 public static double MyAddOperation(params double[] numbers)
7 {
8 double result = 0;
9 foreach (double num in numbers)
10 result += num;
11 return result;
12 }

Virtual方法(虚方法)

virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:

情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。

情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。

Abstract方法(抽象方法)

abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。

(关于抽象类,在后面会详细说明)

要点:

1.静态方法中只能调用静态字段,不允许调用非静态字段

2. 无返回值的方法,类型为 void

C#类的成员(字段、属性、方法)的更多相关文章

  1. python基础(26):类的成员(字段、方法、属性)

    1. 字段 字段:包括普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 字段的定义和使用: class Province: # ...

  2. Python面向对象(类的成员之属性)

    day24 类的成员之属性 class Foo(): def bar(self): print("bar") @property def per(self): ') return ...

  3. c#基础3-方法的重载静态和非静态,字段属性,方法

    方法的重载概念:方法的重载指的就是方法的名称相同给,但是参数不同.参数不同,分为两种情况1).如果参数的个数相同,那么参数的类型就不能相同.2).如果参数的类型相同,那么参数的个数就不能相同.***方 ...

  4. C#-类 字段 属性 方法 特性

    方法的签名 包括参数个数.参数类型.方法返回值 base和this关键字 1.使用base关键字,就可以使用父类中的字段.属性.方法 2.一旦父类中存在有参数的构造函数,那么子类就必须使用base来覆 ...

  5. 深入理解PHP内核(十四)类的成员变量及方法

    原文链接:http://www.orlion.ga/1237/ 类的成员变量在PHP中本质是一个变量,只是这些变量都归属于某个类,并且给这些变量是有访问控制的. 类的成员方法在PHP中本质是一个函数, ...

  6. python 面向对象(类的成员,属性,绑定和非绑定,)

    面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...

  7. 类的成员和属性_python

    一.字段和方法分类 方法分类: 二.属性(将方法伪装成字段) 三种伪装方式:@property  @perr.setter @perr.deleter 属性使用的场景:分页 三.公有成员和私有成员 私 ...

  8. Python类总结-封装(私有属性,方法)

    封装基础 广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装 只让自己的对象能调用自己类中的方法 狭义上的封装-面向对象三大特性之一(私有变量,用公有的方法封装私有属性,方法叫封装) 把 ...

  9. Spring 注解实体类中非数据库字段属性

    解决办法:在属性的get方法上加上一段注解标识它是临时属性,不是数据库字段就OK @Transient public List<Reverts> getChildList() { retu ...

  10. javaScript【创建对象、创建类、成员变量、方法、公有和私有、静态】

    创建对象 方式① 直接使用new Object() var obj = new Object(); 方式② 使用空的{}大括号 var obj2 = {}; 测试 增加属性,访问属性 我们要为创建的对 ...

随机推荐

  1. IE6、IE7、IE8及其他浏览器多个元素并排显示

    IE6.IE7.IE8及其他浏览器多个元素并排显示 HTML代码 <div class="line"> <h1>全部input框</h1> &l ...

  2. 分享知识-快乐自己:Liunx—Maven 部署步骤

    第一步: 点我下载 Liunx—Maven Linux命令下载:wget [下载文件存放路径]   [下载文件地址] 第二步: 上传 Maven 并解压到 指定的目录:(上传方式 xftp 或 rz ...

  3. Mysql存储过程及调用

     存储过程: 存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的 ...

  4. CyclicBarrier与CountDownLatch的区别

    import java.util.concurrent.CountDownLatch; /** * 作用于单个线程或几个线程,,在其他线程执行完之前,一直等待(await)知道countDown为零 ...

  5. 使用Chrome采集摄像头并生成视频下载

    主要使用2个技术点:WebRtc 的 getUserMedia 和 MediaRecorder 注意点 开始录制调用 start 方法要传入一个采样间隔,这样录制的媒体会按照你设置的值进行分割成一个个 ...

  6. 关于MFC主菜单和右键弹出菜单

    一.主菜单.弹出菜单和右键菜单的概念: 主菜单是窗口顶部的菜单,一个窗口或对话框只能有一个主菜单,但是主菜单可以被更改(SetMenu()更改): 创建方式:CMenu::CreateMenu(voi ...

  7. LeetCode:Add Digits - 非负整数各位相加

    1.题目名称 Add Digits (非负整数各位相加) 2.题目地址 https://leetcode.com/problems/add-digits/ 3.题目内容 英文:Given a non- ...

  8. bzoj 2823: [AHOI2012]信号塔 最小圆覆盖

    题目大意: 给定n个点,求面积最小的园覆盖所有点.其中\(n \leq 10^6\) 题解: 恩... 刚拿到这道题的时候... 什么???最小圆覆盖不是\(O(n^3)\)的随机增量算法吗????? ...

  9. VBA记录当前系统时间并精确到毫秒

    想做个功能,点一次按钮,就在A1记录一次当前系统时间,要精确到毫秒的.再点一次按钮就在A2显示,以此类推! 例如:这个功能可以用来做歌词记时间! Sub ttt() ActiveCell.Select ...

  10. python 3中对list进行sort时,返回值为None

    进行在用python的list结构时, 发现一个问题: methods = [&apos;blogger.deletePost&apos;, &apos;blogger.get ...