您的位置:首页 > 其它

2016-03-20枚举、结构、索引器值类型、引用类型

2016-03-22 20:12 113 查看

枚举、结构、索引器值类型、引用类型

1、声明格式

class Book
{
//内容
}


2、类的成员

{% highlight C# linenos %}
public class Student
{
int age = 26;//字段
private string name;//字段
public string Name //属性
{
get { return name; }
set { name = value; }
}
public void SayHi() //方法
{
…
}
}

{% endhighlight %}


字段

在类中将字段,设置为私有,则外部无法访问;若设置为公共,则外部有可能对其进行非法修改,因此在C#中常将字段封装成属性,讲属性设置为公共的,在属性中用get set访问器(可数据判断)控制读写。

属性

属性的类型必须和字段一致。

get set 都有 表示读写属性;仅有get则表示只读属性;仅有set则为只写属性。在读写时,都可对其值进行判断。

在vs中,在写好的字段上,右键选择重构=》封装字段 (快捷键Ctrl+R,E),即可自动对字段封装成属性。

方法

方法是类或者对象的行为

访问修饰符 返回类型 方法名 ( 参数列表 )

{

// 方法的主体…

}

方法的重载:同一个方法名,不同的参数和返回值类型,仅仅是返回值类型不同的不能构成重载。

3、静态 static

在定义方法时,加入了static修饰符,则表示方法为静态方法,可不通过对象而直接通过类来调用。

1. 静态方法:

* static关键字

* 使用类名调用

* 可访问静态成员

* 不可以直接访问非静态成员(可间接通过对象访问)

* 不能调用实例方法

* 调用前初始化

2. 实力方法:

* 不需要static关键字

* 使用类实例化的对象调用

* 可访问静态成员

* 可访问实例成员

* 直接访问实例方法、静态方法

* 在实例化对象时初始化

4、特殊非方法:构造方法(构造函数)

构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。

示例:

{% highlight C# linenos %}
class Student
{
public Student(string name, int age, string hobby)
{
this.Name = name;
this.Age = age;
this.Hobby = hobby;
}
}
{% endhighlight %}


构造函数名必须与类名一致,无返回类型,定义格式为

public 类名(参数列表)
{
//初始化成员的代码
}


定义类之后,如果不写构造函数,会自动给生成一个构造函数,参数列表为空,也不做成员的初始化,仅仅自动生成一个形式,以便我们在实例化时使用New 类名()来实例化(它自动对数值类型赋值为0,而对字符串等类型赋值为null)。当自己写了构造函数之后,就必须写完整,因为此时系统就不会再提供自动的构造函数了。

二、常量、枚举、结构:

1、常量声明格式:

const 数据类型 常量名称=值;

2、枚举类型:

声明格式:

{% highlight C# linenos %}

[public] enum 枚举名称

{

值1,

值2,

值3,//注意:值之间是逗号,而不是分号!

……

}


{% endhighlight %}

public :访问修饰符

enum :表示声明的是枚举类型

枚举名 一般要符合Pascal命名规范

使用:

枚举类型的使用:枚举名 变量名称=枚举名.枚举值之一:

示例:

{% highlight C# linenos %}

Pubilc enum Gender{男,女}//声明

Gender gender=Gender.男;//使用


{% endhighlight %}

在类中的使用:

示例:

{% highlight C# linenos %}

//新建一个类 单独的.cs文件

namespace PracticeClass

{

public enum Genders //定义枚举类型

{男,女}

}

//在类中调用

private Genders _gender;

internal Genders Gender
{
get { return _gender; }
set { _gender = value; }
}


{% endhighlight %}

enum 不是一种类型,它仅仅是一个定义枚举类型的关键字。通过他我们所创建的枚举的枚举名称才是一个数据类型, 或者称为类!

类型转换

1>和int相互转换:

枚举转化成int 值为枚举类型的索引值(默认从0开始,可在枚举声明时设置,格式为值=索引);

int到枚举同理,会根据索引获取到枚举中对应的值,没有则不变

2>和string相互转换:

枚举转换为string 值为枚举的值。

string到枚举的转换用Enum.Parse()方法完成

示例:

{% highlight C# linenos %}

Enum.Parse(typeof(枚举名),要转换的字符串)

public enum Accp

{

S1 ,S2,Y2

}

//……

Console.WriteLine(“S2的值是{0}.”,Accp.S2.ToString());//枚举转换为字符串

(Accp)(Enum.Parse(typeof(Accp),”S2”); //字符串转换为枚举

{% endhighlight %}

3、结构、结构体:

可以一次性声明多个不同类型的变量

声明语法:

{% highlight C# linenos %}

[piblic] struct 结构名

{

public 数据类型1 名称1;

public 数据类型2 名称3;//注意:不要忽略了public,否则外部访问不到

……

public viod Show()

{

… //成员方法

}

//在这里面,这些不叫变量,而应该成为字段!变量仅仅能存取一个值,而字段可以存储多个值

//字段通常会加下划线_

}

{% endhighlight %}

使用:

{% highlight C# linenos %}

//定义

piblic struct Person

{

piblic int pId;

piblic string pName;

public Gender pGender; //用之前的枚举类型

}

//使用

Person person1;

person1.pId=1;

person1.pName=”张三”;

person1.pGender=Gender.男;

{% endhighlight %}

结构体和类的区别

相同点:

都可以包换字段和方法

都可以实现借口

不同点:

类是引用类型,而结构体是值类型

类可以被继承,结构体不能被继承

类有默认的构造函数,结构体没有默认的构造函数

类可以添加无参的构造函数,结构体的构造函数必须带参数

类创建对象必须使用New,定义结构体可以不用New

类中可以给字段赋值,结构体内部不能给字段赋值

值类型和引用类型

值类型:

直接存储值,不同变量不同的存储空间

* 基本数据类型:int long float char bool

* 枚举类型:enum

* 结构类型:struct

值类型在做参数时,默认是值传值方式,如果希望被改变,需要加上ref关键字

引用类型:

引用类型存储的是对值的引用,对应地址

* 类:基类 System.Object 、字符串、自定义的类

* 接口:interface

* 数组

引用类型由于本来就是引用类型,在作为参数时,形参的改变会自动传递给实参(准确说,应该是在调用的时候指向了同一个地址),无需加上ref关键字

装箱、拆箱

值类型到引用类型的转化称为装箱,从引用类型到值类型的叫做拆箱

示例:

{% highlight C# linenos %}

static void Main(string[] args)

{

int i = 123;

object o = i; // 装箱

i = 456; //改变i的内容

Console.WriteLine(“值类型的值为 {0}”, i);

Console.WriteLine(“引用类型的值为 {0}”, o);

}//输出结果为456 123

int i = 123;
object o = i;  // 装箱
int j = (int)o;  //拆箱


{% endhighlight %}

索引器

索引器的定义方式如下:

public 数据类型 this[下标类型 下标名称]

索引器的具体实现代码和属性类似,也是用get和set访问器。get访问器用于获取成员变量的值,set访问器用于为成员变量赋值。索引器的使用方式和数组类似,如果我们创建了MyClass类的对象myClass,就可以通过myClass[0]、myClass[1]、myClass[2]分别表示第1个、第2个学生、第3个学生。

* 数组属性只能根据下标(索引)来访问

* 索引器可以被重载

* 可以使用更灵活的方式访问,定义访问方式

代码示例:

{% highlight C# linenos %}

class MyClass

{

public string[] student={“zhangsan”,”lisi”,”wangwu”};

public string this[int index] //定义整型索引器

{

get

{

if (index >= 0 && index < student.Length)

{

return student[index];

}

else//如果索引超出范围

{

return student[0];

}

}

set

{

if (index >= 0 && index < student.Length)

{

student[index] = value;

}

else//如果索引超出范围

{

student[0] = value;

}

}

}

}

{% endhighlight %}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: