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

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

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 %}

  • 结构体和类的区别

相同点:

  1. 都可以包换字段和方法
  2. 都可以实现借口

不同点:

  1. 类是引用类型,而结构体是值类型
  2. 类可以被继承,结构体不能被继承
  3. 类有默认的构造函数,结构体没有默认的构造函数
  4. 类可以添加无参的构造函数,结构体的构造函数必须带参数
  5. 类创建对象必须使用New,定义结构体可以不用New
  6. 类中可以给字段赋值,结构体内部不能给字段赋值

值类型和引用类型

值类型:

直接存储值,不同变量不同的存储空间
* 基本数据类型: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 %}

你可能感兴趣的:(2016-03-20枚举、结构、索引器值类型、引用类型)