1:访问修饰符

访问修饰符可以定义应用程序中类成员的作用域。和C++有一些不同,下面说明一下:

public:访问不受限制,public成员可以被任何其他类访问。

private:访问只限于包含该成员的类,只有包含该成员的类才可以访问。

protected:访问限于包含该成员的类及该类的派生类。

internal:访问只限于所在的程序集,只有在同一程序集内的类才可以访问该成员。

protected internal:访问限于包含该成员的类、其派生类,及与其位于同一个程序集内的类。

2:创建对象

在C#语言中,每创建一个对象,都会首先调用new关键字后面指明的构造函数,来初始化该类对象,具体语法如下:

<类名><对象名>=new<构造函数(参数列表)>

new关键字示例:

Circle c=new Circle(0,0,10);

  访问对象成员的语法如下:

<对象名>.<成员名>

访问对象成员的示例:

double area;
area=c.getArea();

3:以一个例子总结创建类和对象的过程

(1)创建一个名为Circle的类,其内部代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication38
{
class Circle//定义Circle类
{
//定义字段
private int radius;
//定义方法
//构造函数
public Circle(int radiusValue)
{
radius = radiusValue;
}
//为radius字段编写setR()方法,为radius字段赋值,注意对字段要验证其合法性
public void setR(int radius_1)
{
if (radius_1 >= 0)
radius = radius_1;
else
radius = 0;
}
//为radius字段编写getRadius()方法,以便于用户获取字段值
public int getRadius()
{
return radius;
}
//定义getArea()方法求圆面积
public double getArea()
{
return 3.14 * radius * radius;
}
}
}

(2)在Program.cs文件中编写如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication38
{
class Program
{
static void Main(string[] args)
{
double r;
Circle circle = new Circle(1);//创建Circle类对象circle
r = circle.getArea();//调用对象circle的getArea()方法成员
Console.Write("圆半径为" + circle.getRadius() + "的圆面积:");
Console.WriteLine(r); circle.setR(10);
r = circle.getArea();//调用对象circle的getArea()方法成员
Console.Write("圆半径为" + circle.getRadius() + "的圆面积:");
Console.WriteLine(r);
Console.ReadLine(); }
}
}

(3)运行结果:

4:方法

方法就相当于函数

(1)方法的定义和调用示例

class Circle//定义Circle类
{
......
//定义getArea()方法求圆面积
public double getArea()
{
return 3.14*radius*radius;
}
}
class Program
{
static void Main(string[]args)
{
double area;
Circle circle=new Circle(1);
area=circle.getArea();//调用getArea()方法
Console.Write(circle.getRadius()+";");
Console.WriteLine(area);
Console.ReadLine();
}
}

(2)方法中的参数传递之值传递

class Program
{
static void Main(string[]args)
{
int a=3;
Square(a);
Console.WriteLine(a);
Console.ReadLine();
}
static void Square(int x)
{
x=x*x;
}
}

  调用Square()方法时,先将变量a的复制值传递给Square方法的参数x。x是Square()方法的局部变量,该局部变量在方法返回时被丢弃。因此,实际上并没有更改a变量中值。程序输出结果为3.

(3)方法的参数传递之引用传递

当变量通过引用传递时,方法接收到的是对实际变量数值的引用。因此在方法中对这个变量的任何更改都将改变原来的变量。通过使用ref关键字声明引用参数。一但在参数列表中使用了关键字ref,编译器就知道相应变量的数字通过引用来传递。如以下代码所示:

class Program
{
static void Main(string[]args)
{
int b=4;
Square(ref b);
Console.WriteLine(b);
Console.ReadLine();
}
static void Square(ref int x)
{
x=x*x;
}
}

  调用Square()方法时,因为使用了ref关键字,所以变量b以引用方式传递给Square方法的参数x。Square()方法对x变量进行了更改,也就是对变量b进行了更改。程序输出结果为16.

5:方法的重载

C#语言允许多个方法使用相同的名称,只要每个方法拥有不同的参数列表即可。这样定义方法的形式称为方法重载。如以下代码所示:

class Program
{
public static int Add(int i,int j)
{
return(i+j);
}
public static double Add(double x,double y)
{
return(x+y);
}
public static string Add(string s1,string s2)
{
return(s1+s2);
}
static void Main(string[]args)
{
Console.WriteLine(Add(1,2));
Console.WriteLine(Add(1.5,2.5));
Console.WriteLine(Add("Hello","world"));
Console.ReadLine();
} }

  当程序中的一个重载方法被调用时,C#编译器通过检查调用者使用的参数的数目、类型和顺序来选择具体的方法。在上述代码中,虽然有多个Add()方法,但是每个Add()方法中参数的个数和类型不完全相同,所有系统在调用时会自动找到最匹配的方法。

和方法一样,类的构造函数也可以重载。对构造函数重载有助于以多种方式创建实例。例如:Circle类代码

public Circle()
{
radius=0;
}
public Circle(int radius Value)
{
radius=radius Value;
}

  在Programs.cs中创建Circle类对象的代码如下:

double area;
Circle c1=new Circle();
area=c1.getArea();
Console.Write(c1.getRadius()+":");
Console.WriteLine(area);
Circle c2=new Circle(10);
area=c2.getArea();
Console.Write(c2.getRadius()+":");
Console.WriteLine(r);

  当创建c1对象时,将调用与之匹配的构造函数,及Circle()。当创建c2对象时,将调用与之匹配的构造函数,即Circle(int radius Value).

6:属性

尽管使用private这样的访问修饰符可以控制对类成员的访问,但是,在C#中通过使用属性,可以更有效地管理对类成员的访问。属性是一种类成员,它可以用来控制其他对象对本对象数据的访问。

定义属性的语法形式如下:

public|protected 数据成员数据类型 属性名
{
get{
//获取属性的代码
}
set{
//设置属性的代码
}
}

  例如:

建立Circle类,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication39
{
class Circle
{
private int radius;
const double PI = 3.14;
public Circle(int radiusValue)
{
CircleRadius = radiusValue;
}
//CircleRadius属性
public int CircleRadius
{
get
{
return radius;
}
set
{
radius = ((value >= 0) ? value : 0);
}
}
public double getArea() {
return PI * CircleRadius * CircleRadius;
}
}
}

  主程序Program中代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication39
{
class Program
{
static void Main(string[] args)
{
Circle c = new Circle(1); c.CircleRadius = 10;
Console.WriteLine(c.getArea()); c.CircleRadius = -9;
Console.WriteLine(c.getArea()); Console.ReadLine();
}
}
}

  运行结果:

通过get访问器和set访问器访问private数据,不仅防止字段接受无效值,而且也隐藏了字段的内部实现。根据情况的不同,C#语言允许只提供get访问器或者只提供set访问器,也可以同时提供get和set访问器。

C#_类的更多相关文章

  1. C++_进阶之函数模板_类模板

     C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...

  2. 方法引用_通过this引用本类的成员方法和方法引用_类的构造器(构造方法)引用和数组的构造器引用

    package com.yang.Test.ThisMethodReference; /** * 通过this引用本类的成员方法 */ public class Husband { //定义一个买房子 ...

  3. Python学习笔记008_类_对象_继承_组合_类相关的BIF

    # 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...

  4. Python_面向对象_类2

    类的几个装饰器方法: @classmethod (类方法):使之无法访问实例变量 class Animal(object): def __init__(self, name): self.name = ...

  5. oc_转_类的数组的实现和操作

    OC的数组对象的基本方法的使用:因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作. 其中Person.h中的代码为:   01.#import&l ...

  6. 04737_C++程序设计_第4章_类和对象

    例4.1 描述点的Point类. 例4.2 根据上面对Point类的定义,演示使用Point类的对象. #define _SCL_SECURE_NO_WARNINGS #include <ios ...

  7. 04737_C++程序设计_第7章_类模板与向量

    例7.1 使用类模板的实例. 例7.2 求4个数中最大值的类模板程序. #include <iostream> using namespace std; template <clas ...

  8. C++_基础_类和对象3

    内容: (1)析构函数 (2)拷贝构造和拷贝赋值 (3)静态成员 (4)成员指针 (5)输入输出运算符重载 1.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...

  9. C++_基础_类和对象2

    内容: (1)构造函数 (2)初始化列表及其必要性 (3)支持自定义类型转换的构造函数 (4)this指针 (5)const对象和成员函数 (6)析构函数 1.构造函数1.1 格式: class 类名 ...

  10. C++_基础_类和对象

    内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...

随机推荐

  1. Linux与Windows的设备驱动模型对比

    Linux与Windows的设备驱动模型对比 名词缩写: API 应用程序接口(Application Program Interface ) ABI 应用系统二进制接口(Application Bi ...

  2. Java Web-JSP学习

    Java Web-JSP学习 概念 Java Server Pages:Java服务器端页面.可以在其中直接定义HTML标签,也可以在其中直接定义java代码. 关于JSP和JAVASCRIPT的区别 ...

  3. LeetCode 腾讯精选50题--2的幂

    在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案: 1. 做位移操作 2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想 ...

  4. LeetCode:627.交换工资

    题目链接:https://leetcode-cn.com/problems/swap-salary/ 题目 给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值.交换所有的 ...

  5. ES6入门九:Symbol元编程

    JS第七种数据类型:Symbol Symbol的应用场景 11个Symbol静态属性 Symbol元编程 一.JS第七种数据类型:Symbol 在ES6之前的JavaScript的基本数据类型有und ...

  6. JavaScript 的编译原理

    JavaScript 是一门编译语言. JavaScript 的编译是发生在代码执行前的几微米(甚至更短)的事件内,所以 JavaScript 没有其他语言那么多的时间来进行优化. 当 JavaScr ...

  7. JS数组去掉重复元素

    JS数组去掉重复元素,这里提供3中写法. var arr =[1,2,3,4,5,6,3,4,7,2,4,1,8]; 输出:[1,2,3,4,5,6,7,8]; 1.使用indexOf() arr.i ...

  8. 通过ABAP代码判断当前系统类型,BYD还是S4 OP还是S4 Cloud

    用工具类 CL_COS_UTILITIES IS_BYD 如果是BYD系统,这个方法的实现会硬编码返回一个true, 在其他系统里则返回false,如图: IS_SUITE 原理同上,suite系统里 ...

  9. go语言入门(9)文本文件处理

    1,字符串处理 字符串在开发中经常用到,包括用户的输入,数据库读取的数据等,我们经常需要对字符串进行分割.连接.转换等操作,我们可以通过Go标准库中的strings和strconv两个包中的函数进行相 ...

  10. django的几种缓存配置

    前言 首先说,为什么要用缓存的,由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存 ...