1、构造函数
1.构造函数
我们构造对象的时候,对象的初始化过程是自动完成的,但是在初始化对象的过程中有的时候需要做一些额外的工作,例如需要初始化对象存储的数据,构造函数就是用于初始化数据的函数。
声明基本的构造函数的语法就是声明一个和所在类同名的方法,但是该方法没有返回类型。
public class MyClass
{
public MyClass()
{
这个构造函数的函数体
}
}
当我们使用new关键字创建类的时候,就会调用构造方法。
我们一般会使用构造方法进行初始化数据的一些操作。
构造函数可以进行重载,跟普通函数重载是一样的规则
注意:
当我们不写,任何构造函数的时候,编译器会提供给我们一个默认的 无参的构造函数,但是如果我们定义了一个或者多个构造函数,编译器就不会再提供默认的构造函数。
namespace _001_调试和错误处理
{
class Vector3
{
//我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
public Vector3()
{
Console.WriteLine("Vector3的构造函数被调用了");
}
//定义一个有参数的构造函数
public Vector3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
length = Length();
}
//编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
private float x, y, z,length;
//为字段提供set方法,来设置字段的值
public void SetX(float x)
{
//如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
//我们可以通过this.x表示访问的是类的字段或者方法
this.x = x;
}
public void SetY(float y)
{
this.y = y;
}
public void SetZ(float z)
{
this.z = z;
}
public float Length()
{
return(float)Math.Sqrt(x*x+y*y+z*z);
}
}
}
namespace _001_调试和错误处理
{
class Program
{
static void Main(string[] args)
{
//Vector3 v1 = new Vector3();
//v1.x = 1;
//v1.y = 1;
//v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
//v1.SetX(1);
//v1.SetY(1);
//v1.SetZ(1);
Vector3 v1 = new Vector3(1,1,1);
Console.WriteLine(v1.Length());
Console.ReadKey();
}
}
}
2.属性的定义
1.属性的定义
属性的定义结构:
public int MyIntProp
{
get
{
// get code
}
set
{
//set code
}
}
1,定义属性需要名字和类型
2,属性包含两个块 get块和set块
3,访问属性和访问字段一样,当取得属性的值的时候,就会调用属性中的get块,所以get块,类型需要一个返回值就是属性的类型;当我们去给属性设置值的时候,就会调用属性中的set块,我们可以在set块中通过value访问到我们设置的值。
例子:
namespace _001_调试和错误处理
{
class Vector3
{
//我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
public Vector3()
{
Console.WriteLine("Vector3的构造函数被调用了");
}
//定义一个有参数的构造函数
public Vector3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
length = Length();
}
//编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
private float x, y, z,length;
//为字段提供set方法,来设置字段的值
public void SetX(float x)
{
//如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
//我们可以通过this.x表示访问的是类的字段或者方法
this.x = x;
}
public void SetY(float y)
{
this.y = y;
}
public void SetZ(float z)
{
this.z = z;
}
public float Length()
{
return(float)Math.Sqrt(x*x+y*y+z*z);
}
//定义属性
public int MyIntProperty
{
set
{
Console.WriteLine("属性中set块被调用");//get和set可以只有其中一个
Console.WriteLine("在set块中访问value的值是:"+value);
}
//如果没有get块,就不能通过属性取值了
get
{
Console.WriteLine("属性中的get块被调用");
return 100;
}
}
}
}
namespace _001_调试和错误处理
{
class Program
{
static void Main(string[] args)
{
//Vector3 v1 = new Vector3();
//v1.x = 1;
//v1.y = 1;
//v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
//v1.SetX(1);
//v1.SetY(1);
//v1.SetZ(1);
Vector3 v1 = new Vector3(1,1,1);
//Console.WriteLine(v1.Length());
//使用属性
v1.MyIntProperty = 600;//对属性设置值
int temp = v1.MyIntProperty;//对属性取值
Console.WriteLine(temp);//这里的值是100
Console.ReadKey();
}
}
}
2.通过属性来访问字段
我们习惯上把字段设置为私有的,这样外界不能修改字段的值,然后我们可以通过定义属性来设置和取得字段中的值
private int age;
public int Age//习惯上属性大写,字段小写
{
set
{
if(value<0)return;
}
get
{
return age;
}
}
namespace _001_调试和错误处理
{
class Vector3
{
//我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
public Vector3()
{
Console.WriteLine("Vector3的构造函数被调用了");
}
//定义一个有参数的构造函数
public Vector3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
length = Length();
}
//编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
private float x, y, z,length;
//通过属性设置字段的值
public float X
{
get
{
return x;
}
set
{
x = value;
}
}
//为字段提供set方法,来设置字段的值
public void SetX(float x)
{
//如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
//我们可以通过this.x表示访问的是类的字段或者方法
this.x = x;
}
public void SetY(float y)
{
this.y = y;
}
public void SetZ(float z)
{
this.z = z;
}
public float Length()
{
return(float)Math.Sqrt(x*x+y*y+z*z);
}
//定义属性
public int MyIntProperty
{
set
{
Console.WriteLine("属性中set块被调用");//get和set可以只有其中一个
Console.WriteLine("在set块中访问value的值是:"+value);
}
//如果没有get块,就不能通过属性取值了
get
{
Console.WriteLine("属性中的get块被调用");
return 100;
}
}
}
}
namespace _001_调试和错误处理
{
class Program
{
static void Main(string[] args)
{
//Vector3 v1 = new Vector3();
//v1.x = 1;
//v1.y = 1;
//v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
//v1.SetX(1);
//v1.SetY(1);
//v1.SetZ(1);
Vector3 v1 = new Vector3(1,1,1);
//Console.WriteLine(v1.Length());
//使用属性
//v1.MyIntProperty = 600;//对属性设置值
//int temp = v1.MyIntProperty;//对属性取值
//Console.WriteLine(temp);//这里的值是100
//通过属性访问字段的值
v1.X = 100;
Console.WriteLine(v1.X);
Console.ReadKey();
}
}
}
3.设置属性的只读或者只写
private string name;
public string name
{
get
{
return name;
}
}
属性可以只提供一个set块或者get块
4.属性的访问修饰符
private string name
{
get
{
return name;
}
private set
{
name=value;
}
}
namespace _001_调试和错误处理
{
class Vector3
{
//我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
public Vector3()
{
Console.WriteLine("Vector3的构造函数被调用了");
}
//定义一个有参数的构造函数
public Vector3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
length = Length();
}
//编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
private float x, y, z,length;
private int age;
public int Age
{
set
{//通过set方法在设置值之前做一些校验的工作,属性的更多好处,需要在写代码过程中体会
if (value >= 0)
{
age = value;
}
}
}
//通过属性设置字段的值
public float X
{
get
{
return x;
}
//属性的访问修饰符private set
private set//如果在get或者set前面加上private,表示这个块只能在类内部调用
{
x = value;
}
}
//为字段提供set方法,来设置字段的值
public void SetX(float x)
{
//如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
//我们可以通过this.x表示访问的是类的字段或者方法
this.x = x;
}
public void SetY(float y)
{
this.y = y;
}
public void SetZ(float z)
{
this.z = z;
}
public float Length()
{
return(float)Math.Sqrt(x*x+y*y+z*z);
}
//定义属性
public int MyIntProperty
{
set
{
Console.WriteLine("属性中set块被调用");//get和set可以只有其中一个
Console.WriteLine("在set块中访问value的值是:"+value);
}
//如果没有get块,就不能通过属性取值了
get
{
Console.WriteLine("属性中的get块被调用");
return 100;
}
}
}
}
namespace _001_调试和错误处理
{
class Program
{
static void Main(string[] args)
{
//Vector3 v1 = new Vector3();
//v1.x = 1;
//v1.y = 1;
//v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
//v1.SetX(1);
//v1.SetY(1);
//v1.SetZ(1);
Vector3 v1 = new Vector3(1,1,1);
//Console.WriteLine(v1.Length());
//使用属性
//v1.MyIntProperty = 600;//对属性设置值
//int temp = v1.MyIntProperty;//对属性取值
//Console.WriteLine(temp);//这里的值是100
//v1.X = 100;因为加了private修饰符,这里就不能调用了
Console.WriteLine(v1.X);
Console.ReadKey();
}
}
}
5.自动实现的属性
public int Age{get;set;}
编译器会自动创建private int age属性
namespace _001_调试和错误处理
{
class Vector3
{
//我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
public Vector3()
{
Console.WriteLine("Vector3的构造函数被调用了");
}
//定义一个有参数的构造函数
public Vector3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
length = Length();
}
//编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
private float x, y, z,length;
private int age;
//private string name;
//public string Name
//{
// get
// {
// return name;
// }
// set
// {
// name = value;
// }
//}
//相当于上方的简写形式
public string Name { get; set; }//编译器会自动给我们提供一个字段,来存储name,
public int Age
{
set
{//通过set方法在设置值之前做一些校验的工作,属性的更多好处,需要在写代码过程中体会
if (value >= 0)
{
age = value;
}
}
}
//通过属性设置字段的值
public float X
{
get
{
return x;
}
//属性的访问修饰符private set
set//如果在get或者set前面加上private,表示这个块只能在类内部调用
{
x = value;
}
}
//为字段提供set方法,来设置字段的值
public void SetX(float x)
{
//如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
//我们可以通过this.x表示访问的是类的字段或者方法
this.x = x;
}
public void SetY(float y)
{
this.y = y;
}
public void SetZ(float z)
{
this.z = z;
}
public float Length()
{
return (float)Math.Sqrt(x * x + y * y + z * z);
}
//定义属性
public int MyIntProperty
{
set
{
Console.WriteLine("属性中set块被调用");//get和set可以只有其中一个
Console.WriteLine("在set块中访问value的值是:"+value);
}
//如果没有get块,就不能通过属性取值了
get
{
Console.WriteLine("属性中的get块被调用");
return 100;
}
}
}
}
namespace _001_调试和错误处理
{
class Program
{
static void Main(string[] args)
{
//Vector3 v1 = new Vector3();
//v1.x = 1;
//v1.y = 1;
//v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
//v1.SetX(1);
//v1.SetY(1);
//v1.SetZ(1);
Vector3 v1 = new Vector3(1,1,1);
//Console.WriteLine(v1.Length());
//使用属性
//v1.MyIntProperty = 600;//对属性设置值
//int temp = v1.MyIntProperty;//对属性取值
//Console.WriteLine(temp);//这里的值是100
//v1.X = 100;//因为加了private修饰符,这里就不能调用了
// Console.WriteLine(v1.X);
v1.Name = "siki";
Console.WriteLine(v1.Name);
Console.ReadKey();
}
}
}