C#_类
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#_类的更多相关文章
- C++_进阶之函数模板_类模板
C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
- 方法引用_通过this引用本类的成员方法和方法引用_类的构造器(构造方法)引用和数组的构造器引用
package com.yang.Test.ThisMethodReference; /** * 通过this引用本类的成员方法 */ public class Husband { //定义一个买房子 ...
- Python学习笔记008_类_对象_继承_组合_类相关的BIF
# 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...
- Python_面向对象_类2
类的几个装饰器方法: @classmethod (类方法):使之无法访问实例变量 class Animal(object): def __init__(self, name): self.name = ...
- oc_转_类的数组的实现和操作
OC的数组对象的基本方法的使用:因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作. 其中Person.h中的代码为: 01.#import&l ...
- 04737_C++程序设计_第4章_类和对象
例4.1 描述点的Point类. 例4.2 根据上面对Point类的定义,演示使用Point类的对象. #define _SCL_SECURE_NO_WARNINGS #include <ios ...
- 04737_C++程序设计_第7章_类模板与向量
例7.1 使用类模板的实例. 例7.2 求4个数中最大值的类模板程序. #include <iostream> using namespace std; template <clas ...
- C++_基础_类和对象3
内容: (1)析构函数 (2)拷贝构造和拷贝赋值 (3)静态成员 (4)成员指针 (5)输入输出运算符重载 1.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...
- C++_基础_类和对象2
内容: (1)构造函数 (2)初始化列表及其必要性 (3)支持自定义类型转换的构造函数 (4)this指针 (5)const对象和成员函数 (6)析构函数 1.构造函数1.1 格式: class 类名 ...
- C++_基础_类和对象
内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...
随机推荐
- python selenium1 模拟点击 测试对象 58同城验证码
#!/usr/bin/python# -*- coding: UTF-8 -*-# @Time : 2019/12/5 17:30# @Author : shenghao/10347899@qq.co ...
- react快速上手二(使用JSX语法)
前提: 下载依赖,配置 cnpm i babel-preset-react -D JSX语法的本质: 还是以 React.createElement 的形式来实现的,并没有直接把 用户写的 HTML代 ...
- Android Stdio部分配置
一.Error:Cause: unable to find valid certification path to requested target主要是在根目录的build.gradle下配置的jc ...
- RobHess的SIFT环境配置
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 参考博客:https://www.cnblogs.com/cql ...
- Oracle笔记(十二) 集合、序列
一.集合 在数学的操作之中存在交.差.并.补的概念,而在数据的查询中也存在此概念,有如下几个连接符号: UNION:连接两个查询,相同的部分不显示: UNION ALL:连接两个查询,相同的部分显示: ...
- [Abp vNext微服务实践] - 租户登录
简介 Abp vNext微服务授权验证基于ids4,实现租户登录需要在授权服务中获取token,和之前的介绍的登录方式一样,只是多了tenant参数.本篇将介绍在Abp vNext授权服务中启用多租户 ...
- linux——实际工作中如何使用linux
实际工作中,linux系统都不会在我们自己的电脑上,linux系统安装在机房的服务器上,我们操作linux不可能跑到机房去,所以我们需要有一个工具,能在公司通过网络远程连接到机房的linux服务器上 ...
- PyTorch 启程&拾遗
1..Tensors are similar to NumPy’s ndarrays, with the addition being that Tensors can also be used on ...
- C语言根据结构体成员变量的地址,得到结构体的地址
看nginx代码时发现双链表使用的是这种方法,记录一下 给出一个实例来说明 struct father_t { int a; char *b; double c;}f;char *p ...
- C++踩坑记录(一)std:;string的析构
之前写服务端程序有一个往消息队列里面推json的过程,然后发现推进去C#端取到的无论如何都是个空指针 简单复现一下现场 string str1 = string("hello1") ...