在学方法之前先学习类……
介绍类之前先介绍下C#中常用的四个访问修饰符:
我的疑问:结构与类的区别?结构里不能定义方法,它们都可以定义多个属性,什么时候要用结构?什么时候要用类?
一、C#中的4个常用访问修饰符:
public:可以在任何地方被访问
internal:只能在本项目中被访问
private:只能在本类中被访问
protected:只能在本类和子类中被访问。
在一个类中定义变量或方法时,没有写访问修饰符,那么默认的修饰符为private。
二、什么是类?
1)类(Class)实际上是对某种类型的对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。实际上它本身并不是对象,因为它不存在于内存中。当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。
2)类与结构的区别:
结构体是一种值类型,而类是引用类型。(值类型、引用类型是根据数据存储的角度来分的)就是值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。第二个问题:两者里面是不是都有构造函数?为什么结构体用得比较少? 构造函数是为了初始化类的字段而存在的,而结构体并不需要初始化就能使用,因此,结构体中并不存在构造函数。 不能以使用多少来衡量,只是看相应问题使用最适合的方法罢了。结构体的定义是:有些数据既是相互关联的,又共同描述一个完整事物,如:一个学生的整体信息,学号、姓名、性别等。而类则使用在需要比较有层次的数据上面。
疑问:1、类与结构的实例比较 ?类与结构的差别 ?如何选择结构还是类?。。。。
3)类与结构的示例比较:
//结构示例:
public struct Person
{
string Name;
int height;
int weight
public bool overWeight()
{
//implement something
}
}
//类示例:
public class TestTime
{
int hours;
int minutes;
int seconds;
public void passtime()
{
//implementation of behavior
}
}
//调用过程:
public class Test
{
public static ovid Main
{
Person Myperson=new Person //声明结构
TestTime Mytime=New TestTime //声明类
}
}
从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。
4)那么类和结构的具体区别是什么呢?
类与结构的区别:1. 值类型与引用类型结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用注:1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用 2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承 注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样。
例如:结构实现接口
interface Image
{
void Paint();
}
struct Picture :Image
{
public void Paint()
{
//代码部分
}
private int x, y, z; // 其它结构成员
}
内部结构:结构:没有默认的构造函数,但是可以添加构造函数 没有析构函数 没有 abstract 和 sealed(因为不能继承) 不能有protected 修饰符 可以不使用new 初始化在结构中初始化实例字段是错误的类: 有默认的构造函数 有析构函数 可以使用 abstract 和 sealed 有protected 修饰符必须使用new 初始化。
5)如何选择结构还是类?
讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些2. 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。3. 在表现抽象和多级别的对象层次时,类是最好的选择4. 大多数情况下该类型只是一些数据时,结构时最佳的选择。
三、什么是属性?
1、字段用public修饰的问题;2、属性的定义get和set;3、属性是为了保护与之相对应的字段的。保证对字段的读取和赋值符合要求。4、属性可分为:读写、只读、只写三种,只有get方法的属性叫只读属性,只能读取不能写入;5、允许外部访问的变量一定要声明为属性;右击变量->重构->封装字段->确定->应用
类及其属性实例介绍:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 类与属性
{
class Program
{
static void Main(string[] args)
{
//构造方法进行传参,来对变量进行初始化。
Student stu = new Student("张三", '男', 20, 85, 82, 92);//实例化时通过构造方法给name赋值
//stu.Name = "张三";
//stu.Sex = '男';
//stu.Age = 21;
//stu.Chinese = 85.0;
//stu.Math = 78.5;
//stu.English = 95.5;
Student stu2 = new Student("李四", '女', 18);
//stu2.Name = "李四";
//stu2.Sex='女';
//stu2.Age=20;
stu2.Chinese = 80;
stu2.Math = 73;
stu2.English = 98;
Console.WriteLine("下面是张三打招呼和显示成绩的方法");
stu.SayHello();
stu.ShowScore();
Console.WriteLine("下面是李四打招呼和显示成绩的方法");
stu2.SayHello();
stu2.ShowScore();
Console.ReadKey();
}
}
}
再添加一个Student类:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 类与属性
{
class Student
{
//要将参数的name赋给字段的name
public Student(string name,char sex,int age,double chinese,double math,double english)
{
this.name = name;//可以按F12转到定义看这区分这两个name
this.sex = sex;
this.age = age;
this.chinese = chinese;
this.math = math;
this.english = english;
}
public Student(string name, char sex, int age)
{
this.name = name;
this.sex = sex;
this.age = age;
}
string name;
public string Name
{
get { return name; }//将姓名定义为只读,不能被赋值
//set { name = value; }
}
char sex;
public char Sex
{
get { return sex; }
set
{
if (value == '男' || value == '女')
{
sex = value;
}
else
{
sex = '男';
}
}
}
int age;
public int Age
{
get { return age; }
set
{
age = value >= 0 ? value : 0;
}
}
double chinese;
public double Chinese
{
get { return chinese; }
set
{
chinese = value >= 0 ? value : 0;
}
}
double math;
public double Math
{
get { return math; }
set
{
math = value >= 0 ? value : 0;
}
}
double english;
public double English
{
get { return english; }
set
{
english = value >= 0 ? value : 0;
}
}
public void SayHello()
{
Console.WriteLine("大家好,我叫{0},我今年{1}岁了,我是{2}同学", name, age, sex);
}
public void ShowScore()
{
double sum = chinese + math + english;
double avg = sum / 3;
Console.WriteLine("我叫{0},我的总分是{1},我的平均分是{2}",name,sum,avg);
}
}
}
简单介绍了类与属性,待续……